死锁
死锁(Deadlock)是并发系统中一组进程互相等待对方释放资源、谁也无法继续执行的永久阻塞状态——每个进程都在等一个只有同组其他进程才能释放的资源,结果谁都不放手、谁都跑不动。死锁不是程序逻辑错误,而是资源竞争 + 排序不当导致的系统级僵局:两个线程各持一把锁、又去抢对方的锁,经典死锁就发生了。理解死锁的四必要条件、检测方法与四种处理策略(预防/避免/检测恢复/鸵鸟),是写好多线程程序、设计资源管理系统的核心——一个不懂死锁的程序员,难以解释"为什么程序偶尔整个卡死、CPU 占用却是 0"。
死锁的全部考点围绕一条主线展开:死锁如何发生 → 如何识别 → 如何处理。①发生条件:Coffman 四必要条件(互斥、占有并等待、不剥夺、循环等待)缺一不可——这是判定与防御的根基。②识别工具:资源分配图(RAG),图中出现包含资源节点的环即死锁(每类资源只有 1 个实例时,有环必死锁)。③四种处理策略:预防(破坏四条件之一,如资源有序分配破坏循环等待)、避免(银行家算法,分配前先算会不会进入不安全状态)、检测与恢复(允许死锁发生,周期性检测到再杀进程/抢占资源)、鸵鸟策略(忽略,Linux/Windows 实际这么做)。④饥饿 vs 活锁:饥饿是某进程长期得不到资源(可调度,只是轮不到它),活锁是进程不停让步反而都在动却无进展——两者都不是死锁但同样是并发病。本叶从四条件到银行家算法讲透死锁全貌。
评价
优点(研究死锁的价值)
- 理论清晰:Coffman 四条件给出了死锁发生的充要判据,资源分配图让"是否死锁"成为可判定的图论问题
- 策略完备:预防/避免/检测恢复/忽略四种策略覆盖了从"绝对不死锁"到"接受死锁"的全谱,工程上可按代价选型
- 银行家算法优雅:在已知最大需求的前提下,能在分配前预判安全性,是"避免"策略的经典代表
- 通用迁移:死锁模型不止用于 OS 资源,还用于数据库锁、分布式系统(两阶段提交)、并发编程(锁排序)
缺点(实践中的局限)
- 预防代价大:破坏四条件往往严重降低资源利用率与并发度(如资源有序分配导致资源浪费)
- 避免难落地:银行家算法要求事先知道每个进程的最大资源需求,现实程序几乎做不到,且每次分配都要跑算法、开销大
- 检测恢复复杂:周期性检测有开销,杀哪个进程、如何回滚都是难题,抢占资源可能导致数据不一致
- 主流 OS 选择鸵鸟:Linux/Windows 既不预防也不避免,靠忽略死锁换性能与简单——因为死锁在通用系统中发生概率低,预防代价不划算
本叶地图
- 入门 —— 死锁定义、四必要条件总览、死锁 vs 饥饿 vs 活锁的区别
- 死锁四条件与资源分配图 —— Coffman 四条件详解、破坏哪个条件对应哪种预防、资源分配图(RAG)判环
- 死锁处理:预防、避免、检测 —— 预防(破坏四条件)、避免(银行家算法)、检测与恢复、鸵鸟策略
- 参考 —— 四条件表、四种处理策略对比、银行家算法步骤、易错点、权威链接