Skip to content

算法Algorithm

信用分配终止检测

Credit distribution termination detection · Weight-throwing termination detection

让每份活动工作与在途消息携带正信用,以精确总量守恒判定何时全部责任已归还根。

形式陈述 ​

信用分配用一个可分割但不可复制的总量,解决分布式终止检测。固定单一初始活动根r、可靠恰好一次最终交付、无故障且没有外部注入的基本计算。控制层可以把归还消息可靠路由到r。

根初始信用w[r]=1,其余节点信用0。信用是精确非负有理数,不是允许舍入的浮点估计。每条基本消息携带严格正信用,每个活动节点也保留严格正信用。规则如下:

text
活动节点v发送任务m:
  选择0 < a < w[v]
  w[v] -= a
  发送(m,a)

节点v收到(m,a):
  w[v] += a
  基本状态变为active

非根v变为passive:
  发送RETURN(w[v])给r
  w[v] = 0

根收到RETURN(a):
  w[r] += a             // 控制消息不激活基本计算

根在passive且w[r] == 1时:Announce

每次信用转移与消息入/出信道按一个本地事件处理。根变被动时保留其信用。非根归还后仍可接收新任务并再次活动,新任务携带的新信用重新支撑它;先前的RETURN无需撤回。

直觉

每份未完成责任都必须带走一点信用。根若还缺哪怕极小一份,可能是一个活动工作者还拿着,也可能是基本任务在途中,还可能是归还信用的控制消息没到。

不能让发送者把全部信用随任务发走,自己却仍保持active。那会出现仍可继续工作的零信用节点,根收齐1不再能排除它。只分出严格小于现有信用的一部分,让发送者与新任务各自有正数见证。

这与按任务数量计数不同。一次任务可以派生任意多次有限分流,每次把现有信用再分开;只要使用精确分数并且总量不变,就不必预先知道会产生多少任务。

r保留1/4,p持1/4,q持1/2;归还期间信用先进入RETURN信道,不能同时留在发送者。
例子与边界

分流与归还分别记账 ​

令r先给p发送1/2信用,再给q发送1/4,自己保留1/4。p收到后再分出1/4给q。按表中顺序交付:

事件后 r持有 p持有 q持有 在途基本信用 在途归还信用
r发出两项任务 1/4 0 0 3/4 0
p、q分别接收 1/4 1/2 1/4 0 0
p再发任务给q 1/4 1/4 1/4 1/4 0
q接收 1/4 1/4 1/2 0 0
p完成并归还 1/4 0 1/2 0 1/4
p的归还到r 1/2 0 1/2 0 0
q完成并归还 1/2 0 0 0 1/2
q的归还到r 1 0 0 0 0

假定r派发后已经被动。倒数第二行基本计算已经真正终止,但检测器还不能宣布,因为有1/2信用正在RETURN中。最后一行才得到根的本地完成证书。允许晚宣布是正确的;提前宣布则可能丢掉仍在途的基本任务。

守恒式必须包含控制消息 ​

令B为在途基本消息,R为在途RETURN消息。核心不变量是

∑vw[v]+∑m∈Bw[m]+∑a∈Rw[a]=1.

每次发送把信用从节点转入消息,每次接收把它从消息转入节点,因此保持等式。归还也遵循同一规则:若只计算基本信道,非根发RETURN时总量会凭空减少;若发RETURN后不清本地信用,总量则被重复计入。

根被动且w[r]=1时,其他各项都只能为0。活动非根必须有正信用,在途基本消息也必须有正信用,所以二者都不存在。这给出安全性。基本计算若最终终止,每个非根最终把全部信用归还;有限多条归还消息最终送达,根便收齐1,给出最终检测。

精确性是一项算法条件 ​

假设某个活动节点仍持有 ε=2−54,根实际持有 1−ε。若根用常见双精度浮点存储,后者可能舍入成1。用浮点相等宣布完成,会把尚未归还的正信用抹掉。把“差小于某容差”当成完成条件也有同样问题。

另一种失效是反复减半后下溢为0,导致基本消息或活动节点不再持有正信用。解决需要精确数值表示,或者另行证明带补充信用握手的协议;不能由节点自行补一份信用,却不先让根更新其总量账本。

若消息可能重复,同一RETURN被算两次也会破坏守恒。消息身份、去重及信用入账必须配合,不能仅因有效载荷恰好是同一个分数就猜测它是否重传。

推论与应用

检测控制层在每次发送/接收做常数次有理数加减与分割;但“常数次数”不是常数位复杂度。若总共M次发送都采用减半,精确二进制分母的指数可达到O(M),普通分子表示也可能需要O(M)位。

单根模型中,每个非根的active区间至少由一条基本消息启动,故归还消息数至多M;若RETURN要经多跳到根,还应乘上相应路由长度。暂停或崩溃节点若一直扣着信用,检测不能结束;无故障假设在这里直接支撑活性。

Dijkstra–Scholten记录责任的父链和回执数量,信用算法记录可加的份额。二者都要覆盖在途任务,差别在于保留什么证明信息。信用分配适合递归分流清楚的工作池,代价是数值表示和信用生命周期必须受到严格管理。

参考资料
  • Wan Fokkink, Distributed Algorithms: An Intuitive Approach, MIT Press, 2013,§6.2及附录weight-throwing;本页固定精确分数版本,不引入书中的额外信用补充协议
  • Shing-Tsaan Huang, “Detecting Termination of Distributed Computations by External Agents,” ICDCS, 1989, 79–84,信用/权重方法的原始文献线索
关系图谱6 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系