{"name":"死锁","id":"操作系统-死锁","content":"# 死锁\n\n## 0. 引言：死锁的本质\n\n死锁（Deadlock）的本质并不是\"几个进程卡住不动\"，而是：\n\n> **系统进入了一个不可逃逸的状态空间（Irreversible State），其内部所有进程的推进都依赖于彼此引发的事件，而这些事件永远不会发生。**\n\n从统一抽象模型看：\n死锁 = **等待关系图（Wait-For Graph）中出现不可消除的环路**。\n\n理解死锁要从 **系统状态空间** 与 **资源分配图** 入手，再将所有策略归纳为一套 **死锁治理体系**。\n\n---\n\n# 1. 死锁的抽象模型（核心框架）\n\n## 1.1 资源分配图（RAG：Resource Allocation Graph）\n\n系统由两类节点构成：\n\n* **进程 P**\n* **资源 R**\n\n边表示关系：\n\n* `R → P`：资源被某进程持有\n* `P → R`：进程正在请求资源\n\n若改写为等待图（WFG），则为：\n\n* `P1 → P2`: P1 等待 P2 所持资源\n\n所有死锁判定和策略都可从此图推导。\n\n---\n\n## 1.2 死锁的四个必要条件（从模型导出）\n\n死锁产生要求 **全部成立**：\n\n| 条件        | 本质含义       | 对应模型表现              |\n| --------- | ---------- | ------------------- |\n| **互斥**    | 资源不可共享     | R 节点只有一个出边          |\n| **占有并等待** | 持有部分资源继续请求 | P 节点同时连接 Rout 和 Rin |\n| **不可抢占**  | 资源不能强制收回   | 图结构不可修改             |\n| **环路等待**  | 存在闭环       | WFG 出现环路            |\n\n> **四条件不是规则，而是图结构的特征**\n> 只要等待图中出现\"闭环\"，其成因必然表现为这四条。\n\n---\n\n# 2. 死锁的类型（从系统视角分类）\n\n## 2.1 静态顺序死锁\n\n资源顺序固定但多个线程以不同顺序请求 → 环路出现。\n\n## 2.2 动态顺序死锁\n\n资源的请求动态变化，无法保证统一顺序。\n\n## 2.3 资源死锁（经典 OS 死锁）\n\n争夺有限、不可抢占资源（锁、文件、IO）。\n\n---\n\n# 3. 死锁的生命周期（能力体系总览）\n\n建议用统一治理体系理解死锁：\n\n```\n死锁治理体系\n├── 预防（Prevention）——破坏必要条件\n├── 避免（Avoidance）——仅进入安全状态\n├── 检测（Detection）——持续检测环路\n└── 恢复（Recovery）——打破死锁\n```\n\n此体系适用于：\n\n* 操作系统\n* 数据库\n* 分布式系统\n* JDK、Go、Rust 等语言运行时\n\n---\n\n# 4. 死锁预防（Prevention）：运行前避免死锁\n\n核心思想：**从根源破坏\"导致死锁的必要条件\"之一**。\n\n| 要破坏的条件 | 对应策略      | 原理      |\n| ------ | --------- | ------- |\n| 互斥     | 共享资源、假脱机  | 消除独占性   |\n| 占有并等待  | 运行前请求全部资源 | 不形成链式请求 |\n| 不可抢占   | 允许抢占      | 消除封闭环路  |\n| 环路等待   | 资源编号、顺序锁  | 阻止环路形成  |\n\n**适用于：**\n数据库锁顺序、两阶段加锁、资源分级、多锁策略等。\n\n---\n\n# 5. 死锁避免（Avoidance）：运行中确保安全状态\n\n## 5.1 安全状态（Safe State）\n\n存在至少一种**进程顺序**能让所有执行完毕 → 状态安全。\n否则→ 不安全。不安全 ≠ 死锁，但可能发展为死锁。\n\n## 5.2 银行家算法（Banker's Algorithm）\n\n通过模拟资源分配，判断是否会进入不安全状态。\n\n核心结构：\n\n* **E**：资源总量向量\n* **A**：当前可用向量\n* **C**：当前已分配资源矩阵\n* **R**：最大需求矩阵\n\n算法思想：\n\n1. 找到一个需求 ≤ A 的进程\n2. 假设其结束并释放资源\n3. 更新 A\n4. 重复直到全部结束\n\n该算法体现：\n\n> **避免死锁不是避免等待，而是避免进入无法撤退的状态空间。**\n\n---\n\n# 6. 死锁检测（Detection）：发现环路\n\n## 6.1 单实例资源：等待图环路检测\n\n使用 DFS 或 Tarjan 算法检查环路。\n复杂度：O(V + E)\n\n## 6.2 多实例资源：资源分配矩阵检测\n\n检测是否存在一个进程可获满足请求，若所有都不能则死锁。\n\n适用系统：数据库、OS、线程调度器。\n\n---\n\n# 7. 死锁恢复（Recovery）：从死锁中走出\n\n策略按破坏成本排序：\n\n## 7.1 抢占（Preemption）\n\n从某进程强制拿走资源 → 恢复可行性。\n\n## 7.2 回滚（Rollback）\n\n回到检查点 → 放弃部分计算 → 常见于事务系统。\n\n## 7.3 终止进程（Kill）\n\n选择\"牺牲者（victim）\"终止。数据库常用。\n\n> 牺牲者选择策略可按代价模型（cost model）优化：已运行时间、持有资源数量、优先级等。\n\n---\n\n# 8. 工程视角：现代系统中的死锁\n\n## 8.1 操作系统\n\n* mutex、semaphore\n* IO 资源竞争\n* 内核锁（如 Linux Big Kernel Lock 历史）\n\n## 8.2 JVM / Java\n\n* synchronized 死锁\n* ReentrantLock + tryLock 作为死锁规避\n* 通过 Thread Dump 查看 WFG\n\n## 8.3 Go\n\n* goroutine + channel 死锁（运行时直接 panic）\n* select + timeout 避免通信死锁\n\n## 8.4 数据库\n\n* 行锁 / 表锁\n* 两阶段锁协议（2PL）\n* 死锁检测器（等待图）\n\n## 8.5 分布式系统\n\n* 分布式锁（Redis/ZK）死锁风险更高\n* 因网络分区导致\"伪死锁\"\n* 租约（Lease）、超时、心跳是核心策略\n\n---\n\n# 9. 相关问题与概念边界（避免混淆）\n\n| 概念       | 特征           | 是否死锁？    |\n| -------- | ------------ | -------- |\n| **死锁**   | 所有进程都停止推进    | ✔        |\n| **活锁**   | 进程不断变化但不前进   | ✘        |\n| **饥饿**   | 某些进程永远不得资源   | ✘        |\n| **通信死锁** | 双方等待消息，不涉及资源 | ✔（等待图形式） |\n| **响应性慢** | 资源分配不均衡      | ✘        |\n\n这是构建概念体系的重要部分，帮助工程中准确定位问题。\n\n---\n\n# 10. 典型错误示例（编程层面）\n\n```c\nvoid fa(){\n    down(r1);\n    down(r2);\n    up(r1);\n    up(r2);\n}\n\nvoid fb(){\n    down(r2);\n    down(r1);\n    up(r1);\n    up(r2);\n}\n```\n\nfa 和 fb 对资源请求顺序不一致 → 静态顺序死锁。\n\n工程解决方案：\n\n* 固定资源顺序（资源编号法）\n* tryLock + 超时\n* 两阶段锁协议\n\n---\n\n# 11. 死锁治理最佳实践（统一策略）\n\n### ✔ 编程层面\n\n* 固定资源获取顺序（资源编号法）\n* 尽量减少锁的粒度和持有时间\n* 使用 tryLock / select+timeout\n* 尽量使用无锁结构\n\n### ✔ 系统层面\n\n* 运行时死锁检测器\n* 线程转储分析\n* 资源监控与报警\n\n### ✔ 分布式系统层面\n\n* 分布式锁需带超时避免永久死锁\n* 使用租约（lease）而非永久锁\n* 心跳 + 强制回收\n\n---\n\n# 12. 总结：统一心智模型\n\n> 死锁不是一个孤立问题，而是\"系统状态空间不可逆\"的表现。\n> 所有策略都围绕\"让系统进入、维持或恢复到可逆状态\"展开。\n\n核心统一框架：\n\n```\n抽象模型：资源分配图 / 等待图（WFG）\n↓\n四个必要条件：图结构特征\n↓\n策略体系：预防 / 避免 / 检测 / 恢复\n↓\n工程实现：OS / JVM / DB / 分布式系统\n↓\n边界概念：死锁 vs 活锁 vs 饥饿\n```\n\n这就是一个可复用、可迁移、跨学科的**死锁知识体系**。\n\n## 关联内容（自动生成）\n\n- [/中间件/数据库/数据库系统/事务管理/事务.md](/中间件/数据库/数据库系统/事务管理/事务.md) 数据库事务管理中包含死锁处理策略，与操作系统死锁有相似的模型和解决方案\n- [/编程语言/JAVA/JAVA并发编程/JAVA并发编程.md](/编程语言/JAVA/JAVA并发编程/JAVA并发编程.md) Java并发编程涉及锁、线程同步等概念，与死锁密切相关\n- [/操作系统/进程与线程.md](/操作系统/进程与线程.md) 进程与线程管理是死锁问题的核心场景，涉及同步与互斥机制\n- [/编程语言/JAVA/JVM/自动内存管理/内存结构.md](/编程语言/JAVA/JVM/自动内存管理/内存结构.md) JVM内存结构中包含锁和死锁检测机制，是Java应用层面死锁处理的重要参考\n- [/编程语言/并发模型.md](/编程语言/并发模型.md) 并发模型中的资源循环依赖与死锁问题相关\n- [/软件工程/架构/系统设计/分布式/分布式事务.md](/软件工程/架构/系统设计/分布式/分布式事务.md) 分布式事务中的锁竞争和死锁检测与操作系统死锁处理方法类似\n- [/编程语言/JAVA/JAVA并发编程/线程池.md](/编程语言/JAVA/JAVA并发编程/线程池.md) 线程池中的任务依赖可能导致死锁问题\n- [/中间件/数据库/mysql/mysql.md](/中间件/数据库/mysql/mysql.md) MySQL中的表级锁、行级锁及死锁处理机制与操作系统锁机制相似\n- [/编程语言/JAVA/Java谜题.md](/编程语言/JAVA/Java谜题.md) Java谜题中包含死锁示例，展示了并发编程中的死锁场景\n- [/中间件/数据库/数据库优化.md](/中间件/数据库/数据库优化.md) 数据库优化中的锁冲突分析与死锁预防相关\n- [/软件工程/架构/系统设计/分布式/分布式一致性与协调机制.md](/软件工程/架构/系统设计/分布式/分布式一致性与协调机制.md) 分布式一致性协议中的锁机制与死锁问题\n- [/操作系统/多处理机系统.md](/操作系统/多处理机系统.md) 多处理机系统中的同步和锁机制与死锁预防相关\n- [/编程语言/JAVA/JAVA并发编程/并发工具类.md](/编程语言/JAVA/JAVA并发编程/并发工具类.md) Java并发工具类中的同步机制与死锁预防相关\n- [/软件工程/软件设计/代码质量/软件测试/性能测试.md](/软件工程/软件设计/代码质量/软件测试/性能测试.md) 性能测试中可发现死锁等并发问题\n- [/中间件/数据库/redis/集群.md](/中间件/数据库/redis/集群.md) Redis集群中的分布式锁与死锁预防\n- [/个人成长/职场/职业素养.md](/个人成长/职场/职业素养.md) 职业素养中提到的资源分配顺序与死锁预防相关\n- [/计算机网络/网络安全/Web安全.md](/计算机网络/网络安全/Web安全.md) Web安全中的并发控制与死锁预防\n- [/软件工程/架构模式/对象关系模式.md](/软件工程/架构模式/对象关系模式.md) 工作单元模式可减少死锁\n","metadata":"tags: ['操作系统', '并发编程']","hasMoreCommit":false,"totalCommits":9,"commitList":[{"date":"2026-10-22T22:01:43+08:00","author":"0xcaffebabe","message":"fix: persist hidden preview state across reloads","hash":"377c1b3e0d4a64ac559123da8dfd70920a85224c"},{"date":"2026-10-22T17:14:19+08:00","author":"Codex","message":"fix: restore pinned document previews after refresh","hash":"267bd582422c704067b4b904be948bc04367ad0b"},{"date":"2026-10-22T15:09:08+08:00","author":"Codex","message":"fix: prevent word cloud tooltips leaking into document pages","hash":"60b0fadab47a1aad1ed637dc0c10990b668b5fda"},{"date":"2026-10-22T14:05:48+08:00","author":"My","message":"Merge pull request #637 from 0xcaffebabe/codex/ultrawide-panel-gap-636","hash":"adbac4bad6689e7f56d350f75704a500eed4ac61"},{"date":"2026-10-22T12:19:31+08:00","author":"Codex","message":"fix: remove duplicate mobile bottom-bar search","hash":"afd1e0fab2df539c3e7572878ae8d1e095b09a71"},{"date":"2026-10-22T10:16:53+08:00","author":"My","message":"Merge pull request #639 from 0xcaffebabe/codex/merge-toolbox-sitenav-638","hash":"cb23b5902093c28879a7dc0ba79747f0b38faf02"},{"date":"2026-10-22T01:20:43Z","author":"renovate[bot]","message":"chore(deps): update dependency jsdom to v30","hash":"e364e185b9e8f10adcdb98370342f808d4c5a2fd"},{"date":"2026-10-21T18:58:02+08:00","author":"My","message":"test: distinguish node labels from cluster titles","hash":"4068d9aed488792cf0fa5eb5e175ed7dc27e3f79"},{"date":"2026-10-21T18:07:48+08:00","author":"My","message":"Merge pull request #635 from 0xcaffebabe/codex/contributing-no-images","hash":"49153a716ef494bb51a2d73f54a96f65ad0fe9d5"}],"createTime":"2026-10-21T18:07:48+08:00"}