进程的阻塞与唤醒
引起进程阻塞和唤醒的事件:
- 向系统申请资源时失败。如一个进程(A)申请打印机但是此时打印机被其他进程(B)正在使用,此时A进程则处于阻塞状态。
- 等待某种操作的完成:进程A启动了某I/O设备,如果只有完成了指定的I/o任务后进程A才能执行,则进程A启动了I/O设备后会自动进入阻塞。
- 新数据尚未到达:对于相互合作的进程,如果一个进程需要先获得另一个进程的数据后才能对该数据进行处理,只要数据尚未到达其便会进入阻塞状态。
- 等待新任务的到达:每当这种进程完成自己的任务便把自己阻塞起来,等待新任务到达,才将其唤醒。
进程阻塞的过程:正在执行的进程,如果遇到上面阻塞的事件后
- 进程调用阻塞原语(block)将自己阻塞(阻塞是进程自身的一种主动行为)
- 将正在运行的进程立即停止运行
- 把PCB中进程状态信息改为阻塞
- 将PCB插入阻塞队列
- 如果系统设置了不同阻塞原因的队列,则应将其插入到对应原因引起的阻塞队列中。
进程唤醒的过程:当被阻塞进程所期待的事件发生时
- 则有关的进程会调用唤醒原语(wakeup)
- 将等待的进程唤醒
- 首先把阻塞的进程从阻塞队列中移除,将其PCB中的先行状