RandomAttack algorithm

来源:互联网 发布:音视频编辑软件 编辑:程序博客网 时间:2024/06/18 13:40

有通信链路故障的同步完全图网络下,进程一致性算法

问题形式化描述:

有n个进程,每个进程可以选择(0,1)中的某个值,要求这些进程做决定前满足

  1. 一致性(每个进程的最终结果要相同)
  2. 有效性:如果所有进程都从0开始,那么0就是唯一可能的决定值; 如果进程都以1作为初值并且所有消息都被传递,则1是唯一的决定值。(也就是说,初始状态有0,也有1的状态下,可以最终结果都是0或者最终结果都是1
  3. 终止性:所有进程最后都会做出决定。


随机化算法RandomAttack algorithm:(有一定的失败概率)

前提假设:

  1. 进程之间是完全图
  2. 为了计算算法失败的概率,假设通信链路发生故障并不是随机发生的,而是由一个“对手”指定的

形式化描述进程之间的关系:

    定义进程之间满足(i,k)上的偏序关系⊰,i是进程号,k是时间:

  •     ( i,k` )⊰( i,k ) 当 k` <= k时。
  •     如果 进程 i 与 进程 j 之间有消息传递(i 传给 j),则 (i, k-1)⊰ (j, k)
  •     ⊰可以传递。

    定义每个进程i在任意时间k的level:

  •     level(i,0) = 0
  •     某个k>0且存在某个j!=i,使得(j,0)⊰(i,k)不成立(存在j进程一开始就无法向i进程发消息),level(i,k) = 0
  •     某个k>0且对于所有j!=i,使得(j,0)⊰(i,k),则Lj表示max{ level(j,k`):(j,k`)<(i,k) }(在k时刻传递消息给i的所有j进程的之前状态(j,k`)中level最大的,而不能理解为j最后一次向i传递消息后的level), level(i,k) = 1+min{ Lj:j!=i }(传消息给i的所有进程j,如果Lj最小的达到了n,i的level就是n+1)
    由此可以产生一条定理:
        对于任意一个良好的通信模式,任意一个时刻k,任意两个进程 i,j, | level( i, k ) - level( j, k ) | <= 1:
         证明分析:
         观察下面这个通信过程的图:系统每轮通信都是进程先把自己的level广播,然后接受其他进程的level,然后更新自己的level:
         方块代表进程,箭头代表进程间的通信,每个进程中有进程编号,进程level,和维护系统所有进程有史以来最高级别的L向量
         首先我们能得知,level是单调递增的。
         如果链路不发生故障,每个进程中维护的level之差肯定不超过1,如图1,图2
         只要有某条链路发生故障,
         如果这个故障导致某个进程的level比其他进程慢一拍,如图3;在下一次信息传递中,由于level(i,k) = 1+min{ Lj:j!=i },其他进程会立刻停止level递增,如图4,等进程b跟上队伍一样。
         

random attack算法描述:
  • 算法在每一个进程内进行;
  • 每个进程维护一个三元组消息 msg(L,V,key),L是向量,保存所有进程的级别[ 0, r ],V是向量,保存所有进程的初值,[0, 1, undefined],key是[1, r]中的一个整数,或者是undefined
  • 每个进程有一个最终决定decision。
    每个进程初始化msg
    i 是本进程,j 是其他进程
    V[i] = 初始值0或1    V[j] = undefined
    L[i] = 0  L[j] = -1
    key = undefined
    执行流程:
    if (i == 1 && round == 0){
        key = random();//进程1随机产生一个key
    }
    for( round = 0; round<r; ++round ){
        send(msg(L, V, key));//发送消息msg
        msg(L1, V1, key1) = recv();//接收其他进程发来的消息
        for(每一个其他进程 j){
            L[j] = 本进程 i 收到的所有msg中 L1[j] 的最大值(这可以保证L中的数值差距也在1之内)
            如果V1[j] 不是 undefined,V[j] = V1[j]
        }
        L[i] = min{ L[j] }+1;
    }
    if( key != undefined && L[i] >= key && 对所有的j,V[j] == 1 ){
        decision = 1;
    } else{
        decision = 0;
    }

RandomAttack,分析,为什么这个算法在一定的概率下可以保证一致性,有效性,终止性
  • 终止性,显然
  • 有效性 和 一致性:
          根据上面的定理1,任意时刻,任意两个进程之间的level差不超过1
          如果random选择出来的 key > max(level),或者某些进程以初值0开始,则所有进程decision = 0
          如果random选择出来的 key <= min(level),且所有进程初值是1,则所有进程decision = 1
          只有当random选择出来的 key == max(level)的时候,才有可能出现不一致,max(level)是“对手”指定的,key是{ 1,r }中随机抽选的,所以算法不一致的概率是1/r



算法的形象描述:
每个进程就像一个个人,手拉手。在一个长n米的路上走,在这段路中随机选了一个标志key。规定只能执行n个回合,每个回合大家可以选择走或者不走。
   每个回合,所有进程一起吼自己的值是0还是1,并且听别人的值并记下来。
   如果一个人记住了所有人的值,就可以往前走。否则,就有可能停下来犯傻。
如果有一个进程停下来发傻,大家就都停下来等他。
   n回合之后 :如果一个进程记录下所有人是1,并且自己迈过了标志key,就决定1,否则决定0。

        这样,只有一种情况会发生不一致:
记录的所有进程值都是1,但是有一些进程越过了key,有一些进程没有越过key,所以越过key的进程决定1,没越过的决定0.
但是进程之间的差距不超过1步,所以这种情况出现的概率只有1/n


?多一句嘴,会不会出现这种情况:
所有进程都越过了key,但是由于链路故障,有一些进程听到了所有的喊话,知道其他进程都是1,所以决定1;一些进程没有听到所有喊话,所以决定是0。
不可能:原因是只要key不在起点,而是在路中间,进程越过key就说明进程向前迈了步,迈步的前提是key收齐了所有别的进程的信号。

0 0
原创粉丝点击