Appearance
死锁的概念与预防
考情分析
死锁在 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(编号倒退)缺点:
- 编号不方便调整
- 可能导致资源浪费(按编号顺序不一定是最优使用顺序)
死锁避免
不破坏必要条件,而是在资源分配时动态判断是否安全。
安全状态
如果存在一个安全序列(所有进程都能依次完成),则系统处于安全状态。
- 安全状态 → 一定不会死锁
- 不安全状态 → 可能死锁(不是一定)
- 死锁 → 一定处于不安全状态
死锁避免的核心算法是银行家算法(下一篇详述)。
考研高频考点
- 🔥🔥🔥 死锁的四个必要条件(必须能列举并解释)
- 🔥🔥🔥 各种预防策略分别破坏了哪个条件
- 🔥🔥 安全状态/不安全状态/死锁之间的关系
- 🔥🔥 各预防策略的缺点
- 🔥 死锁处理的四种策略对比
预防死锁代价太大,避免死锁则更精细——在分配资源前先"试算"一下安全不安全。下一篇看银行家算法的具体做法。