HICSC
002 进程管理:进程的生命周期

前面说到,进程具有间断性。这就意味着,在进程的执行过程中,它的状态随时间在不停地变化和转换。而不同的操作系统,对于进程状态的定义也不尽相同,根据状态数量,大致分为:三态模型和五态模型。

三态模型

在这种模型下,进程有以下三种基本状态:

在操作系统中,处于就绪状态的进程可能有很多,通常将它们排成一个队列,称为就绪队列 ( Process Queue )

进程的三种基本状态以及各状态之间的转换如下图所示。

进程的三种基本状态及其转换

Ready → Running:处于就绪状态的进程,在调度程序为其分配处理机,该进程便可执行,它就由就绪状态变成运行状态。

Running → Blocked:而正在执行的进程,因为某些阻塞事件 ( 比如:请求I/O、申请缓冲空间、访问正被其它进程访问的临界资源等 ) 阻塞而无法继续执行,该进程将由运行状态变为阻塞状态。

Blocked → Ready:如果阻塞事件已经完成,那么处于阻塞状态的进程将变为就绪状态。

Running → Ready:运行中的进程因分配给它的时间片已完成而被暂停执行时,它便由运行状态回复到就绪状态。

挂起状态

不少系统中进程只有上述三种状态,但在另外一些系统中,又增加了一些新状态,最重要的就是挂起状态。注意:这并不是说,进程有一种状态叫作挂起状态,而是上述三种状态在收到挂起原语Suspend后,将处于静止状态,比如,就绪状态分为 静止就绪 ( Readys ) 活动就绪 ( Readya );相应地,阻塞状态就分为 静止阻塞 ( Blcokeds )活动阻塞 ( Blockeda );而运行状态肯定就还是只有运行状态。

s 即 static 静态,a 即 active 动态

那为何要引入挂起状态?

因为在三态模型中,没有办法主动将进程暂停。比如,有个进程在就绪队列中,在三态模型中,只要为其分配处理机,该进程便会执行,如果想要就绪队列中的进程处于静止状态不被调度,怎么办呢?同样地,在三态模型中,进程在运行过程中,出现阻塞事件时会被阻塞,这些阻塞事件的发生大概率是因为自身的原因,比如,程序的逻辑中需要去请求I/O,如果有另外的进程,比如父进程,想要暂停正在运行的进程,该怎么办呢?

显然,在三态模型下,是没有办法很好的解决这些问题的,所以,才有了挂起状态。

引入挂起状态可以解决很多实际问题,比如:

引入挂起状态后,进程的状态以及状态间的转换如下图所示。

具有挂起状态的进程状态及其转换图

Readya → Readys:进程处于未被挂起的就绪状态时,即处于活动就绪状态,当该进程接收到Suspend挂起原语后,即进入静止就绪状态,处于静止就绪状态的进程,不再被调度程序执行。

Readys → Readya:处于静止就绪状态的进程,使用激活原语Active激活后,重新转变为活动就绪状态。

Blockeda → Blockeds:进程处于违背挂起的阻塞状态时,即处于活动阻塞状态,当该进程接收到Suspend挂起原语时,即进入静止阻塞状态,处于该状态的进程在其所期待的事件出现后,将从静止阻塞变为静止就绪。

Blockeds → Blockeda:处于静止阻塞状态的进程,使用激活原语Active激活后,重新转变为活动阻塞状态。

五态模型

在实际的OS中,为了管理需要,进程还存在两种比较常见的状态,即 创建状态 ( New )终止状态 ( Terminated )

创建状态

创建一个进程一般分为两个步骤:

  1. 为新进程创建PCB,并填写必要的管理信息
  2. 把该进程转入Ready状态,并插入到就绪队列 ( Process Queue ) 中

当一个新进程被创建时,系统已为其创建PCB,填写了进程标志等信息,但由于该进程所必须的资源 (如主存) 还未分配,其创建工作尚未完成,进程还不能被调度运行,那么其所处的状态就是创建状态。

引入创建状态,是为了保证进程的调度必须在创建工作完成之后进行。同时,也增加了管理的灵活性,OS可以根据系统性能或主存容量,推迟将创建状态的进程提交到就绪队列。

处于创建状态的进程,获得其所必需的资源,以及完成PCB的初始化后,其状态便可由创建状态转入就绪状态。

终止状态

进程的终止也要通过两个步骤:

  1. 等待OS进程善后处理
  2. 清空PCB,并将PCB空间归还给系统

当一个进程出现以下几种状况并进入终止状态:

进入终止状态的进程便不能再被执行,但会在操作系统中保留一个记录,其中保存了状态码和一些计时统计数据,以供其它进程收集。一旦其它进程完成了对终止状态进程的信息提取,操作系统将删除该进程。

在三态模型上增加创建状态和终止状态后,进程状态间转换关系如下图所示。

进程的五种基本状态及转换图

增加挂起状态的五态模型如下图所示。

具有挂起状态的五态模型状态转换图

需要注意的一点是,处于创建状态的进程既可以转换为活动就绪状态,也可以进入静止就绪状态,主要的区别是:

New → Readya:在当前系统性能和内存容量均允许的情况下,进程成功创建,该进程即进入活动就绪状态。

New → Readys:考虑到系统当前资源状况和性能要求,没有分配给新建进程所需的资源,主要是内存,进程便进入静止就绪状态,其不再参与调度,此时进程创建工作尚未完成。

这里也隐含一层意识,当进程由静止就绪状态被激活时,需要判断进程是否完成创建,如果未完成,需要进行一系列进程创建的必要操作之后,才能进入活动就绪状态。

结语

在学习进程生命周期时,可以联想对比线程的生命周期。线程的生命周期与进程类似,其也具有间断性。大多数操作系统的线程都是使用三态模型,但不同的编程语言,对线程状态的定义又有所不同,比如在Java中,在三态模型的基础上,增加了 New 和 Wait 状态,而 Wait 状态又分为:Wait 和 Timed Wait,即一直等待和有限等待。

但万变不离其宗,不管编程语言的线程状态有多少种,都是在三态模型的基础上,为解决某些实际问题,扩展出来的。在学习时,只要抓住这一点,就不会迷茫。

Comments

Post a Message

人生在世,错别字在所难免,无需纠正。

提交评论