本篇文章想简单谈谈进程状态模型的演变.
进程
进程由程序代码, 相关数据集与进程控制块(Process control block, 简称PCB)所构成. 当处理器开始执行这段代码时, 我们将执行的实体称为进程, 即计算机中已运行的程序.
与进程相关的一些控制信息都保存在进程控制块中, 进程控制块是操作系统支持多进程的关键. 进程控制块中的状态字段用于记录进程目前所处的状态.
进程派生即在一个进程中创建一个新进程, 原先的进程为父进程, 新进程为子进程.
两状态进程模型
两状态进程模型认为某个时刻, 一个进程要么是”运行”状态, 要么就是”非运行”状态.
进程创建后为”非运行”状态, 获得CPU调度后转变为”运行”状态, 失去调度则转变为”非运行”状态, 周而复始, 直到程序执行完毕, 释放所占用资源.
二状态模型非常简洁, 实际上由于处理器同时只能执行一个进程, 而进程常常会等待I/O发生, 此时处理器是空闲的, 为了尽可能利用处理器, 由此衍生出五状态模型.
五状态进程模型
除了新增”新建”和”结束”两状态, 还增加了”阻塞”状态.
"运行"至"阻塞"状态
处理器执行的进程在等待I/O时, 会从”运行”状态置为”阻塞”状态, 此时处理器会从”就绪”状态的进程中选择一个执行.
"阻塞"至"就绪"状态
等到I/O事件发生后, 进程才从”阻塞”状态置为”就绪”状态, 并在就绪队列中等待被处理器再次调度执行.
"新建"至"就绪"状态
"新建"状态时, 仅仅创建了PCB的信息. "新建"到"就绪"需要经过加载, 即为程序在内存中开辟相应空间.
“运行”至”就绪”状态
状态转变是由于时间片的缘故, 处理器虽然同时只能执行一个程序, 但分时操作系统会设置一个时间片, 即每个进程可获得一段处理器执行时间. 多个进程按序获得处理器调用, 并执行时间片的时间, 从而营造出多个程序是同时运行的假象. 进程执行满相应时间片的时间后, 会从”运行”状态置为”就绪”状态.
五状态模型看上去比较完善了, 但实际上还是会有问题.
我们知道只有在内存中的程序才会被处理器调用执行, 故所有等待被执行的程序都要首先被放入内存, 但内存是有限的, 有可能会出现不能调入所有待执行程序的情况, 而处理器速度非常快, 所以会出现内存中所有进程都被处理器执行了一遍, 都在等待I/O事件(即都是”阻塞”状态), 此时处理器空闲了, 却不能处理未进入内存的待执行程序.
针对上面这个问题, 可以通过不断增加内存大小来解决. 但还是有问题, 内存价格与大小是指数相关的, 不能一味增加大小. 因此操作系统引入了挂起(交换)的概念, 即内存已满时, 操作系统会将内存中等待I/O的进程(即”阻塞”状态)移动到硬盘中, 并从硬盘中调入新的"就绪"进程. 换出的进程被放置在挂起队列中, 由此引申出了七状态模型.
七状态进程模型
相较于五状态模型, 新增了”挂起就绪”与”挂起阻塞”两个状态, 通过交换技术分别对应”就绪”与”阻塞”状态. 前两者在硬盘中, 后两者在内存中.
参考:
<操作系统-精髓与设计原理>(第八版) 第三章 进程描述和控制
文中如有不当之处, 还望包容和指出, 感谢~