20.4 令牌环互斥
一句话
令牌环用 “环上只有一个令牌” 保证互斥:拿到令牌才能进临界区,用完传给下一个;消息量 O(1),但延迟 O(N)——它的全部难点不在算法,而在环的维护(加入、离开、令牌丢失)。
机制
节点按环排列:A → B → C → D → A
令牌在环上单向传递;持有者进临界区,用完后把令牌传给后继。
| 特性 | 表现 |
|---|---|
| 互斥保证 | 单令牌 → 天然互斥 |
| 消息数/次 | 1(传令牌),跨节点传递 |
| 进入延迟 | 平均 N/2 跳,最坏 N 跳 |
| 公平性 | 严格轮转(FIFO) |
| 容错 | 差(任一环断裂即停摆) |
三个必须解决的问题
| 问题 | 现象 | 解法 |
|---|---|---|
| 令牌丢失 | 整个系统停摆(没人能进) | 超时检测 + 指定节点重新生成(需要唯一性,防重复令牌) |
| 节点离开 | 环断裂,令牌传不下去 | 前驱改指向后继(需要成员视图) |
| 节点假死 | 令牌卡在它手里 | 租约/超时后跳过它,或踢出环 |
“重新生成令牌” 是最危险的操作:若旧令牌还活着,就会出现双令牌 = 双进入。所以重建必须由唯一权威(leader)执行,并配合 fencing。
数字:延迟随规模线性增长
| 节点数 N | 平均等待(跳) | 最坏(跳) |
|---|---|---|
| 5 | 2.5 | 5 |
| 50 | 25 | 50 |
| 500 | 250 | 500 |
若每跳 1ms,N=500 时平均等待 250ms——对高频互斥不可接受。
集中式与全票方案的对比见 20.2 集中式互斥 (协调者)、20.3 分布式互斥 (Ricart-Agrawala / 全票通过)。
实测:跳数与延迟的线性关系
同一套模拟(每次进入 = 令牌传递一圈中的一段):
| N | 10 次进入的总传递跳数 | 平均等待(跳) |
|---|---|---|
| 3 | 30 | 1.5 |
| 5 | 50 | 2.5 |
| 10 | 100 | 5.0 |
| 50 | 500 | 25.0 |
若每跳 1ms,N=50 时平均要等 25ms 才能进入临界区——对 “每秒上万次加锁” 的场景完全不可用;但对 “每分钟几次” 的仲裁类操作(选主、配额分配)完全够用。
总跳数 = N × 进入次数 平均等待 = N / 2 跳
N=50、进入 10 次 → 500 跳,平均等 25 跳
反模式
| 反模式 | 后果 |
|---|---|
| 无令牌丢失检测 | 一次丢包导致全系统停摆 |
| 多个节点都能重建令牌 | 双令牌,互斥失效 |
| 环成员变更不做版本 | 新旧视图并存,环分裂 |
| 在高频互斥场景使用 | 延迟 O(N),吞吐上不去 |
三条铁律
🔑 单令牌是互斥的全部;任何 “可能有第二个令牌” 的实现都是错的。
🔑 令牌重建必须唯一权威,并配 fencing。
🔑 环适合 “低竞争、成员稳定”;规模大或竞争高时换方案。
自检
Q1 令牌丢了怎么办?为什么不能随便重建?
▸ 答案:需要超时检测 + 唯一重建者。随便重建的风险是 “旧令牌仍在环上”:两个令牌同时存在 → 两个节点同时进临界区,互斥被破坏。所以重建要选一个权威(leader/最小 ID),并给令牌带单调版本号。
Q2 为什么令牌环的延迟是 O(N)?
▸ 答案:因为令牌只能沿环逐跳传递,一个节点想进入必须等令牌转一圈到达自己。平均要等 N/2 个节点各持有一段时间,最坏 N 个。规模越大,等待越久——这是拓扑决定的,不是实现问题。
Q3 令牌环与集中式互斥相比,优势在哪?
▸ 答案:没有中心单点,且天然公平轮转、消息量小(每次 1 条)。适合 “节点数少、竞争不激烈、希望严格轮流” 的场景(如总线仲裁、某些硬件/实时系统)。代价是容错差、延迟随 N 增长。
Q4 节点 “假死”(进程卡住但网络通)会怎样?
▸ 答案:令牌被它扣住,环停摆。需要租约式令牌:令牌带有效期,超时未传递则由后继发起 “跳过该节点” 的流程;但这又需要成员视图与防双令牌机制。
Q5 工程上还有哪些系统用类似令牌的思路?
▸ 答案:租约/令牌广泛用于选主(leader 持有租约)、限流(令牌桶)、以及某些分布式锁(带 TTL 的锁本质是 “时间受限的令牌”)。思路一致:用一个可验证的凭证把并发变成串行。
Q7 令牌环的 “消息少” 与 “延迟高” 为什么能同时成立?
▸ 答案:因为 “消息数” 与 “延迟” 是两个维度:每次进入只传 1 条令牌(消息少),但令牌要沿环逐跳走到你这里(延迟 O(N))。而 RA 是 “一次广播”(消息多、延迟 1 RTT)。所以令牌环适合 “节点少、竞争低、要求严格轮流”,不适合 “高频、大规模”。
Q6 令牌环的 “严格轮转” 会不会让热门节点总是等很久?
▸ 答案:会——轮转是按位置而不是按需求分配的,热点节点每次都要等令牌转一圈。这是 “公平” 的另一面:它保证没人被饿死,但不保证高需求方获得更多机会。高竞争场景应换成集中式(按队列)或按权重分配。
Q7 如果环上节点数动态变化,令牌环还成立吗?
▸ 答案:能成立,但复杂度会跳一个量级:需要成员视图(谁在环上)、加入/离开协议(前驱改指向)、令牌重建(唯一权威 + 版本号)。很多实现最终退化成 “用共识维护环成员”,那时令牌环的优势(消息少)已被成员管理的开销抵消。
关联
- 前置:20.1 互斥问题与临界资源 (安全性 / 活性)
- 并列:20.2 集中式互斥 (协调者)、20.3 分布式互斥 (Ricart-Agrawala / 全票通过)
- 下游:20.5 三种算法对比 (消息量 / 公平性 / 可用性)、21.11 领导者租约