• Edit 2017-03-20 • Updata 2017-03-20
很容易想到,一个进程可以处于两种状态:运行态和非运行态。在非运行态中,有的进程在等待某些事件完成(如:I/O设备)后才能执行,称为阻塞或等待态,有的进程运行条件都已经满足,只差 CPU 资源就可以运行,称为就绪态。因此我们引入三状态进程模型。
图1:三状态模型
从进程运行的周期来看,核心的状态是 运行,就绪,阻塞。另外还加入了新建和退出态。
注:抢占(运行态 → 就绪态):如果操作系统给某个进程赋予不同的优先级,假设A , B 两个进程,A优先级大于B,且B处于阻塞状态,当进程A运行时,B等待的事件发生了,则将B转为就绪态。由于B优先级大于A, OS将CPU资源分派给进程B,进程A变成就绪态,我们说进程B抢占了进程A。
可以观察到,操作系统从就绪态选择某个进程执行,再将其放入到阻塞态或就绪态(图2左),如此循环。只有当某个事件发生时,才将事件所对应的阻塞进程转换为就绪态,借接着又去执行循环(图2右)。
图2:模型工作框图
通过一个例子来理解:假设有进程A, 在程序运行时有I/O设备访问,访问完成后程序退出。注:调度时OS根据优先级选择进程执行,不是进程A刚从阻塞队列放置到就绪队列,就去执行它,中间有可能执行了很多其他进程。
图:进程A执行过程
我们可以用队列实现:由三状态进程模型,可以将就绪态和阻塞态用两个队列实现。如:图 a)单一的阻塞队列。
多队列的优势:当进程较多时,OS会频繁的遍历队列,例如当某个事件发生时,需要遍历阻塞队列所有的进程,将请求该事件的进程置为就绪态;当调度时,也需要遍历队列选择优先级最高的。因此可以使用多队列,提高运行速度。
图3:多阻塞队列,就绪队列也可以使用多队列。
声明:以上内容整理自 《操作系统精髓与设计原理(原书第6版)》 参考 。
来源: http://www.cnblogs.com/KaiQiang123/p/hkq_os_process_mid.html