第六章 并发:死锁和饥饿
一、给出可重用资源和可消耗资源的例子。
可重用资源:处理器、I/O通道、内存和外存、设备,以及诸如文件、数据库和信号量之类的数据结构。
可消耗资源:中断、信号、消息和I/O缓冲区中的信息。
二、产生死锁的三个必要条件是什么?
- 互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。
- 占有且等待:当一个进程等待其他进程时,继续占有已分配的资源。
- 不可抢占:不能强行抢占进程已含有的资源。
三、产生死锁的4个条件是什么?
- 互斥:一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。(例如,要确保结果的一致性和数据库的完整性,互斥是非常有必要的。)
- 占有且等待:当一个进程等待其他进程时,继续占有已分配的资源。
- 不可抢占:不能强行抢占进程已含有的资源。(例如,在涉及数据资源时,必须提供回滚恢复机制(rollback recovery mechanism)来支持资源抢占,只有这样才能把进程及其资源恢复到以前的适当状态,使得进程最终可以重复其动作)
- 循环等待:存在一个闭合的进程链,每个进程至少占用此链下一个进程所需的一个资源。(第四个条件实际上是前三个条件的潜在结果,即假设前三个条件存在,那么可能发生的一系列事件会导致不可解的循环等待。这个不可解的循环等待实际上就是死锁的定义。)
四、如何防止占用且等待条件?
要求进程一次性地请求所有需要的资源,并阻塞这个进程直到所有请求都同时满足。
低效性:
- 一个进程可能被阻塞很长时间,以等待满足所有的资源请求。而实际上,只要有一部分资源,它就可以继续执行。
- 分配给一个进程的资源可能会在相当长的一段时间不会被该进程使用,且不能被其他进程使用。
- 一个进程可能事先并不知道它所需要的资源。
五、给出防止不可抢占条件的两种方法。
在资源状态可以很容易的保存和恢复的情况下:
- 占有某些资源的一个进程进一步申请资源时若被拒绝,则该进程必须释放其最初占有的资源,必要时可再次申请这些资源和其他资源。
- 在任意两个进程的优先级都不同的情况下(剥夺低优先级的进程给高优先级),一个进程请求当前被另一个进程占有的一个资源时,操作系统可以抢占另一个进程,要求它释放资源。
六、如何防止循环等待条件?
通过定义资源类型的线性顺序(资源有序分配法)来防止循环等待条件。若一个进程已分配了R类型的资源,则其接下来请求的资源只能是那些排在R类型之后的资源。
注:资源有序分配法,系统内每个资源一个编号,各进程必须严格按照编号递增的顺序申请资源。
七、死锁避免、检测和预防之间的区别是什么?
死锁预防(deadlock prevention)是通过间接地限制三种死锁必要条件的至少一个或是直接地限制循环等待的发生来避免死锁的出现。
死锁避免(deadlock avoidance)允许可能出现的必要条件发生,但是采取措施(进程启动拒绝、资源分配拒绝)确保不会出现死锁的情况。
死锁检测(deadlock detection)允许资源的*分配,采取周期性地执行死锁检测算法来检测循环等待条件并处理可能存在的死锁情况。