RandomAttack algorithm
来源:互联网 发布:音视频编辑软件 编辑:程序博客网 时间:2024/06/18 13:40
有通信链路故障的同步完全图网络下,进程一致性算法
问题形式化描述:
有n个进程,每个进程可以选择(0,1)中的某个值,要求这些进程做决定前满足
- 一致性(每个进程的最终结果要相同)
- 有效性:如果所有进程都从0开始,那么0就是唯一可能的决定值; 如果进程都以1作为初值并且所有消息都被传递,则1是唯一的决定值。(也就是说,初始状态有0,也有1的状态下,可以最终结果都是0或者最终结果都是1)
- 终止性:所有进程最后都会做出决定。
随机化算法RandomAttack algorithm:(有一定的失败概率)
前提假设:
- 进程之间是完全图
- 为了计算算法失败的概率,假设通信链路发生故障并不是随机发生的,而是由一个“对手”指定的
形式化描述进程之间的关系:
定义进程之间满足(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,分析,为什么这个算法在一定的概率下可以保证一致性,有效性,终止性
- 终止性,显然
- 有效性 和 一致性:
如果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。
每个回合,所有进程一起吼自己的值是0还是1,并且听别人的值并记下来。
如果一个人记住了所有人的值,就可以往前走。否则,就有可能停下来犯傻。
如果有一个进程停下来发傻,大家就都停下来等他。
n回合之后 :如果一个进程记录下所有人是1,并且自己迈过了标志key,就决定1,否则决定0。
这样,只有一种情况会发生不一致:
记录的所有进程值都是1,但是有一些进程越过了key,有一些进程没有越过key,所以越过key的进程决定1,没越过的决定0.
但是进程之间的差距不超过1步,所以这种情况出现的概率只有1/n
?多一句嘴,会不会出现这种情况:
所有进程都越过了key,但是由于链路故障,有一些进程听到了所有的喊话,知道其他进程都是1,所以决定1;一些进程没有听到所有喊话,所以决定是0。
不可能:原因是只要key不在起点,而是在路中间,进程越过key就说明进程向前迈了步,迈步的前提是key收齐了所有别的进程的信号。
记录的所有进程值都是1,但是有一些进程越过了key,有一些进程没有越过key,所以越过key的进程决定1,没越过的决定0.
但是进程之间的差距不超过1步,所以这种情况出现的概率只有1/n
?多一句嘴,会不会出现这种情况:
所有进程都越过了key,但是由于链路故障,有一些进程听到了所有的喊话,知道其他进程都是1,所以决定1;一些进程没有听到所有喊话,所以决定是0。
不可能:原因是只要key不在起点,而是在路中间,进程越过key就说明进程向前迈了步,迈步的前提是key收齐了所有别的进程的信号。
0 0
- RandomAttack algorithm
- Algorithm
- Algorithm
- algorithm
- algorithm
- algorithm
- algorithm
- algorithm
- Algorithm
- Algorithm
- algorithm
- Algorithm
- Algorithm
- algorithm
- algorithm
- <algorithm>
- Algorithm:Greed Algorithm
- Algorithm: Euclid's Algorithm
- 【BZOJ3916】【Baltic2014】friends 暴力
- Memcached源码分析 - Memcached源码分析之总结篇(8)
- 内存管理:@class循环引用
- 15
- Lisa随手记 1.8 版 发布
- RandomAttack algorithm
- HTML表格
- @autorelease
- Clone Graph
- 15
- iOS开发-UIApplication和delegate & iOS程序的启动原理
- sublime text 3更改已有的build system(debian jessie)
- 【转自mos文章】检查selinux状态的方法
- ARC的基本使用