整理自《操作系统概念》第九版
死锁概念
当一组进程中的每个进程都在等待一个事件,而这一事件只能由这一组进程的另一进程引起,那么这组进程就处于死锁状态。这里所关心的主要事件是资源获取和释放。资源可能是物理资源或逻辑资源。
死锁特征
死锁发生的必要条件(四个条件同时成立):
- 互斥(mutual exclusion):至少有一个资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么申请进程应该等到该资源释放为止
- 占有并等待(hold and wait):一个进程应占有至少一个资源,并等待另一个资源;而该资源为其他进程所占有。
- 非抢占(no preemption):资源不能被抢占,即资源只能被进程在完成任务后自愿释放。
- 循环等待(circular wait):有一组等待进程如P0,P1,…Pn。P0等待的资源为P1占有,P1等待的资源为P2占有……
死锁的处理方法
- 通过协议来预防或避免死锁 ,确保系统不会进入死锁状态
- 允许系统进入死锁状态,检测并恢复
- 忽视这个问题,认为死锁不可能在系统内发生
死锁预防
打破死锁发生的四个必要条件。
互斥:多个进程同时打开只读文件,则可以同时访问文件,不需要等待共享资源。
持有且等待:1.每个进程在执行前申请所有的资源;2.允许进程仅在没有资源时才可以申请资源。缺点:资源利用率比较低,很多资源已经分配但长时间没有使用;可能发生饥饿,一个进程如需要多个常用资源,可能必须永久等待,因为在它所需要的资源中至少有一个已经分配给其他进程。
无抢占:如果一个进程持有资源并申请另一个不能立即分配的资源,那么它现在分配的资源都可以被抢占。通常用于状态可以保存和恢复的资源,如CPU寄存器和内存。一般不适用于其他资源,如互斥锁和信号量。
循环等待:对所有资源类型进行完全排序,而且要求每个进程按递增顺序来申请资源。
死锁避免
死锁预防的算法中,通过限制如何申请资源来预防死锁,但会导致设备的使用率低和系统吞吐率低。避免死锁的另一种方法需要额外信息,即如何申请资源。
在获悉每个进程的请求与释放的完整顺序之后,系统可以决定,在每次请求时进程是否应该等待以避免未来可能的死锁。针对每次申请的要求,系统在做决定时考虑现有可用资源、现已分配资源和将来申请释放的资源。
安全状态 如果系统能按一定顺序为每个进程分配资源,仍然避免死锁,那么系统的状态就是安全的。只有存在一个安全序列,系统才处于安全状态。
资源分配图算法
银行家算法
死锁检测
死锁检测分为每种资源类型有单个实例和多个实例两种情况。单个实例的条件下,我们可以定义一个死锁检测算法,使用等待图进行标注。从资源分配图中,删除所有资源类型节点,合并适当边即可得到等待图。对于多个实例,将银行家算法进行适当的修改,Need变量改为request,表示当前每个进程的每种资源的当前请求即可。
死锁恢复
可以通过进程终止和资源抢占来恢复死锁。
进程终止有两种方法:一是中止所有死锁进程,但代价巨大;二是一次中止一个进程,直到消除死锁循环位置,但开销巨大。
资源抢占则需要处理下列三个问题:一是选择哪些进程作为牺牲进程;二是回滚到某个安全状态,但难以确定什么是安全状态;三是尽量避免发生饥饿。