七状态图操作系统

2017-04-22 19:15:31 qwe6112071 阅读数 19190

进程的状态和转换

三态模型

一个进程从创建而产生至撤销而消亡的整个生命周期,可以用一组状态加以刻划,根据三态模型,进程的生命周期可分为如下三种进程状态:
1. 运行态(running):占有处理器正在运行
2. 就绪态(ready):具备运行条件,等待系统分配处理器以便运行
3. 等待态(blocked):不具备运行条件,正在等待某个事件的完成

下面是三个状态的转换图:
这里写图片描述

运行状态的进程将由于出现等待事件而进入等待状态,当等待事件结束之后等待状态的进程将进入就绪状态,而处理器的调度策略又会引起运行状态和就绪状态之间的切换。

引起进程状态转换的具体原因如下:

  • 运行态—→等待态:等待使用资源;如等待外设传输;等待人工干预。
  • 等待态—→就绪态:资源得到满足;如外设传输结束;人工干预完成。
  • 运行态—→就绪态:运行时间片到;出现有更高优先权进程。
  • 就绪态—→运行态:CPU 空闲时选择一个就绪进程。

五态模型

在一个实际的系统里进程的状态及其转换比上节叙述的会复杂一些,例如引入专门的新
建态(new)和终止态(exit )
状态转换图如下所示:
这里写图片描述

建态对应于进程刚刚被创建的状态。创建一个进程要通过两个步骤,
1. 为一个新进程创建必要的管理信息,
2. 让该进程进入就绪态。此时进程将处于新建态,它并没有被提交执行,而是在等待操作系统完成创建进程的必要操作。需要注意的是,操作系统有时将根据系统性能或主存容量的限制推迟新建态进程的提交

类似地,进程的终止也要通过两个步骤,首先,是等待操作系统进行善后,然后,退出主存。当一个进
程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进
程所终结,它将进入终止态。进入终止态的进程以后不再执行,但依然临时保留在操作系统中等待善后 。
一旦其他进程完成了对终止态进程的信息抽取之后,操作系统将删除该进程。

引起进程状态转换的具体原因如下:

  • NULL—→新建态:执行一个程序,创建一个子进程。
  • 新建态—→就绪态:当操作系统完成了进程创建的必要操作,并且当前系统的性能和虚拟内存的容量均允许。
  • 运行态—→终止态:当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结。
  • 终止态—→NULL:完成善后操作。
  • 就绪态—→终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。
  • 等待态—→终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。

七态模型

进程的挂起

到目前为止,我们或多或少总是假设所有的进程都在内存中。事实上,可能出现这样一些情况,例如由于进程的不断创建,系统的资源已经不能满足进程运行的要求,这个时候就必须把某些进程挂起(suspend),对换到磁盘镜像区中,暂时不参与进程调度,起到平滑系统操作负荷的目的。
引起进程挂起的原因是多样的,主要有:
1. 系统中的进程均处于等待状态,处理器空闲,此时需要把一些阻塞进程对换出去,以腾出足够的内存装入就绪进程运行。
2. 进程竞争资源,导致系统资源不足,负荷过重,此时需要挂起部分进程以调整系统负荷 ,保证系统的实时性或让系统正常运行。
3. 把一些定期执行的进程(如审计程序、监控程序、记账程序)对换出去,以减轻系统负荷。
4. 用户要求挂起自己的进程,以便根据中间执行情况和中间结果进行某些调试、检查和改正。
5. 父进程要求挂起自己的后代进程,以进行某些检查和改正。
6. 操作系统需要挂起某些进程,检查运行中资源使用情况,以改善系统性能;或当系统出现故障或某些功能受到破坏时,需要挂起某些进程以排除故障。

七态模型描述

下面是具有七态模型的进程状态及其转换:
这里写图片描述

在此类系统中,进程增加了两个新状态:

  • 挂起就绪态(ready,suspend)
    挂起就绪态表明了进程具备运行条件但目前在二级存储器中,只有当它被对换到主存才能被调度执行
  • 挂起等待态(blocked,suspend)挂起等待态则表明了进程正在等待某一个事件且在二级存储器中。

引起进程状态转换的具体原因如下:

  • 等待态—→挂起等待态:如果当前不存在就绪进程,那么至少有一个等待态进程将被对换出去成为挂起等待态;操作系统根据当前资源状况和性能要求,可以决定把等待态进程对换出去成为挂起等待态。
  • 挂起等待态—→挂起就绪态:引起进程等待的事件发生之后,相应的挂起等待态进程将转换为挂起就绪态。
  • 挂起就绪态—→就绪态:当内存中没有就绪态进程,或者挂起就绪态进程具有比就绪态进程更高的优先级,系统将把挂起就绪态进程转换成就绪态。
  • 就绪态—→挂起就绪态:操作系统根据当前资源状况和性能要求,也可以决定把就绪态进程对换出去成为挂起就绪态。
  • 挂起等待态—→等待态:当一个进程等待一个事件时,原则上不需要把它调入内存。但是在下面一种情况下,这一状态变化是可能的。当一个进程退出后,主存已经有了一大块自由空间,而某个挂起等待态进程具有较高的优先级并且操作系统已经得知导致它阻塞的事件即将结束,此时便发生了这一状态变化。
  • 运行态—→挂起就绪态:当一个具有较高优先级的挂起等待态进程的等待事件结束后,它需要抢占 CPU,,而此时主存空间不够,从而可能导致正在运行的进程转化为挂起就绪态。另外处于运行态的进程也可以自己挂起自己。
  • 新建态—→挂起就绪态:考虑到系统当前资源状况和性能要求,可以决定新建的进程将被对换出去成为挂起就绪态。

可以把一个挂起进程等同于不在主存的进程,因此挂起的进程将不参与进程调度直到它
们被对换进主存。一个挂起进程具有如下特征:
1. 该进程不能立即被执行。
2. 挂起进程可能会等待一个事件,但所等待的事件是独立于挂起条件的,事件结束并不能导致进程具备执行条件。
3. 进程进入挂起状态是由于操作系统、父进程或进程本身阻止它的运行。
4. 结束进程挂起状态的命令只能通过操作系统或父进程发出。

2019-02-23 13:22:13 qq_32623363 阅读数 1838

操作系统中的进程有三个基本状态,分别是:就绪、运行、阻塞

就绪:万事俱备,只欠CPU
运行:正在执行
阻塞:进程因为等待某些事件的发生而处于等待状态

这三个状态合起来,就是操作系统的“三状态进程模型”,如下图:
在这里插入图片描述

然后我们可能会疑惑,进程难道天生就是就绪态吗?而且进程执行完后又是什么态呢?
实际上,进程还具有创建态和终止态。
创建态:系统已经为该进程分配PID和PCB,但是还没有给进程提供运行所需要的资源(因为资源有限);
终止态:进程已经执行完毕或者被强制停止了(比如windows中的进程管理器直接关掉某个进程),这时操作系统将执行一些数据统计工作,统计一下该进程执行过程中所消耗的各种资源,同时还会进行资源的回收工作。
加入了上面的两个状态,那么我们就可以得到“五状态进程模型”,如下图:
在这里插入图片描述

而五状态进程模型的状态模型如下,可以看到有多个等待队列,这是因为操作系统会将进程等待的事件的不同而将他们分成不同的队列。而且实际上就绪队列往往也不止一个(比如在多级反馈队列调度算法中)
在这里插入图片描述

本来大家或许以为到此就结束了,但是实际上并没有。试想,如果操作系统中的进程实在太多了,都堆在内存里岂不是会造成内存的严重不足?那怎么办呢?

这时进程的另外一个状态就出场了:挂起状态
挂起状态是指当操作系统中运行的进程实在太多了的时候,操作系统会将一部分进程的所有状态保存到磁盘上,以节约内存空间。
而挂起态又分就绪挂起和阻塞挂起。
就绪挂起就是指就绪的进程被挂起了,阻塞挂起当然就是被阻塞的进程被挂起咯。

下图就是引入了就绪挂起和阻塞挂起后的“七状态模型”
在这里插入图片描述
阻塞挂起的进程在其所等待的事件发生了以后可以自动转为就绪挂起。
正在运行的进程如果执行完后也是有可能直接被转为就绪挂起的。

参考资料:陈向群老师的操作系统课程

2016-06-15 13:56:52 fanxiaobin577328725 阅读数 47613

一、概念

状态图和活动图是状态机的两种表现形式。利用状态机可以精确地描述对象的行为。

从对象的初始状态起,开始响应事件并执行某些动作,这些事件引起状态的转换;对象在新状态下又开始响应事件和执行动作,如此连续进行直到终结状态。

二、状态图

状态图(State Diagram) =状态(State) + 迁移(Transition)

  • 一个状态图描述一个状态机。
  • 状态图表现从一个状态到另一个状态的控制流。

2.1 状态图的语法

  • 除了状态中的初始状态(实心圆)和终止状态(牛眼形状),其它状态用一个圆角矩形表示
  • 转换表示状态间可能的路径,用箭头表示
  • 事件/动作写在由它们触发引起的转换上

2.2 状态

  • 状态一般是给定类对象中的一组属性值,在其所在的上下文中应该唯一,但可以匿名。
  • 在对系统建模时,我们可以只关心那些明显影响对象行为的属性以及由他们表达的对象状态,而不用理睬那些于对象行为无关的状态。

表示方式:状态由一个带圆角的矩形表示。

应用标签标示状态的内部活动。

语法:标签/活动表达式

UML提供的标签:

  1. entry:当进入一个状态的时候被自动触发,该活动在状态中其它任何活动之前被自动触发。
  2. do:当状态处于激活时执行do活动,do活动在进入活动之后执行,并且一直运行到它本身完成为止。
  3. exit:当离开一个状态的时候被自动触发,该活动在该状态结束之前、所有其它活动都完成后被触发。

  状态可以嵌套状态图,此时状态称为组成状态,否则为简单状态。
  入口事件表示一个入口的动作序列,它在进入状态时执行。入口事件的动作是原子的,并且先于人和内部活动或转换。
  出口事件表示一个出口的动作序列,它在退出状态时执行。出口事件也是原子的,它跟在所有的内部活动之后,但是先于所有的出口转换。

1. 简单状态(Simple State)

2. 复合状态(Composite State)

复合状态可以有多组状态图,每组用虚线分割开来。

  • 可以是通过“或”关系分解为互相排斥的顺序子状态
  • 可以是使用“与”关系分解为并发子状态

  • 如果一个组成状态的子状态对应的对象在其生命期内的任何时刻都只能处于一个子状态,即多个子状态之间是互斥的,不能同时存在,这种子状态称为顺序子状态。

  • 并发子状态在同一层次给出两个或多个顺序子状态,任何时刻对象的状态是其每个并发段中任取一个状态的组合。

  • 并发状态图由两个或多个并发子图组成,每个子图叫作一个并发段。在任何时刻,一个对象的状态是每个并发段中各取一个状态的组合。当对象离开并发段后,它又恢复成一个单一的状态。

  • 如果并发子图中的一个状态首先完成,它将首先转入下一个状态。但是,如果异常事件发生,则进入唯一的异常状态。

  • 当一个对象有几个相互独立的行为时,并发状态图可以方便地刻画它的行为。但一个对象的并发行为不应太多;如果太多,应将其状态图分细。

并发区域(Concurrent Regions)

  状态图可以分为区域,而区域又包括退出或者当前执行的子状态。说明组合状态在某一时刻可以同时达到多个子状态。如下图刹车系统,同时进入前刹车【Applying Front Brakes】状态和后刹车【Applying Rear Brakes】状态。

3. 初始状态(Initial State)

  • 初始状态代表状态图的起始位置,只能作为转换的源
  • 初始状态在一个状态图中只允许有一个,而不能作为转换的目标。,它用一个实心的圆表示。

4. 终止状态(Final State)

  • 终止状态是模型元素的最后状态,是一个状态图的终止点。
  • 终止状态只能作为转换的目标,而不能作为转换的源。
  • 终止状态在一个状态图中可以有多个,它用一个套有一个实心圆的空心圆表示。

5. 结合状态(Junction State)—-《暂时未理解》

将两个转换连接成一次就可以完成的转换。

6. 历史状态(History State)

保存组成状态中先前被激活的状态

  • 历史状态代表上次离开组成状态时的最后一个活动子状态,它用一个包含字母“H”的小圆圈表示。
  • 每当转换到组成状态的历史状态时,对象便恢复到上次离开该组成状态时的最后一个活动子状态,并执行入口动作。

  历史状态是一个伪状态(Pseudostate),其目的是记住从组合状态中退出时所处的子状态,当再次进入组合状态,可直接进入这个子状态,而不是再次从组合状态的初态开始。

在上图的状态图中,正常的状态顺序是:【Washing】→【Rinsing】→【Spinning】。
如果是从状态【Rinsing】突然停电(Power Cut)退出,,洗衣机停止工作进入状态【Power Off】,当电力恢复时直接进入状态【Running】。

7.退出节点(Exit Point)

2.3 判定

判定在状态图中的位置:工作流在此处按监护条件的取值而发生分支。
表示方式:判定用空心小菱形表示。

2.4 迁移/转移(Transitions)

  转移(Transitions)是两个状态之间的一种关系,表示对象将在源状态(Source State)中执行一定的动作,并在某个特定事件发生而且某个特定的警界条件满足时进入目标状态(Target State)

事件标记(Trigger):是转移的诱因,可以是一个信号,事件、条件变化(a change in some condition)和时间表达式。

警界条件(Guard Condition):当警界条件满足时,事件才会引发转移(Transition)。

结果(Effect):对象状态转移后的结果。

2.5 动作(State Actions)

  动作(Actions)是一个可执行的原子操作,也就是说动作是不可中断的,其执行时间是可忽略不计的。UML提供的三中标签《参考上面》

  在上例中,对象状态转移后的结果显示在转移线上,如果目标状态有许多转移,而且每个转移有相同的结果,这时把转移后的结果(Effect)展示在目标状态中(Target State)更好一些,可以定义进入动作(Entry Action )和退出动作(Exit Action),如下图

三、活动图

  活动图(Activity Diagram) = 活动(Activity) + 动作(Action) + 活动边(Activity Edge) + 活动节点(Activity Node)

  • 活动图是状态机的另一种表现形式。用于为一个对象在其生命周期中的行为建模。
  • 活动图是一种描述系统动态行为的图,它用于描述活动的顺序,展现从一个活动到另一个活动的控制流。

3.1 动作状态

  • 动作状态是指执行原子的、不可中断的动作,并在此动作完成后通过转换转向另一个动作。
  • 动作状态使用平滑的圆角矩形表示,动作状态所表示的动作写在圆角矩形内部。

动作状态的特点:

  1. 动作状态是原子的,它是构造活动图的最小单位,已经无法分解为更小的部分。
  2. 动作状态是不可中断的状态,它一旦开始运行就不能中断,一直运行到结束。
  3. 动作状态是瞬时的行为,它所占用的处理事件极短,有时甚至可以忽略。
  4. 动作状态和状态图中的状态不同,它不能有入口动作和出口动作,更不能有内部转移。

3.2 活动状态

  • 活动状态用于表达状态机中的一个非原子的运行。
  • 活动状态的表示图标也是平滑的圆角矩形,并可以在图标中给出入口动作和出口动作等信息。


活动状态的特点:

  1. 活动状态可以分解成其他子活动或动作状态,由于它是一组动作或操作的组合,所以可以被中断。
  2. 活动状态的内部活动可以用另一个活动图来表示。
  3. 和动作状态不同,活动状态可以有入口动作和出口动作,也可以有内部转移。
  4. 动作状态是活动状态的一个特例,如果某个活动状态只包括一个动作,那么它就是一个动作状态。

3.3 动作流

  • 所有动作状态之间的转换流称之为动作流,相当于状态图中的转换。
  • 与状态图的转换相同,活动图的转换也用带箭头的直线表示,箭头的方向指向转入的方向。
  • 动作流可以是无条件的,也可以是有条件的。无条件的动作流即是活动图中的普通转换(完成转换,内部转换);有条件的动作流通过分支与合并来描述。

3.4 分支与合并

  • 条件行为用分支和合并表达。
  • 在活动图中分支与合并用空心小菱形表示。
  • 一个分支有一个入转换和两个带条件的出转换,出转换的条件应当是互斥的,这样可以保证只有一条出转换能够被触发。
  • 一个合并有两个带条件的入转换和一个出转换,合并表示从对应的分支开始的条件行为的结束。

3.5 分叉与汇合(并发与同步)

  1. 分叉用于将动作流分为两个或者多个并发运行的分支,而汇合则用于同步这些并发分支,以达到共同完成一项事务的目的。
  2. 分叉可以用来描述并发线程,每个分叉可以有一个输入转换和两个或多个输出转换,每个转换都可以是独立的控制流。
  3. 汇合代表两个或多个并发控制流同步发生,当所有的控制流都达到汇合点后,控制才能继续往下进行。每个汇合可以有两个或多个输入转换和一个输出转换。
  4. 分叉和汇合都使用加粗的水平线段表示。

3.6 泳道

  1. 泳道将活动图中的活动化分为若干组,并把每一组指定给负责这组活动的业务组织即对象。
  2. 泳道区分了负责活动的对象,明确地表示了哪些活动是由哪些对象进行的。
  3. 每个活动只能明确地属于一个泳道。
  4. 泳道用垂直实线绘出,垂直线分隔的区域就是泳道。在泳道上方可以给出泳道的名字或对象(对象类)的名字,该对象(对象类)负责泳道内的全部活动。
  5. 泳道没有顺序,不同泳道中的活动既可以顺序进行也可以并发进行,动作流和对象流允许穿越分隔线。

3.7 对象流

  对象流是动作状态或者活动状态与对象之间的依赖关系,表示动作使用对象或者动作对对象的影响。

对象流中的对象特点:

  1. 一个对象可以由多个动作操纵。
  2. 一个动作输出的对象可以作为另一个动作输入的对象。
  3. 在活动图中,同一个对象可以多次出现,它的每一次出现表明该对象正处于对象生存期的不同时间点。

对象流用带有箭头的虚线表示。如果箭头从动作状态出发指向对象,则表示动作对对象施加了一定的影响。如果箭头从对象指向动作状态,则表示该动作使用对象。

3.8 活动的分解

  1. 一个活动可以分为若干个动作或子活动,这些动作和子活动本身可以组成一个活动图。
  2. 一个包含子活动的活动和嵌套了子状态的组合状态类似,概念上也相对统一。
  3. 一个不含内嵌活动或动作的活动称之为简单活动;一个嵌套了若干活动或动作的活动称之为组合活动,组合活动有自己的名字和相应的子活动图。

四、活动图与状态图的区别

  1. 活动图着重表现从一个活动到另一个活动的控制流,是内部处理驱动的流程。一般是一个结束后,自动转入下一个活动。
  2. 状态图着重描述从一个状态到另一个状态的流程,主要有外部事件的参与。
  3. 活动图是一种特殊的状态图,如果在一个状态图中的大多数状态是表示操作的活动,而转移是由状态中动作的完成来触发,即全部或绝大多数的事件是内部产生的动作完成的,这就是活动图。

五、活动图与流程图的区别

  1. 流程图着重描述处理过程,它的主要控制结构是顺序、分支和循环,各个处理之间有严格的顺序和时间关系;而活动图描述的则是对象活动的顺序关系所遵循的规则,它着重表现的是系统的行为,而非系统的处理过程。
  2. 活动图能够表示并发活动的情形,此时活动图给了我们选择做事顺序的自由,而流程图对活动顺序的描述固定。
  3. 活动图是面向对象的,流程图是面向过程的。

六、活动图应用

活动图的优缺点:

  • 优点:最适合支持并行行为,而且也是支持多线程编程的有力工具。
  • 缺点:很难清楚地描述动作与对象之间的关系。虽然在活动旁标出对象名或者采用泳道技术可以定义这种关系,但仍然没有交互图简单直接。

因此,像大多数建模技术一样,最好把活动图与其他技术结合使用。

6.1 何时可使用活动图

  1. 分析用例。能直观清晰地分析用例,了解应当采取哪些动作以及这些动作之间的依赖关系。一张完整的活动图是所有用例的集成图。
  2. 理解牵涉多个用例的工作流。在难于区分不同用例而对整个系统的工作过程又十分清楚时,可以先构造活动图,然后用切片技术派生用例图。
  3. 处理多线程应用。采用“分层抽象,逐步细化”的原则描述多线程。

6.2 何时不应使用活动图

  1. 显示对象间的合作。用交互图显示对象间的合作更简单直观。
  2. 显示对象在生命周期内的运转情况。活动图可以表示活动的激活条件,但不能表示一个对象的状态变换条件。因此,当要描述一个对象整个生命周期的运转情况时,应当使用状态图。

6.3 建模的一般步骤

  1. 识别要对其工作流描述的类或对象。
  2. 确定工作流的初始状态和终止状态,明确工作流的边界。
  3. 对动作状态或活动状态建模。
  4. 对动作流建模。
  5. 对对象流建模。
  6. 对建立的模型进行精化和细化。

2019-03-23 11:30:01 sofia_fhx 阅读数 10923

一、进程状态

1.创建状态
进程由创建而产生。创建进程是一个非常复杂的过程,一般需要通过多个步骤才能完成:如首先由进程申请一个空白的进程控制块(PCB),并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后,把该进程转入就绪状态并插入到就绪队列中。

2.就绪状态
这是指进程已经准备好运行的状态,即进程已分配到除CPU以外所有的必要资源后,只要再获得CPU,便可立即执行。如果系统中有许多处于就绪状态的进程,通常将它们按照一定的策略排成一个队列,该队列称为就绪队列。有执行资格,没有执行权的进程。

3.运行状态
这里指进程已经获取CPU,其进程处于正在执行的状态。对任何一个时刻而言,在单处理机的系统中,只有一个进程处于执行状态而在多处理机系统中,有多个进程处于执行状态。既有执行资格,又有执行权的进程。

4.阻塞状态
这里是指正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态,即进程执行受到阻塞。此时引起进程调度,操作系统把处理机分配给另外一个就绪的进程,而让受阻的进程处于暂停的状态,一般将这个暂停状态称为阻塞状态

5.终止状态
进程的终止也要通过两个步骤:首先,是等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还给系统。当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。进入终止态的进程以后不能在再执行,但是操作系统中任然保留了一个记录,其中保存状态码和一些计时统计数据,供其他进程进行收集。一旦其他进程完成了对其信息的提取之后,操作系统将删除其进程,即将其PCB清零,并将该空白的PCB返回给系统。

  1. 为什么要分开就绪和阻塞状态

    答:因为就绪态只需要等待处理机,而阻塞态可能在等待输入输出,即使分配给处理机也是徒劳,所以两状态图不妥。对于调度进程,只需要等待就绪队列里的进程,因为阻塞状态可以转换到就绪队列里去。

  2. 进程五状态

在这里插入图片描述

  1. 新状态:进程已经创建,但未被OS接纳为可执行进程。(还没有申请到相应的资源)。

  2. 就绪态:进程做好了准备,准备执行(只等待处理机)。

  3. 执行状态:该进程正在执行(单处理机,某一时刻仅一个进程占用处理机)。

  4. 阻塞状态:等待某事件发生才能执行,如等待I/O完成。

  5. 终止状态.

  1. 问题:多个进程竞争内存资源

l 内存资源紧张

l 无就绪队列,处理机空闲:I/O速度比处理机速度慢的多,可能出现全部进程阻塞等待I/O。

解决方法

l 交换技术:换出一部分暂时不能运行的进程(阻塞进程)到外存(只换出程序和数据,PCB不换出去),以腾出内存空间,可以调用新进程来执行。

l 虚拟存储技术:每个进程只能装入一部分程序和数据

  1.  挂起:进程被交换到外存,状态变为挂起状态
    

4.1 进程挂起的原因(p91)

l 进程全部阻塞,处理机空闲。

l 系统负荷过重,内存空间紧张。(让其他进程先执行完)

l 操作系统的需要。操作系统可能需要挂起后台进程或一些服务进程,或者某些可能导致故障的进程。

l 终端用户请求。

l 父进程的需求。

4.2 挂起进程的特征

l 不能立即执行

l 可能是等待某事件发生,若是,则阻塞条件独立于挂起条件,即使阻塞事件发生,该进程也不能执行。

n 阻塞和挂起没有联系。

n 如果A进程现在要求输入数据,此时A进程属于阻塞状态,在选择挂起进程的时候,可能先选择阻塞进程(A进程),此时A进程挂起,正在输入数据,输入到内存缓冲区内。当数据输完了,向处理机发送命令数据已经输入完成,阻塞事件解除,但实际上还是挂起,所以仍是挂起态。

l 使之挂起的进程为:自身、父进程、OS。

l 只有挂起它的进程才能使之由挂起状态转换为其他状态。

4.3 阻塞与挂起

l 进程是否等待时间:阻塞与否。

l 进程是否被换出内存:挂起与否。

4.4 四种状态组合

l 就绪:进程在内存,准备执行。

l 阻塞:进程在内存,等待事件。

l 就绪/挂起:进程在外存,只要调入内存即可执行。

l 阻塞/挂起:进程在外存,等待事件。

4.5 处理机可调度执行的进程有两种

l 新创建的进程

l 或换入一个以前挂起的进程

通常为避免增加系统负载,系统会换入一个以前挂起的进程执行。

4.6 具有挂起状态的进程状态转换

在这里插入图片描述

l 阻塞 → 阻塞/挂起:OS通常将阻塞进程换出,以腾出内存空间

l 阻塞/挂起→ 就绪/挂起:当阻塞/挂起进程等待的事件发生时,可以将其转换为就绪/挂起。

l 就绪/挂起→ 就绪:OS需要调入一个进程执行。

l 就绪 → 就绪/挂起:一般,OS挂起阻塞进程。但是有时也会挂起就绪进程,释放足够的内存空间。

l 新 → 就绪/挂起(新→ 就绪):新进程创建后,可以插入到就绪队列或就绪,挂起队列,若无足够的内存分配给新进程,则需要新→ 就绪/挂起。

2018-05-07 20:43:06 weixin_39294633 阅读数 13240
1 Linux中进程的七种状态
(1)R运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里;
(2)S睡眠状态(sleeping):进程在等待事件完成;(浅度睡眠,可以被唤醒)
(3)D磁盘睡眠状态(Disk sleep):不可中断睡眠(深度睡眠,不可以被唤醒,通常在磁盘写入时发生)
(4)T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程,可以发送SIGCONT信号让进程继续运行
(5)X死亡状态(dead):该状态是返回状态,在任务列表中看不到;
(6)Z僵尸状态(zombie):子进程退出,父进程还在运行,但是父进程没有读到子进程的退出状态,子进程进入僵尸状态;
(7)t追踪停止状态(trancing stop)

2 R运行状态
  当我们让一个程序在运行中(比如:建立一个死循环,输出一条语句),那么该进程一定是R状态
3 S睡眠状态
  显然,当我们让一个程序执行sleep代码,该进程此时一定是S状态
僵尸状态
僵尸状态是指:当子进程退出,并且父进程没有读到子进程的退出码,子进程的状态会变为僵尸状态(Z)。通常来说就是,子进程退出,父进程还在运行,但父进程没有读取子进程的状态,子进程会变为僵尸态。

我们先简单建立一个僵尸进程:让子进程sleep后直接exit,父进程一直在循环中。
1 #include <stdio.h>
2 #include <unistd.h> 
3 #include <stdlib.h>
4 #include <sys/types.h>
5
6 int main()
7 {
8     pid_t id = fork();
9     if(id == 0)//child
10     {
11         printf("child do something... ,pid:%d,ppid:%d\n",getpid(),getppid());
12         sleep(10);
13         exit(1);//退出该进程
14     }
15
16     else if(id > 0)//father
17     {
18         while(1)
19         {
20             printf("father do something... ,pid:%d,ppid:%d\n",getpid(),getppid());
21             sleep(1);
22         }
23     }
24
25     else
26     {
27         perror("fork");
28     }
29      return 0;
30 }
在运行中,查看进程状态:
僵尸进程的危害:  
1 上面说到僵尸进程是由于父进程没有读取到子进程的退出信息而产生的,那么我们是不是就可以理解为父进程一直以为处于僵尸状态的子进程是没有退出的。而进程是需要维护的,僵尸进程就会一直需要PCB对其进行维护
浪费内存资源。如果僵尸进程一直没有退出,就会一直占用这块内存,就会导致内存资源的浪费;
内存泄漏僵尸进程一直占用资源,但是却不使用,就可能会导致内存泄漏。

5 孤儿进程
孤儿进程是指:父进程先退出,子进程变为“孤儿进程”
父进程先退出,子进程后退出,由于父进程已经退出读取不到子进程的退出信息,子进程变为Z(僵尸)状态,随后子进程被1号进程Init“领养”,即子进程的父进程变为1号进程。

我们先简单建立一个孤儿进程:让子进程一直循环,父进程在sleep3秒后退出。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5
6 int main()
7 {
8
9     pid_t id = fork();
10     if(id == 0)//child
11     {
12         while(1)
13         {
14             printf("child do something... ,pid:%d,ppid:%d\n",getpid(),getppid());
15             sleep(1);
16         }
17     }
18
19     else if(id > 0)//father
20     {
21         printf("father do something... ,pid:%d,ppid:%d\n",getpid(),getppid());
22         sleep(3);
23         exit(1);
24     }
25
26     else
27     {
28         perror("fork");
29     }
30      return 0;

在运行中,查看进程的状态: