-
进程的状态与转换
进程的状态
进程是程序的一次执行。在执行的过程中,有时进程正在被CPU处理,有时有需要等待CPU服务,可见进程的状态是会有各种变化的,所以为了方便操作系统对进程的管理,操作系统需要将进程合理地划分为几种状态
三种基本状态
- 运行态Running:
占有CPU,并在CPU上运行。注意,这些状态的描述都是放在时刻这样的时间尺度上看的。所以一个CPU的情况下,在一个时刻下只能有一个进程处于运行态
- 就绪态Ready:
已具备运行的条件,即拥有除处理机外所有需要的资源,但是没有空闲的CPU而暂时无法运行。一旦获得处理机,即可立即进入运行态开始运行
- 阻塞态Waiting/Blocked:
因等待某一事件而暂时无法运行。例如等待操作系统分配打印机等等。CPU是最宝贵的部件,为了提高CPU的利用率,需要先将进程所需要的其他资源分配到位,才能得到CPU的服务。可知就绪态和阻塞态是有区别的。阻塞态是缺少了CPU以及其他的资源,给他CPU资源也无法马上运行,而就绪态是仅仅缺少了CPU资源。例如当进程处于运行态的过程中,需要用系统调度的方式申请某种系统资源,或者请求等待某个事件的发生,此时需要交出CPU的使用权,同时要等待其他的资源,这时就是出于阻塞态。
进程状态的转化
注意:
- 运行态到阻塞态是一种进程自身做出的主动行为,而阻塞态到运行态表示所需要的资源被分配好了,这一过程不是进程自身能控制的,所以这是一种被动的行为。
- 进程不能够由阻塞态直接转化为运行态,因为必须要在其他资源分配完成后才能分配CPU资源,可知这个先后过程必然要经历就绪态。以及,也不能由就绪态直接转化为阻塞态。因为进程转化到阻塞态是一种进程主动的行为,而只有当进程处于运行态时,他才有资格能主动。
进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
如何实现进程的控制
实质上就是在进程的各个状态之间完成转换。需要完成的操作有将不同的PCB放入应该处在的状态的队列或者索引之下以及修改PCB的内容以表示出这个PCB所处的状态、需要保持或者恢复进程运行环境、回收分配进程拥有的资源等等
可知这样会遇到一个问题, 由于PCB本身有表示此进程处于状态的能力,同时由根据PCB所处于的表示进程状态的队列也可以获取PCB对应进程所处的状态,所以如果PCB中表示进程所处的状态和该PCB所处的表示不同进程状态的队列说表示的进程状态不一致,这就会使系统产生错误
所以为了解决此问题,使用原语来实现进程控制。
原语
特点具有原子性,即在执行期间不允许中断,只能一次性执行完。这种操作称为原子操作。原语通过“关中断”和“开中断”指令来实现,即在执行原语的头尾处分别加上“关中断”指令和“开中断”指令来控制中断的开启以防止在指令执行期间被中断。所以将PCB在进程状态列表中的转移和PCB本身进程状态标志的设置这两个操作放在原语中进行,这样不会被中断,这两个地方的状态就会保持一致
很显然,“开中断”和“关中断”指令都是只能在核心态下执行的特权指令
进程控制相关的原语
进程控制会导致进程状态的转换。无论哪个原语,要做的都是三件事情
1.更新PCB中的信息,例如修改进程状态标志、将运行环境保存到PCB、从PCB中恢复运行环境等等
a.所有的进程控制原语都一定会修改进程状态标志
b.剥夺当前运行的进程的CPU使用权必然要保存其运行环境
c.某进程开始运行前必然要恢复其运行环境
2.将PCB插入合适队列
3.分配/回收资源