什么是进程控制?
进程控制的主要功能是:对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
简单来说,就是进程控制就是要现实进程状态的转换。
那如何实现进程的控制呢? 答案就是使用 原语
来实现,如下图:
在之前我们有提到过,原语
是具有原子性操作的,运行必须一气呵成,那如果没有原子性,会发生什么事情呢? 我们来看一下假设:
在上图中,假设需要使用源语
进行状态的切换,至少需要做两件事:
1、将 PCB 2 的 state 设置为 1
2、将 PCB 2 从阻塞队列放入到就绪列表
如果不具有原子性,可能只做了第一件事之后,就被中断了,那这个时候,阻塞队列里面的数据就包含了 state = 1 的 PCB 了,这样对于进程的管理,就乱套了。
那么 原语
是如何来保证原子性的呢? 我们接着往下看
原语如何保证原子性?
原语,其实也是用了两条特权指令
来保障原子性操作的。
源语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。 可以用 关中断指令、开中断指令
,这两个特权指令实现原子性操作。
还记得我们之前在中断
那个章节有提到,执行完每一个指令之后,CPU 都要检查当前是否有外部中断信号,如果有则需要处理中断信息。
那么如果 CPU 执行了 关中断指令
之后,就不再例行检查是否有中断信息,直到执行 开中断指令
之后,才恢复检查。
这样,关中断,开中断之间的这些指令就是不可被中断的了,这就实现了 原子性
。
我们知道是使用 原语
来进行进程状态控制的,那这些原语
具体都做了哪些事情呢?
以下的内容不需要死记硬背,只需要理解就好了。
创建原语
终止原语
阻塞和唤醒
切换原语
在切换原语的时候,我们需要保存运行环境,在重新执行该进程的时候,还需要恢复所需的运行环境。
那到底保存什么运行环境?