您的位置:首页 > 其它

操作系统-进程状态

2018-03-18 15:19 218 查看

进程的生命周期划分

进程创建

进程执行

进程等待

进程抢占

进程唤醒

进程结束

进程创建:

系统初始化

用户请求创建一个新的进程

正在运行的进程执行了创建进程的系统调用

进程执行

选择一个就绪的进程,让他占用处理机并开始执行

进程等待

请求并等待系统服务,无法马上完成。

启动某种操作,无法马上完成。

需要的数据还没有到达。

进程抢占

高优先级进程以及就绪

当前执行的时间片用完

进程唤醒

需要的资源被满足时

等待的时间以及发生

唤醒只能被别的进程或操作系统唤醒

进程结束

正常结束,结果正确

正常结束,结果不正确

异常终止

操作系统的基本职责是控制进程的执行,包括确定交替执行的方式和给进程分配资源。在设计控制进程的程序时,第一步就是描述进程所表现处的行为。

在《操作系统精髓与设计原理》中,大致将进程分为两种状态:运行态与非运行态。

操作系统创建一个进程时,它将该进程以未运行态加入系统,操作系统知道这个进程的存在,并正在等待执行机会,不时地,当前正在运行的进程会被中断,此时操作系统中的分派器部分会将选择一个新的进程投入运行,前一个进程从运行态转换为非运行态,后一个进程从非运行态转换为运行态。

由此可以得出操作系统在设计时的一些设计元素。必须用某种方法来追踪进程,也就是说必须要保存某些与进程相关的信息,即就是进程控制块。

那些处于非运行态的进程就需要处于某种数据结构中,等待执行时机。这种数据结构就是队列,队列中的每项都指向某个特定进程的指针,或队列可以由数据块构成的链表组成,每个数据块表示一个进程。

五状态模型

必要性:队列时“先进先出”表,对于可运行的进程,操作系统采用一种轮转的方式操作。如果存在一些处于非运行态但已就绪等待执行的进程,同时还存在一些另外处于阻塞态等待i/o操作结束的进程。因此,若使用单个队列,分派器不能只考虑选择队列中最老的进程,而应扫描这个列表,查找那些未被阻塞且在队列中时间最长的进程。

解决该问题的一种较好方法是将非运行态分成两个状态:就绪态和阻塞态。五状态如下:

运行态:进程正在执行。

就绪态:进程做好了准备,只要有机会就执行。

阻塞态:进程在某些事件发生前不能执行,如i/o操作完成。

新建态:刚刚创建的进程。操作系统还未把它加入可执行进程组,它通常是进程控制块已被创建但还未被加载到内存中的新进程。

退出态:操作系统从可执行进程组释放的进程,要么是自身停止,要么是因为某种原因被取消。

进程之间状态转换如下:



挂起状态模型

必要性:我们都知道每个要被执行的进程都要被加载至内存,因此阻塞队列的所有进程必须驻留在内存中。但是,处理机远快于i/o,当一个进程阻塞时,处理机可以移向另一个进程,但是处理机处理的速度远快于i/o,会出现内存中的进程都在等待i/o的现象。因此,处理机可能在大多数时间内都处于空闲状态。

解决方法之一是扩充内存来容纳更多的进程。显然不实际,就内存的价格来说就不是我们首先考虑的办法。

解决方法之二是交换。即把内存中某个进程的一部分或全部移到磁盘中。当内存中不存在就绪态的进程时,操作系统就把阻塞的进程换出到磁盘中的挂起队列。操作系统之后要么从挂起队列中取出另一个进程,要么接受一个新进程的请求,将他放入内存运行。

要使用这种交换模型,就要增加一个新的状态:挂起态。

但是所有已被挂起的进程都处于阻塞态,显然这时把阻塞的进程取回内存没有任何意义,因为它仍然为做好执行的准备。但是由于每个挂起的进程最初都阻塞于某个特定的事件上,因此发生该事件时,进程将不再阻塞而可以继续执行。

所以重新考虑设计方式,引入两个新挂起状态:

阻塞/挂起态

就绪/挂起态



挂起进程具有如下特点:

该进程不能立即执行。

该进程可能在也可能不在等待一个事件。若在等待一个事件,那么阻塞条件不依赖于挂起条件,阻塞事件的发生不会使进程立即执行。

为阻止该进程执行,可通过代理使其置于挂起态,代理可以是进程本身,也可以是父进程或操作系统。

除非代理显式的命令系统进行状态切换,否则该进程无法从这一状态转移。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: