1、环网算法
一个确定的哈密乐顿回路被编码到进程中,假设对于每个进程p,给定它的一个专门的近邻Nextp,满足以这种方式选择的所有信道形成一个哈密尔顿回路。初始进程沿着回路发送消息<tok>,每个进程传递消息,当消息回到初始进程,初始进程进行判定。
for the initiator:
begin send <tok> to Nextp;receive(tok);decide end
for non-initiators:
begin receive <toke> ;send <tok> to Nextp end
2、树算法
如果网络的生成树是可用的相同的算法可被用于任意网络。如果进程经过依附它的每个信道接收一条消息,队了一种情况(初始时,这个条件对叶节点成立),则进程经过其余信道发送消息。如果进程经过所有依附的信道接收消息,则它进行判定。
var recp[q] for each q∈Neighp:boolean init false;
(*recp[q] is true if p has received a message from q*)
begin while #{q:recp[q] is false}>1 do
begin receive <tok> from q;recp[q]:=true end;
(*now there is one q0 with recp[q0] is false*)
send <tok> to q0 with recp[q0] is false;
x:receive <tok> from q0;recp[q0]:=true;
decide
(*Inform other processes of decision:
forall q∈Neighp,qq0 do send <tok> to q*)
end
3、回波算法
将消息扩散到所有进程中,定义了一棵生成树,令牌沿着这棵树边上的回声返回,就像树网算法中的消息流。初始进程向所有它的近邻发送消息。一旦接到第一条消息,非初始进程就把消息转发给它的所有近邻,除了它收到消息的那个近邻。当非初始进程收到来自于所有近邻的消息时,就向它的父节点发送回波。当初始进程收到所有近邻的消息时,就进行判定。
var recp:integer init 0;
fatherep:P init udef;
for the initiator:
begin forall q∈Neighu do send <tok> to q;
while recp<#Neighp do
begin receive <tok>;recp:=recp+1 end;
end
for non-initiators:
begin receive <tok> from neighbor q;fatherp:=q;recp:=recp+1;
forall q∈Neighp,q≠fatherp do send <tok> to q;
while recp>#Neighp do
begin receive <tok>;recp:=recp+1 end;
send <tok> to fatherp
end
4、轮询算法
经依附于初始进程的每条信道,算法发送2条消息。初始进程的每个近邻对于原始轮询只应答一次。可用于星型网络,中心就是初始进程。
var recp:integer init 0;(*for initiator only*)
for the initiator:
begin forall q∈Neighp do send <tok> to q;
while recp<#Neighp do
begin receive <tok>;recp:=recp+1 end;
decide
end
for non-initiators:
begin receive <tok> from q;send <tok> to q end