首页/操作系统/进程管理/死锁 🔗 在 Obsidian 中打开
操作系统 · 进程管理

死锁

重要度 ★★ 死锁银行家算法资源分配图安全序列进程管理
速查
死锁是多个进程因竞争资源而互相等待的僵局,四个必要条件缺一不可:互斥、请求和保持、不可抢占、循环等待。处理思路分预防 / 避免 / 检测恢复 / 忽略四类;银行家算法用 Need = Max − Allocation 做安全性检查。

核心概念

死锁是指多个进程因竞争资源而造成的一种互相等待的僵局,若无外力作用,这些进程都无法继续推进。

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

  1. 互斥条件:资源一次只能被一个进程使用。
  2. 请求和保持条件:进程已持有至少一个资源,又请求新资源,请求被阻塞但不释放已有资源。
  3. 不可抢占条件:已被分配的资源不能被强行抢占,只能由持有者主动释放。
  4. 循环等待条件:存在进程等待的循环链 $P_1 \to P_2 \to \dots \to P_n \to P_1$。
本质四个条件同时成立才构成死锁;破坏(不满足)其中任意一个,死锁即不可能发生。

关键定义

概念定义
死锁两个或多个进程互相等待对方持有的资源,导致都无法继续执行的状态
安全状态存在一个安全序列,使所有进程都能顺利完成
安全序列进程执行序列 $\langle P_1, P_2, \dots, P_n \rangle$,每个 $P_i$ 的剩余需求可用当前可用资源 + 所有 $P_j\,(j<i)$ 释放的资源满足
银行家算法每次资源分配前检查系统是否仍处于安全状态,是则分配,否则拒绝
资源分配图用有向图描述进程对资源的请求和资源的分配关系
死锁定理资源分配图不可完全化简 $\iff$ 系统处于死锁状态

处理策略

四类思路从「最保守」到「最放任」:预防 → 避免 → 检测与恢复 → 忽略(鸵鸟策略)。
  • 预防:破坏四个必要条件之一(如静态分配法破坏请求和保持,资源有序分配法破坏循环等待)。
  • 避免:在资源分配前判断是否安全(银行家算法)。
  • 检测与恢复:允许死锁发生,检测后处理(资源分配图化简、终止进程)。
  • 忽略:鸵鸟策略,大多数操作系统(Linux / Windows)采用。

银行家算法

  • 数据结构:Available(可用资源向量)、Max(最大需求矩阵)、Allocation(分配矩阵)、Need(需求矩阵,$Need = Max - Allocation$)。
  • 安全性检查:找一个 $Need \leq Available$ 的进程,执行后释放资源,重复直到所有进程完成。
  • 安全序列存在 → 系统安全;不存在 → 系统可能不安全(拒绝此次分配)。

资源分配图

圆圈表示进程,方框表示资源(圆点表示实例);请求边 $P \to R$,分配边 $R \to P$。无环则无死锁;有环则可能有死锁(每类资源仅一个实例时,有环即有死锁)。

常见考法

考点说明
死锁条件判断给定场景判断是否满足四个必要条件
安全性检查给定资源矩阵,判断系统是否安全,找出安全序列
银行家算法判断某次资源请求是否应该批准
资源分配图化简从图中判断是否存在死锁
死锁预防策略给定场景选择合适的预防方法

易错点

必记
  1. 四个条件是必要条件,缺一不可;破坏任一条件即可预防死锁。
  2. 安全状态一定不死锁,不安全状态不一定死锁(只是可能)。
  3. 银行家算法的 $Need = Max - Allocation$,不是 $Max - Available$。
  4. 循环等待 $\neq$ 死锁:资源可抢占或不满足其他条件时,循环等待也不构成死锁。
  5. 每类资源仅 1 个实例时,资源分配图中有环 $\iff$ 死锁;多实例时有环是必要非充分条件。

记忆卡片

死锁的四个必要条件?
互斥、请求和保持、不可抢占、循环等待(缺一不可)。
安全状态与死锁的关系?
安全→一定不死锁;不安全→不一定死锁。
银行家算法 Need 如何算?
$Need = Max - Allocation$。
单实例资源有环意味着?
有环 $\iff$ 死锁;多实例时仅为必要非充分。

交互动画 · 四个必要条件与循环等待

四个必要条件 ① 互斥资源独占 ② 请求和保持持一求一 ③ 不可抢占只能主动释放 ④ 循环等待P→P 成环 进程等待环 P0 P1 P2
点击左侧任一条件,查看其含义;勾选「四条件全满足」观察循环等待如何导致死锁。
提示:四条件同时成立才会形成等待环。
示意图:左侧四个条件为死锁的「必要条件」;右侧橙色流动环表示进程间互相等待,四条件俱全时即为死锁。

相关知识点

process-and-thread process-synchronization-semaphore

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。