考点频率:★★★☆☆(选择题常考,下午题偶尔结合资源分配图考查)
难度:⭐⭐⭐
建议:掌握资源分配图的简化方法,理解死锁恢复的两种策略及适用场景
1️⃣ 回顾:死锁处理的四种策略
整个死锁处理策略可以分为四个层次,前两篇已经讲了预防和避免:
| 策略 | 时机 | 核心思想 |
|---|---|---|
| 预防 | 系统设计时 | 破坏四个必要条件之一 |
| 避免(银行家算法) | 分配时 | 每次分配前检查是否安全 |
| 检测 | 运行中 | 定期检查是否存在死锁 |
| 恢复 | 死锁发生后 | 解除死锁,让系统继续运行 |
本篇聚焦于后两个策略:检测和恢复。
2️⃣ 死锁检测
2.1 检测的时机
- 定时检测:系统每隔一段时间(如每10分钟)运行一次死锁检测算法
- 事件触发:当进程等待超时或资源请求被阻塞时触发检测
2.2 核心工具:资源分配图
资源分配图是一种有向图,用于描述进程与资源之间的占用和等待关系,是死锁检测的核心工具。
- 节点:矩形表示资源类型(圆圈内数字表示资源数量),圆形表示进程
- 边:
- 资源 → 进程(分配边):表示该资源已被分配给该进程
- 进程 → 资源(请求边):表示该进程正在请求该资源
2.3 资源分配图的简化(判断是否死锁)
简化步骤:
- 在资源分配图中,找出一个既不阻塞又非孤立的进程结点:
- 该进程所请求的所有资源都能被满足(请求边能全部变为分配边)
- 如果存在这样的进程,则它可以运行完毕并释放所有资源
- 释放该进程占用的所有资源,删除该进程的所有边
- 重复步骤1-2,直到所有进程都能被简化删除(无死锁)或剩余进程无法简化(有死锁)
判定结论:
- 如果资源分配图可以完全简化(所有进程都被删除)→ 无死锁
- 如果资源分配图中存在环路且无法简化 → 有死锁(环路中的进程就是死锁进程)
2.4 单资源 vs 多资源实例
| 资源类型 | 环路与死锁的关系 | 说明 |
|---|---|---|
| 每类资源只有1个实例 | 环路 ⇔ 死锁 | 有环必死锁,等价关系 |
| 每类资源有多个实例 | 环路 ≠ 死锁 | 有环不一定死锁(可能通过其他实例满足) |
软考常考:画出资源分配图,要求判断是否发生死锁,并说明理由。
3️⃣ 死锁恢复
检测到死锁后,系统需要采取措施解除死锁,让进程继续运行。
3.1 恢复策略一:终止进程(最常用)
强制终止一个或多个死锁进程,回收其占用的资源。
终止策略的选择:
- 终止所有死锁进程:简单粗暴,但代价大
- 逐个终止:每次终止一个进程,释放资源后重新检测,直到死锁解除
选择终止哪个进程的依据:
| 考虑因素 | 说明 |
|---|---|
| 进程优先级 | 先终止优先级低的 |
| 已执行时间 | 先终止运行时间短的(损失小) |
| 占用资源数量 | 先终止占用资源多的(释放资源多) |
| 剩余执行时间 | 先终止剩余时间长的 |
| 进程类型 | 交互式进程优先于批处理进程 |
3.2 恢复策略二:资源抢占
从死锁进程中强行剥夺部分资源,分配给其他进程,打破循环等待。
资源抢占的三个问题:
- 选择被抢占的资源:通常选择代价最小的资源(如CPU寄存器状态比打印机缓冲区更容易保存)
- 被抢占进程的回滚:必须将进程回滚到某个安全状态(如检查点)
- 防止饥饿:同一个进程不能被反复抢占,否则永远无法完成
3.3 两种恢复策略的对比
| 对比项 | 终止进程 | 资源抢占 |
|---|---|---|
| 实现复杂度 | 简单 | 复杂(需回滚机制) |
| 恢复速度 | 快 | 较慢 |
| 损失 | 终止进程的全部工作丢失 | 仅丢失部分工作(可回滚) |
| 适用场景 | 批处理系统、对实时性要求高的系统 | 交互式系统、事务型系统(如数据库) |
4️⃣ 死锁、饥饿、活锁的对比
这是软考中容易混淆的三个概念:
| 对比项 | 死锁 | 饥饿 | 活锁 |
|---|---|---|---|
| 定义 | 多个进程互相等待对方占有的资源 | 某个进程长期得不到所需资源 | 进程不断改变状态,但始终无法推进 |
| 进程状态 | 所有相关进程阻塞 | 被饿死的进程阻塞,其他进程可能正常运行 | 进程在运行(非阻塞),但没有实质性进展 |
| 能否自行解除 | 不能,需要外部干预 | 如果调度策略改变(如优先级老化)可能自行解除 | 可能自行解除(如果冲突碰巧解决) |
| 典型场景 | A等B,B等A | 低优先级任务永远等不到CPU | 两个进程在走廊里互相让路,但总是让到同一侧,永远过不去 |
| 资源占用 | 每个进程都占有一些资源 | 被饿死的进程可能没有资源(一直在等待) | 进程可能在占用资源,但无法推进 |
区分要点:死锁是“大家都在等”,饥饿是“你一个人在等”,活锁是“大家都在动但没人前进”。
5️⃣ 经典例题
例题1:某系统资源分配图如下:
- 资源R1有1个实例,被P1占用,P2正在请求R1
- 资源R2有1个实例,被P2占用,P1正在请求R2
问:系统是否发生死锁?
解析:
- 分配边:R1→P1,R2→P2
- 请求边:P1→R2,P2→R1
- 形成环路:P1 → R2 → P2 → R1 → P1
- 每个资源都是单实例,环路上的进程无法继续推进
答案:发生了死锁,死锁进程为P1和P2。
例题2:下列关于死锁检测和恢复的叙述中,正确的是( )。
A. 资源分配图中存在环路,则系统一定发生死锁
B. 死锁检测只能在系统死锁后才能进行
C. 终止所有死锁进程是常用的死锁恢复方法
D. 资源抢占策略不需要进程回滚
解析:
- A错误:多实例资源场景下,存在环路不一定死锁
- B错误:检测可以定期运行,不一定要等到系统完全卡死
- C正确:终止进程是最常用的恢复策略
- D错误:资源抢占通常需要进程回滚
答案:C
例题3(活锁辨析):两个进程P1和P2共享两个资源R1和R2,它们都在不断尝试获取两个资源,每次拿到一个后发现另一个被占用就释放已拿到的资源,如此反复。这种情况属于( )。
A. 死锁
B. 饥饿
C. 活锁
D. 互斥
解析:进程没有阻塞(每次尝试都在运行),但始终无法取得两个资源完成工作,属于活锁。选 C。
6️⃣ 记忆口诀
死锁检测看资源图,简化删除找路径。
全部删除算安全,剩环说明已死锁。
恢复终止或抢占,终止简单回滚难。
死锁活锁与饥饿,三者区分要记全。
7️⃣ 小测验(评论区对答案)
某系统有3个进程P1、P2、P3,资源R1和R2各有1个实例。当前分配:R1被P1占用,R2被P2占用。P1请求R2,P2请求R1,P3正在运行且不请求任何资源。问:
- 当前系统是否发生了死锁?
- 如果死锁发生,死锁进程是哪些?
🔔 本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #死锁检测 #死锁恢复 #资源分配图 #操作系统
980

被折叠的 条评论
为什么被折叠?



