🌱 Stage 1

distributed algorithm

分布式算法

模型:

  • 异步共享存储
  • 异步msg传递
  • 同步msg传递

拓扑:无向图,节点为处理机,边喂双向信道. 算法:由每个处理器上的局部程序构成,包括本地计算和收发msg 节点 pip_i, pip_i 相邻的边 rr 条. pip_i 有两个 buffer list: outbufi[l]outbuf_i[l] , inbufi[l]inbuf_i[l], l∈[1,r]l \in [1, r]

配置:某时刻,算法运行的全局状态。为一个向量 (q0,…,qn−1)(q_0, \ldots, q_{n-1}), qiq_i 是 pip_i 的状态.

状态

事件:两种

  • comp(i)comp(i), 计算事件.
  • del(i,j,m)del(i,j,m), 传递事件,将msg mm 从 pip_i 传递到 pjp_j.

转换函数

执行: 配置和事件交错的序列。

  • Safety 条件。 (用来证明算法正确性吗?) 该条件在每个有限前缀里的都成立
  • Liveness 条件。 必须成立一定次数。

满足所有安全性条件的序列称为一个执行, 满足所有活跃性条件的 执行 为 容许(admissible) 的执行。

下面主要考虑异步msg传递系统。

执行片段 α\alpha 是一个有限或无限的序列:

C0,Φ1,C1,Φ2,C2,…,C_0, \Phi_1, C_1, \Phi_2, C_2, \ldots, 其中 CkC_k 是一个配置, Φk\Phi_k 是一个事件.

如果 α\alpha 有限, 则它必须结束于某个配置, 且需满足下述条件:

  1. 若 Φk=del(i,j,m)\Phi_k = del(i,j,m), 则 mm 必须是 Ck−1C_{k-1} 时 outbufi[l]outbuf_i[l] 的元素. ll 是 pip_i 信道 pi,pj{p_i, p_j} 的标号. 从 Ck−1C_{k-1} 到 CkC_k 的唯一变化是将 mm 从 Ck−1C_{k-1} 里的 outbufi[l]outbuf_i[l] 中 删去, 加入到 CkC_k 的 inbufi[h]inbuf_i[h], hh 是 pjp_j 的信道 pj,pi{p_j, p_i} 的标号.
  2. 若 Φk=comp(i)\Phi_k = comp(i), 则 Ck−1C_{k-1} 到 CkC_k 的变化是
    1. 改变状态: 转换函数在pip_i 的可访问状态(在配置Ck−1C_{k-1}里)上进行操作,清空 inbufi[l]inbuf_i[l],(1≤l≤r)(1≤l≤r)
    2. 发送 msg: 将转换函数制定的消息集合加入 CkC_k 里的变量 outbufioutbuf_i 上

调度 , 调度(或调度片段)总是和执行(或执行片段)联系在一起, 它是执行中的时间序列:

Φ1,Φ2,… \Phi_1, \Phi_2, \ldots

并不是每个事件序列都是调度. 例如, del(1,2,m)del(1,2,m) 不是调度, 因为在此时间之前, p1p_1 没有 send m.

若局部程序是确定的, 则执行(或执行片段)由 初始配置 C0C_0 和调度(或调度片段) σ\sigma 唯一确定, 可表示为 exec(C0,σ)exec(C_0, \sigma)

容许执行: 满足活跃性条件的执行.

容许调度: 容许执行的调度.

同步系统, 同步模型中, 执行分为轮, 每轮里, (1)每个处理器能够发送一个 msg 到每个邻居 (2) 每个处理器一接到 msg 就进行计算.

轮 同步系统中, 每轮由一个传递时间(outbuf发送, 清空), 紧跟一个计算时间 (处理所有msg)

终止, 所有处理机均处于终止状态且没有msg 在传输.

msg复杂度

实际很少用状态转换来描述算法, 往往用伪码描述.

生成树

💬 评论加载中...