Skip to content

死锁的概念与预防

考情分析

死锁在 408 真题中累计考查约 22 分(2009-2026),属于 🔥🔥 中频考点。四个必要条件和预防策略是选择题常客。

两辆车在窄巷里迎面相遇,谁都不愿后退,结果谁都过不去——这就是死锁。在操作系统中,多个进程互相等待对方释放资源,谁也无法继续执行,系统就卡住了。

死锁的定义

死锁(Deadlock):多个进程因互相等待对方持有的资源而无限期阻塞的状态。

死锁的四个必要条件

死锁发生的四个必要条件(缺一不可):

条件含义
互斥条件资源一次只能被一个进程使用
请求并保持(Hold and Wait)进程持有资源的同时请求新资源
不可剥夺(No Preemption)进程持有的资源不能被强行夺走
循环等待(Circular Wait)存在进程的循环等待链

易错

四个条件同时满足不一定死锁,但死锁一定同时满足这四个条件。选择题常见干扰项:"满足四个条件就会死锁"——错,这四个是必要条件,不是充分条件。另外,"循环等待"≠"死锁":有循环等待但资源数量充足时,不一定死锁。

死锁的处理策略

策略思路资源利用率实现难度
预防破坏四个必要条件之一简单
避免动态检测是否进入不安全状态
检测+解除允许死锁发生,再检测并解除
鸵鸟策略忽略死锁(死锁概率极低时)最高

死锁预防

通过破坏四个必要条件之一来预防死锁:

破坏互斥条件

将互斥资源改造为共享资源(如 SPOOLing 技术把打印机改为共享设备)。

局限性:很多资源本质上就是互斥的,无法改造。

破坏请求并保持条件

进程运行前一次性申请所有需要的资源,得不到就不运行。

缺点

  • 资源利用率低(有些资源可能很晚才用到但一开始就占着)
  • 可能导致饥饿(需要多种资源的进程长期等待)

破坏不可剥夺条件

当进程申请新资源得不到时,主动释放已持有的所有资源。

缺点

  • 前一阶段的工作可能白费
  • 反复申请和释放增加系统开销
  • 只适用于可以保存和恢复状态的资源(如 CPU、内存)

破坏循环等待条件

为所有资源编号,进程必须按编号递增的顺序申请资源。

资源编号: R1=1, R2=2, R3=3

进程必须: 先申请 R1, 再申请 R2, 再申请 R3
不允许:   持有 R3 后再申请 R1(编号倒退)

缺点

  • 编号不方便调整
  • 可能导致资源浪费(按编号顺序不一定是最优使用顺序)

死锁避免

不破坏必要条件,而是在资源分配时动态判断是否安全。

安全状态

如果存在一个安全序列(所有进程都能依次完成),则系统处于安全状态。

  • 安全状态 → 一定不会死锁
  • 不安全状态 → 可能死锁(不是一定)
  • 死锁 → 一定处于不安全状态

死锁避免的核心算法是银行家算法(下一篇详述)。

考研高频考点

  • 🔥🔥🔥 死锁的四个必要条件(必须能列举并解释)
  • 🔥🔥🔥 各种预防策略分别破坏了哪个条件
  • 🔥🔥 安全状态/不安全状态/死锁之间的关系
  • 🔥🔥 各预防策略的缺点
  • 🔥 死锁处理的四种策略对比

预防死锁代价太大,避免死锁则更精细——在分配资源前先"试算"一下安全不安全。下一篇看银行家算法的具体做法。

真题练习

相关真题(6题)

2019Q30选择题2分

死锁:银行家算法用于避免死锁而非检测死锁

2019Q43综合题8分

综合题:带碗限制的哲学家进餐问题,需防止死锁

2016Q25选择题2分

死锁最少进程数:3个进程形成循环等待即可死锁

2015Q26选择题2分

死锁避免vs检测:避免需要资源总量信息且拒绝不安全分配,不限制申请顺序

2014Q24选择题2分

死锁避免:最坏情况每个进程差1台,(3-1)+(4-1)+(5-1)+1=10

2010Q26选择题2分

死锁条件:每个进程持有2台等1台,K×2<8时不死锁,K=4时可能死锁