并行与分布式系统中的分布式互斥算法:Suzuki-Kasami广播算法
字数 2388 2025-11-05 08:30:58
并行与分布式系统中的分布式互斥算法:Suzuki-Kasami广播算法
题目描述
Suzuki-Kasami算法是一种基于令牌的分布式互斥算法,用于在无中心协调节点的系统中实现临界区(Critical Section)的互斥访问。该算法通过结合广播请求和令牌传递机制,确保任一时刻仅有一个进程持有令牌并进入临界区。与集中式或基于仲裁集的算法不同,Suzuki-Kasami算法通过维护一个请求队列和令牌向量来减少消息开销,适用于异步分布式环境。
核心目标
- 安全性:保证至多一个进程同时处于临界区。
- 活性:每个请求最终都能获得令牌,避免饥饿。
- 低通信开销:尽量减少消息数量(尤其是临界区访问频繁时)。
解题过程循序渐进讲解
步骤1:算法基础设定
- 系统中有 \(N\) 个进程 \(P_0, P_1, \dots, P_{N-1}\),每个进程有唯一标识。
- 进程间通过可靠的消息传递通信(消息不丢失,但可能延迟)。
- 初始时,某个进程持有令牌(Token),令牌包含两个核心数据结构:
- LN[1..N]:长度为 \(N\) 的数组,记录令牌持有者已知的各进程最后一次完成临界区访问的请求编号。
- Q:一个队列,保存当前正在等待令牌的进程请求。
- 每个进程 \(P_i\) 本地维护:
- RN_i[1..N]:数组,记录 \(P_i\) 已知的其他进程的最高请求编号。
- req_num_i:本地计数器,记录 \(P_i\) 自己发出的请求编号(单调递增)。
步骤2:进程请求进入临界区
当进程 \(P_i\) 需要进入临界区时:
- 更新本地状态:
- 递增
req_num_i。 - 设置
RN_i[i] = req_num_i。
- 递增
- 广播请求消息
REQUEST(i, req_num_i)给所有其他进程。 - 等待令牌到达。
设计意图
- 广播请求是为了通知其他进程:“我需要令牌”。
RN_i帮助进程跟踪其他进程的请求进度,避免遗漏请求。
步骤3:进程收到REQUEST消息时的处理
当进程 \(P_j\) 收到 REQUEST(i, n) 消息时(\(n\) 为请求编号):
- 更新本地知识:设置
RN_j[i] = max(RN_j[i], n)。 - 检查当前是否持有令牌且自身不处于临界区:
- 若持有令牌,且令牌的
LN[i] < RN_j[i](表示 \(P_i\) 有新请求未被满足),则直接发送令牌给 \(P_i\)。
- 若持有令牌,且令牌的
关键点
LN[i] < RN_j[i]表示 \(P_i\) 的当前请求编号大于令牌中记录的最后满足的请求编号,说明 \(P_i\) 有新请求待处理。- 若进程正使用临界区,则暂不响应,等退出临界区后再处理。
步骤4:令牌持有者退出临界区时的操作
当进程 \(P_j\) 完成临界区操作后:
- 更新令牌中的
LN[j] = req_num_j(记录自己本次请求已被满足)。 - 遍历所有进程 \(P_k\)(\(k \neq j\)):
- 若
LN[k] < RN_j[k](表示 \(P_k\) 有未满足的请求),且 \(P_k\) 不在令牌队列 Q 中,则将 \(P_k\) 加入 Q。
- 若
- 若队列 Q 非空,从 Q 头部取出一个进程 \(P_m\),发送令牌给 \(P_m\)。
- 若 Q 为空,则保留令牌。
设计逻辑
- 通过比较
LN和本地RN_j,令牌持有者能发现哪些进程有未处理的请求。 - 队列 Q 保证了公平性:请求按顺序被满足(通常按入队顺序)。
步骤5:进程收到令牌后的操作
当进程 \(P_i\) 收到令牌时:
- 从令牌中复制
LN到本地,更新RN_i为max(RN_i, LN)(同步最新状态)。 - 检查自己的请求是否已被满足:
- 若
LN[i] < req_num_i,说明自己的当前请求未被处理,则进入临界区。 - 否则,说明请求已被过期处理(例如重复收到令牌),则直接转发令牌给其他等待进程。
- 若
安全性保障
- 令牌的唯一性确保同一时间只有一个进程进入临界区。
- 令牌携带的
LN向量避免了重复响应历史请求。
步骤6:示例场景(3个进程)
假设系统有 \(P_0, P_1, P_2\),初始令牌在 \(P_0\):
- 时刻1:\(P_1\) 请求临界区,广播
REQUEST(1,1)。- \(P_0\) 收到请求,更新
RN_0[1]=1,但 \(P_0\) 未用临界区,比较令牌中LN[1]=0 < RN_0[1]=1,立即发送令牌给 \(P_1\)。
- \(P_0\) 收到请求,更新
- 时刻2:\(P_1\) 持令牌进入临界区。此时 \(P_2\) 广播
REQUEST(2,1)。- \(P_1\) 忙,暂不响应;\(P_0\) 更新
RN_0[2]=1。
- \(P_1\) 忙,暂不响应;\(P_0\) 更新
- 时刻3:\(P_1\) 退出临界区,更新令牌
LN[1]=1,检查发现LN[2]=0 < RN_1[2]=1,将 \(P_2\) 加入 Q,发送令牌给 \(P_2\)。
消息复杂度分析
- 最佳情况:令牌持有者直接检测到请求,仅需 1 条消息(令牌传递)。
- 最差情况:广播请求需 \(N-1\) 条消息,但频繁访问时平均消息数趋近 \(O(1)\)。
总结
Suzuki-Kasami算法通过令牌的 LN 向量和进程的 RN 向量协同工作,减少了不必要的令牌传递消息,同时保证了公平性和活性。其优势在于低延迟(令牌持有者可直接响应请求),但需维护向量状态,适合中小规模分布式系统。