您的位置:首页 > 其它

操作系统精髓与设计原理(原书第6版)——学习笔记(12)

2017-04-22 00:00 615 查看


3.2.3 五状态模型

如果所有进程都做好了执行准备,则图3.5b所给出的排队规则是有效的。队列是“先进先出”(FIFO)的表,对于可运行的进程处理器以一种轮转方式操作(依次给队列中的每个进程一定的执行时间,然后进程返回队列,阻塞情况除外)。但是,即使对前面描述的简单例子,这个实现都是不合适的:存在着一些处于非运行状态但已经就绪等待执行的进程,而同时存在的另外的一些处于阻塞状态等待I/O操作结束的进程。因此,如果使用单个队列,调度器不能只考虑选择队列中最老的进程,相反,它应该扫描这个列表,查找那些未被阻塞且在队列中时间最长的进程。

解决这种情况的一种比较自然的方法是将非运行状态分成两个状态:就绪(ready)和阻塞(blocked),如图3.6所示。新图中的5种状态如下:



运行态:该进程正在执行。

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

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

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

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

新建态对应于刚刚定义的进程。例如,如果一个新用户试图登录到分时系统中,或者一个新的批作业呗提交执行,那么操作系统可以分两步定义新进程。首先,操作系统执行一些必需的辅助工作,将标识符关联到进程,分配和创建管理进程所需要的所有表。此时,进程处于新建状态,这意味着操作系统已经执行了创建进程的必需动作,但还没有执行进程。例如操作系统可能基于性能或内存局限性的原因,限制系统中的进程数量。当进程处于新建态时,操作系统所需要的关于该进程的信息保存在内存中的进程表中,但进程自身还未进入内存,就是即将执行的程序代码不在内存中,也没有为与这个程序相关的数据分配空间。当进程处于新建态时,程序保留在外存中,通常是磁盘中。

进程退出系统也分两步。首先,当进程到达一个自然结束点时,由于出现不可恢复的错误而取消时,或当具有相应权限的另一个进程取消该进程时,进程被终止;终止使进程转换到退出态,此时,进程不在被执行,与作业相关的表和其他信息临时被操作系统保留起来,这给辅助程序或支持程序提供所需信息的时间。一个实用程序为了分析性能和利用率,可能需要提取进程的历史信息,一旦这些程序提取了所需的信息,操作系统就不在需要保留任何与该进程相关的数据,该进程将从系统中删除。

图3.6显示了导致进程状态转换的事件类型。可能的转换如下:

-----> 新建:创建执行一个程序的新进程。这个事件在表3.1中列出的原因都会发生。

新建 -----> 就绪:操作系统准备好再接纳一个进程时,把一个进程从新建态转换到就绪态。大多数系统基于现有的进程数或分配给现有进程的虚拟内存数量设置一些限制,以确保不会因为活跃进程的数量过多而导致系统的性能下降。

就绪 ---->运行:这转换最常见的原因是,正在运行的进程达到了“允许不中断执行”的最大时间段;实际上所有多道程序操作系统都实行了这类时间限定。这类转换还有其他原因,例如操作系统给不同的进程分配不同的优先级,但这不是在所有系统中都实现了。假设,进程A在一个给定的优先级运行,且具有更高优先级的进程B正处于阻塞态。如果操作系统知道进程B等待的事件已经发生,则将B 转换到就绪态,然后因为优先级的原因中断进程A的执行,将处理器分派给进程B,我们说操作系统抢占了进程A。最后一种情况是,进程自愿释放对处理器的控制,例如一个周期性地进行记账和维护的后台进程。

运行--> 阻塞:如果进程请求它必须等待的某些事件,则进入阻塞态。对操作系统的请求通常以系统服务调用的形式发出,也就是说,正在运行的程序请求调用操作系统中一部分代码所发生的过程。当进程相互通信,一个进程等待另一个进程提供输入时,或者等待来自另一个进程的信息时,都可能被阻塞。

阻塞 ---> 就绪:当所等待的事件发生时,处于阻塞态的进程转换到就绪态。

就绪---> 退出:为了清楚起见,状态图中没有表示这种转换。在某些系统中,父进程可以在任何时候终止一个子进程。如果一个父进程终止,与该父进程相关的所有子进程都将被终止。

阻塞--> 退出:前面一项提供了注释。

图3.7显示了进程在状态间的转换,图3.8a给出了可能实现的排队规则,有两个队列:就绪队列和阻塞队列。进入系统的每个进程被放置在就绪队列中,当操作系统选择另一个进程运行时,将从就绪队列中选择。对于没有优先级的方案,这可以是一个简单的先进先出队列。当一个正在运行的进程被移出处理器时,它根据情况或者被终止,或者被放置在就绪或阻塞队列中。最后,当一个事件发生是,所有位于阻塞队列中等待这个事件的进程都被转换到就绪队列中。



在大型操作系统中,队列中可能有几百甚至几千个进程,因此,拥有多个队列将会很有效,一个事件可以对应一个队列。那么,当事件发生时,相应对垒中的所有进程都转换到就绪态(图3.8b)。

还有一种改进,如果按照优先级方案分派进程,维护多个就绪对了(每个优先级一个队列)将会带来很多的便利。操作系统可以很容易的确定哪个就绪进程具有最高的优先级且等待时间最长。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: