Skip to content

死锁检测与解除

考情分析

死锁检测在 408 真题中偶有考查,常以资源分配图化简的形式出现。属于 🔥🔥 中频考点。

预防和避免都是在死锁发生前做文章,但代价不小。另一种思路是:先不管,允许死锁发生,但定期"体检",发现死锁了再治——这就是检测与解除。

死锁检测的思路

与死锁预防和避免不同,死锁检测允许死锁发生,但通过周期性检测来发现死锁,然后采取措施解除。

资源分配图

资源分配图是死锁检测的核心工具,它把进程和资源之间的"谁持有谁、谁在等谁"画成一张有向图,如果图中能消去所有边就没有死锁,消不干净就说明有进程被卡住了。具体来看:

  • 进程节点:圆圈 ○
  • 资源节点:方框 □(内部的点表示资源实例数)
  • 请求边:进程 → 资源(进程请求资源)
  • 分配边:资源 → 进程(资源已分配给进程)

上图中:P1 持有 R1、请求 R2,P2 持有 R2、请求 R1 → 形成环路 → 死锁。

资源分配图化简

化简规则

  1. 找到一个既不阻塞又非孤立的进程 P_i(即 P_i 的所有请求都能被满足)
  2. 删除 P_i 的所有请求边和分配边(模拟 P_i 运行完毕释放资源)
  3. 重复步骤 1-2
  4. 如果能消去所有边 → 不存在死锁;否则 → 存在死锁

化简与安全性算法的关系

资源分配图化简的过程本质上和银行家算法的安全性检查类似——都是尝试找到一个可以完成的进程序列。

化简示例

初始状态:
  P1: 持有 R1(1个), 请求 R2(1个)
  P2: 持有 R2(1个), 请求 R1(1个)
  P3: 持有 R1(1个)
  R1 总量: 2,  R2 总量: 1

化简过程:
  P3 不请求任何资源 → 可以完成 → 释放 R1(1个)
  现在 Available: R1=1, R2=0
  P1 请求 R2(1个),但 R2 可用=0 → 不能满足
  P2 请求 R1(1个),R1 可用=1 → 可以满足!
  P2 完成 → 释放 R1(1个), R2(1个)
  现在 Available: R1=2, R2=1
  P1 请求 R2(1个),R2 可用=1 → 可以满足!
  P1 完成 → 所有边消除 → 不存在死锁

化简失败 = 死锁

把上面的例子改一个数字看反例:

初始状态:
  P1: 持有 R1(1个), 请求 R2(1个)
  P2: 持有 R2(1个), 请求 R1(1个)
  P3: 持有 R1(1个), 请求 R2(1个)   ← P3 也开始请求 R2
  R1 总量: 2,  R2 总量: 1

化简过程:
  P3 有请求边(请求 R2),且 R2 当前可用=0 → 阻塞
  P1 阻塞(请求 R2,R2 可用=0)
  P2 阻塞(请求 R1,R1 已全部分给 P1/P3)
  → 没有任何进程能完成 → 化简卡住 → 存在死锁

  被锁住的进程集合: {P1, P2, P3}
  ── 这就是「死锁进程集」,是死锁解除时要处理的对象

化简的两个判定要点

  • 化简能消去所有边 → 不存在死锁;只要还有边没消去 → 死锁
  • 资源分配图中存在环路是死锁的必要不充分条件——只有当环路上每种资源都只有 1 个实例时才必死;多实例时要靠化简

死锁检测算法

与银行家算法的安全性检查类似,但有一个重要区别:

对比银行家算法死锁检测算法
使用的需求量Need(最大需求-已分配)当前请求(Request)
时机分配前检查分配后检查
乐观程度保守(考虑最大需求)乐观(只看当前请求)

交互可视化

加载可视化中...

死锁解除

检测到死锁后,需要采取措施解除:

1. 终止进程

方式说明代价
终止所有死锁进程简单粗暴代价最大,可能白费大量工作
逐个终止每次终止一个进程后重新检测开销大(每次都要重新检测)

逐个终止时,选择哪个进程终止的考虑因素:

  • 进程优先级
  • 已执行的时间和还需要的时间
  • 已使用的资源数量
  • 进程类型(交互式 vs 批处理)

2. 资源剥夺

从死锁进程中强制剥夺资源给其他进程使用。

需要考虑:

  • 从哪个进程剥夺(代价最小原则)
  • 回滚:被剥夺资源的进程需要回退到某个安全状态
  • 防止饥饿:不能总是剥夺同一个进程的资源

死锁检测的时机

策略说明
每次资源请求时实时性好,但开销大
定时检测折中方案
资源利用率下降时按需检测

考研高频考点

  • 🔥🔥🔥 资源分配图的化简过程
  • 🔥🔥 死锁检测算法与银行家算法的区别(用 Request 而非 Need)
  • 🔥🔥 死锁解除的两种方式(终止进程/资源剥夺)
  • 🔥 选择终止进程时的考虑因素

到这里,进程管理的全部内容就结束了。下一章进入内存管理,看操作系统如何为进程分配和保护内存空间。

真题练习

相关真题(12题)

2022Q26选择题2分

空闲空间管理:位示图大小固定,与空闲块数量无关

死锁
2021Q31选择题2分

设备独立性:更换物理设备后不需要修改应用程序

死锁
2020Q27选择题2分

Peterson算法:能保证互斥且不会饥饿

死锁
2019Q30选择题2分

死锁:银行家算法用于避免死锁而非检测死锁

死锁
2018Q26选择题2分

安全性检测:可用资源=4-2-1-0=1,只够P3先执行

死锁
2016Q25选择题2分

死锁最少进程数:3个进程形成循环等待即可死锁

进程与线程基本概念死锁
2015Q26选择题2分

死锁避免vs检测:避免需要资源总量信息且拒绝不安全分配,不限制申请顺序

死锁
2014Q24选择题2分

死锁避免:最坏情况每个进程差1台,(3-1)+(4-1)+(5-1)+1=10

死锁
2013Q32选择题2分

银行家算法:避免死锁而非预防,安全状态一定无死锁,不安全不一定死锁

死锁
2012Q27选择题2分

银行家算法:根据资源分配表找出安全序列

死锁
2011Q27选择题2分

银行家算法:系统处于不安全状态,不存在安全序列

死锁
2009Q25选择题2分

信号量值:S=1>0表示有1个资源可用,无等待进程

进程与线程基本概念死锁