并行与分布式系统中的死锁检测:Chandy-Misra-Haas算法
字数 1677 2025-10-27 08:13:40
并行与分布式系统中的死锁检测:Chandy-Misra-Haas算法
题目描述
在分布式系统中,多个进程可能因竞争资源陷入死锁(例如进程A持有资源R1并等待R2,进程B持有R2并等待R1)。Chandy-Misra-Haas算法是一种基于资源分配图(Resource Allocation Graph, RAG)的分布式死锁检测方法,适用于每个资源仅能被单个进程独占的场景。算法通过进程间传递特殊消息(如探测消息)来检测是否存在循环等待条件,从而判断死锁是否发生。
解题过程循序渐进讲解
1. 资源分配图(RAG)建模
- 节点类型:
- 进程节点(P₁, P₂, ...)
- 资源节点(R₁, R₂, ...)
- 有向边:
- 请求边(Pᵢ → Rⱼ):表示进程Pᵢ正在等待资源Rⱼ。
- 分配边(Rⱼ → Pᵢ):表示资源Rⱼ已分配给进程Pᵢ。
- 关键假设:
- 每个资源只有单个实例(如一台打印机)。
- 边是单向的,且资源分配后才会产生依赖关系。
示例:
假设系统中有两个进程P₁、P₂和两个资源R₁、R₂:
- P₁持有R₁,但等待R₂(即R₁→P₁,P₁→R₂)。
- P₂持有R₂,但等待R₁(即R₂→P₂,P₂→R₁)。
此时资源分配图中存在循环P₁→R₂→P₂→R₁→P₁,系统死锁。
2. 算法核心思想:扩散式探测
Chandy-Misra-Haas算法通过探测消息(probe)在进程中传递,检测循环等待:
- 触发条件:当进程Pᵢ因等待资源Rⱼ被阻塞时,Pᵢ向Rⱼ的当前持有者发送探测消息。
- 消息格式:
probe(Pᵢ, Pⱼ, Rⱼ),表示“Pᵢ正在等待被Pⱼ持有的资源Rⱼ”。 - 传递规则:
- 若进程Pⱼ收到
probe(Pᵢ, Pⱼ, Rⱼ),且Pⱼ自身也在等待其他资源,则Pⱼ将消息转发给所有它正在等待的资源持有者。 - 若某进程收到一条探测消息,且消息中的初始发起者(Pᵢ)与自己相同,说明检测到循环等待,死锁发生。
- 若进程Pⱼ收到
3. 算法步骤详解
步骤1:初始化
- 每个进程维护一个依赖表,记录当前等待关系和已发送的探测消息。
- 初始时无探测消息传递。
步骤2:发送探测消息
- 当进程Pᵢ被阻塞(因请求资源Rⱼ未立即满足):
- Pᵢ向Rⱼ的当前持有者Pⱼ发送
probe(Pᵢ, Pⱼ, Rⱼ)。 - Pᵢ将本次探测记录在本地,避免重复发送。
- Pᵢ向Rⱼ的当前持有者Pⱼ发送
步骤3:转发探测消息
- 进程Pⱼ收到
probe(Pᵢ, Pⱼ, Rⱼ)后:- 若Pⱼ未被阻塞(未等待任何资源),则忽略该消息(无死锁风险)。
- 若Pⱼ也被阻塞(例如在等待资源Rₖ),则Pⱼ向Rₖ的持有者Pₗ转发
probe(Pᵢ, Pₗ, Rₖ)。 - 注意:消息中的初始发起者Pᵢ保持不变,但中间进程和资源字段更新。
步骤4:检测死锁
- 若进程Pᵢ收到一条
probe(Pᵢ, Pᵢ, Rₘ)(即发起者与接收者相同),说明存在Pᵢ→...→Pᵢ的循环,死锁被确认。 - 此时系统可触发死锁处理机制(如终止进程或回滚)。
4. 实例演示
假设系统中有三个进程P₁、P₂、P₃和资源R₁、R₂、R₃:
- P₁持有R₁,等待R₂。
- P₂持有R₂,等待R₃。
- P₃持有R₃,等待R₁。
死锁检测过程:
- P₁因等待R₂被阻塞,向R₂的持有者P₂发送
probe(P₁, P₂, R₂)。 - P₂收到消息后,因自己也在等待R₃,向R₃的持有者P₃转发
probe(P₁, P₃, R₃)。 - P₃收到消息后,因自己也在等待R₁,向R₁的持有者P₁转发
probe(P₁, P₁, R₁)。 - P₁收到
probe(P₁, P₁, R₁),发现发起者是自身,死锁确认。
5. 算法特性与注意事项
- 假阳性问题:算法可能因消息延迟或并发操作误报死锁(但不会漏报)。
- 复杂度:消息数量在最坏情况下为O(|E|)(E为RAG中的边数)。
- 局限性:仅适用于单实例资源,多实例资源需使用其他算法(如银行家算法)。
通过以上步骤,Chandy-Misra-Haas算法以分布式方式高效检测死锁,无需全局状态同步,适合大规模系统。