408 OS
死锁
知识树
概述
进程
同步
死锁
内存
文件
I/O
💀 死锁
死锁的必要条件 · 资源分配图 · 银行家算法安全检测
必要条件
资源分配图
银行家算法
🔐 死锁四个必要条件
四个条件同时满足时,死锁一定发生(必要条件 = 死锁 → 四个条件都成立)
🔒
互斥条件
进程对资源的访问是互斥的,资源同时只能被一个进程使用。
注:非共享资源(如打印机)才有互斥性。
✋
不剥夺条件
进程获得的资源,在主动释放前不能被其他进程夺走。
OS不能强行回收已分配资源。
🤲
请求并保持
进程已持有至少一个资源,又请求新资源,且不释放已持有的资源。
一边拿着筷子,一边等另一根。
🔄
循环等待条件
存在一个进程等待链:P₀→P₁→P₂→…→Pₙ→P₀。
资源分配图中有环(且环上每个资源只有一个实例时,环 ↔ 死锁)。
记忆口诀:
「
互
相
不
让,
请
你
循
环」(互斥、不剥夺、请求并保持、循环等待)
处理死锁的三种策略:
死锁预防(破坏条件)、死锁避免(银行家算法)、死锁检测与恢复
🕸️ 资源分配图(RAG)
观察三种场景:安全无死锁 · 有环但无死锁 · 死锁
安全场景
有环无死锁
死锁场景
✅
安全:
资源分配图无环,或虽有环但资源有多实例可以分配。此场景中P₁持有R₂、申请R₁;P₂持有R₁、申请R₂——但R₁和R₂各有两个实例,所以有安全序列。
⚠️
有环但无死锁:
当资源有
多实例
时,环不一定意味着死锁。此场景中R₁有两个实例,P₁和P₂各持有一个,可以都继续执行。
❌
死锁!
每个资源只有一个实例,且形成环路P₀→R₁→P₁→R₂→P₀。
化简结果:
无法完全化简,剩余环即为死锁进程。
图化简算法(死锁检测):
1. 找
非阻塞
进程(所有请求边都能满足)→ 去掉它的所有边
2. 重复步骤1,直到没有可化简的进程
3.
若所有进程都能被化简
→ 无死锁;
若剩余进程无法化简
→ 剩余进程处于死锁状态
🏦 银行家算法
动态检测系统是否处于安全状态 · 点击预定义请求或手动输入
算法思想(Dijkstra):
进程申请资源时,系统先
试探分配
,然后检查分配后系统是否处于安全状态。 若安全则批准申请;否则让进程等待。
安全状态:
存在一个进程执行序列,使得每个进程都能获得所需的最大资源。
安全检测
资源请求模拟
▶ 运行安全检测
↺ 重置
点击「运行安全检测」开始
模拟请求:
点击下方按钮模拟不同进程的资源请求,观察系统是否批准。
P₁申请(1,0,2)
:P₁已持有(2,0,0),再申请(1,0,2),共需(3,3,2) ≤ 最大需求 ✅
P₃申请(3,3,0)
:P₃已持有(3,0,2),再申请(3,3,0),超过最大需求(5,3,2) ❌
P₁申请(1,0,2)
P₃申请(3,3,0) ❌
↺ 重置
点击上方按钮模拟资源请求