精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

死锁的概念与预防

考情分析

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

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

死锁的定义

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

死锁的四个必要条件

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

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

易错

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

不发生死锁的最小资源数

上面说到"资源数量充足时不一定死锁",那到底多少才算"充足"?有一类经典小题就在算这个下限:

结论:系统中有 m 个进程(m1),每个进程都需要 k 个(k1)同类临界资源,则保证系统一定不发生死锁的最小资源数为

(k1)m+1

推导只需盯住一个"最坏情况":假设每个进程都恰好拿到了 k1 个资源(人人都差最后 1 个),此时若系统资源正好耗尽,谁也拿不到第 k 个 → 全体卡住 → 死锁。而只要再多 1 个资源,就能让某一个进程凑齐 k 个、跑完、释放它占用的全部资源,接力把其余进程一个个盘活。所以把"人人差一个"的总占用 (k1)m 再加 1,就是绝不死锁的最小资源数。

记忆

"每人差一个、再补一个":(k1)m 是把所有进程都卡在临门一脚的资源量,+1 就是打破僵局的那根救命稻草。

死锁的处理策略

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

死锁预防

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

破坏互斥条件

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

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

破坏请求并保持条件

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

缺点

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

破坏不可剥夺条件

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

缺点

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

破坏循环等待条件

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

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

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

缺点

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

死锁避免

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

安全状态

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

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

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

本文对应考点

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

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

真题练习