“Dijkstra令牌环用一个特殊根和多值寄存器,从任意环状态恢复唯一特权;Herman协议在同步奇数环上用独立随机位,以概率一恢复单令牌。前者量化全部中央调度,后者还要区分所有硬币序列与概率…”
形式陈述
Dijkstra令牌环是一个确定性自稳定协议。n≥2个进程按
中央daemon每步选择一个使能进程,原子地检查前驱值并更新本地。只要存在使能进程就继续选择,不能凭空停止;不另加公平性假设。规则为
一个使能条件称为一份特权,也可视为逻辑令牌。合法集L是“恰好一个进程使能”的配置集合。普通节点在不同值边界处持令牌,根却在与前驱相同时持令牌;这个不对称正是构造的一部分。
原文用0到N共N+1台机器,并先写K>N。本页n=N+1,因此采用K≥n,避免把节点数与最大编号混淆。这里不讨论更小K能达到的精确阈值。
直觉
普通节点只会复制颜色,不会产生新颜色。根负责在整圈追上自己以后换一种颜色,再让这个新值沿环向后传播。
损坏状态可以有很多颜色边界,因而有多个特权。关键是根最终会使用一种在当前起点的所有普通节点中都不存在的颜色。这个颜色只能从根出发依次传播;当它到达最后节点时,中间节点已经全部被它覆盖,多余边界便消失。
令牌不是额外存储的布尔量,而是相邻寄存器关系。恢复完成后,唯一使能节点执行一步,特权交给下一个节点,因而能支撑互斥访问的轮转。但从任意坏态开始的恢复阶段,可能确实有多个特权,不能在那时就宣称互斥。
例子与边界
四节点从四个特权开始
取n=K=4,配置按(x₀,x₁,x₂,x₃)排列。起始(0,1,2,0)中,根0使能,节点1与2也使能,节点3因0≠2也使能,实际共有四个特权。按下表调度:
| 执行节点 | 新配置 | 使能集合 |
|---|---|---|
| 初始 | (0,1,2,0) | |
| 0 | (1,1,2,0) | |
| 2 | (1,1,1,0) | |
| 3 | (1,1,1,1) | |
| 0 | (2,1,1,1) | |
| 1 | (2,2,1,1) | |
| 2 | (2,2,2,1) | |
| 3 | (2,2,2,2) |
第二次更新后已经进入L,不必等到所有寄存器相同才算合法。表中全相同状态只是特权位于根的一种合法形状。
总有特权,合法集闭包
若所有普通节点都不使能,便有
若唯一特权在根,所有值相同;根换色后,只在节点1产生一个不同值边界。若唯一特权在普通节点i,则所有其他普通相邻对相等,且根条件为假;i复制前驱后,特权移到i+1,或在i=n−1时回到根。这证明L的闭包,并且合法阶段每一步都推进唯一特权。
为什么任意中央调度都收敛
先证明根不可能从某时刻起永远不动。假设根固定,那么节点1至多再改变一次;节点2至多比节点1多改变一次,依次可知所有普通节点的总更新次数有限。它们最终全等于根,只有根使能,中央daemon必须选根,矛盾。因此无限执行中根会无限次换色。
在任意起点,n−1个普通节点至多占用n−1种颜色。K≥n保证存在一种颜色c没有出现在任何普通节点。普通节点只能复制,因此在根第一次持有c以前,它们也不能凭空产生c。若根起点已经持有c,就从这里开始;否则根逐次模K递增,最终第一次写入c。
此后根在最后节点也变c以前不能再动。c必须沿0、1、…、n−1依次传递;一旦某个前缀都为c,该前缀在根不变时不会退回旧色。最后节点首次得到c时全环同色,已经属于L。于是收敛不是依赖某个幸运调度,而是由复制方向与根换色强制完成。
原子模型不能随意改动
本页一次动作同时读取相关旧值并写本地,且中央daemon每次只动一个进程。若把它拆成相隔很久的读写,或允许多个节点基于同一个旧配置同时更新,就改变了状态转移关系,不能直接沿用上面的唯一特权移动证明。
特殊根也是可信输入。所有节点改用相同复制规则,会让全相同配置没有任何特权;这不是在匿名环上顺便解决了选主,而是换成了另一个不能继续服务的协议。
推论与应用
每次动作只读一个前驱并更新一个本地寄存器,为O(1)寄存器操作;每节点需
上述证明还能给一个宽松步数界。根固定的任一区间内,普通节点i至多更新i次,所以总共至多
合法后只有一个节点使能,调度器没有跳过它而选择别人的机会,故令牌持续环行。算法恢复的是可运行的唯一特权,而非全网静止;这一点与静默树协议的终点完全不同。
参考资料
- Edsger W. Dijkstra, “Self-Stabilizing Systems in Spite of Distributed Control”, CACM 17(11), 1974, 643–644,K-state方案、中央daemon与编号约定
- Wan Fokkink, Distributed Algorithms: An Intuitive Approach, MIT Press, 2013,§18.1:令牌环、自稳定与颜色传播