💀 死锁

死锁的必要条件 · 资源分配图 · 银行家算法安全检测
必要条件 资源分配图 银行家算法
🔐 死锁四个必要条件
四个条件同时满足时,死锁一定发生(必要条件 = 死锁 → 四个条件都成立)
🔒
互斥条件
进程对资源的访问是互斥的,资源同时只能被一个进程使用。
注:非共享资源(如打印机)才有互斥性。
不剥夺条件
进程获得的资源,在主动释放前不能被其他进程夺走。
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) ❌
点击上方按钮模拟资源请求