请输入您要查询的百科知识:

 

词条 Lamport
释义

Lamport算法:又称面包房算法,先来先服务算法。跟很多银行采用的排队机制一样。客户到了银行,先领取一个服务号。一旦某个窗口出现空闲,拥有最小服务号的客户就可以去空闲窗口办理业务。Lamport算法利用前述的事件定序方案统一定序所有对临界段的请求,按先来先服务的原则让请求临界资源的进程进入其临界段,进/出临界段1次需要3×(n-1)条消息。

Lamport算法基本假定如下:

A. 进程Pi发送的请求消息形如request(Ti , i),其中Ti = Ci是进程Pi发送此消息时对应的逻辑时钟值,i代表消息内容。

B.每个进程保持一个请求队列,队列中的请求消息根据Þ关系定序,队列初始为空。

Lamport算法描述

当进程Pi请求资源时,它把请求消息request(Ti , i)排在自己的请求队列中,同时也把该消息发送给系统中的其他进程; 当进程Pj接收到外来消息request(Ti , i)后,发送回答消息reply(Tj , j),并把request(Ti , i)放入自己的请求队列。应当说明,若进程Pj在收到request(Ti , i)前已提出过对同一资源的访问请求,那么其时间戳应比(Ti , i)小。 若满足下述两条件,则允许进程Pi访问该资源(即允许进入临界段):

A. Pi自身请求访问该资源的消息已处于请求队列的最前面;

B. Pi已收到从所有其他进程发来的回答消息,这些回答消息的时间戳均晚于(Ti, i). 为了释放该资源,Pi从自己的队列中撤销请求消息,并发送一个打上时间戳的释放消息release给其他进程;

当进程Pj收到Pi的release消息后,它撤销自己队列中的原Pi的request(Ti , i)消息。

下面是我写的代码

procedure Procesus is

type MsgTypes is (REQUETE, QUITTANCE, LIBERE);

task TacheUsager;

task ExcluionMutuelle is

entry demande;

entry attente;

entry fin;

entry recoit(msgType : in MsgType; estampille, emetteur : in integer);

end ExcluionMutuelle;

task body TacheUsager is

begin

ExclusionMutuelle.demande;

ExclusionMutuelle.attente;

ExclusionMutuelle.fin;

....

....

end TacheUsager;

task body ExclusionMutuelle is

me: constant := ...;

N : constant := ...;

Time_Logique : integer:= 0;

scAccorde : boolean := false;

type t_file is record

msgType : msgTypes := LIBERE;

estampille : integer := 0;

end record;

file array (1..N) if t_file;

function Permission (me : in integer) return boolean is

accord : boolean := true;

begin

for j in 1..N loop

if j/= me then

accord := accord and (file(me).estampille < file(j).estampille) or (file(me).estampille = file(j).estampille and me < j);

end if;

end loop;

return accord;

end Permission;

begin -- ExclusionMutuelle

loop

select

accept demande;

Time_Logique := Time_Logique +1;

file(me) := (REQUETE, Time_Logique);

for j in 1..N loop

if j/= me then sent((REQUETE, Time_Logique, me),j);

end if;

end loop;

scAccorde := Permission(me);

or

when scAccorde => accept attente;

or

when seAccorde => accept fin;

file(me):= (LIBERE, Time_Logique);

for j in 1..N loop

if j/= me then sent((LIBERE, Time_Logique, me) j);

end if

end loop;

scAccord := false;

or

accept recoit(msgType : in MsgTypes; estampille, emetteur : in integer) do

Time_Logique := integer'max(Time_Logique, estampille) + 1;

case msyType is

when REQUETE => file(emetteur) := (REQUETE, estampille);

sent((QUITTANCE, Time_Logoque, me), emetteur);

when LIBERE => file(emetteur) := (LIBERE, estampille);

when QUITTANCE => if file(emetteur).msgType /= REQUETE then

file(emetteur) := (QUITTANCE, estampille);

end if

end case;

scAccorde := file(me).msgType = REQUETE and then Permission(me);

end recoit;

end select;

end loop;

end ExclusionMutuelle;

end Processus;

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/3/22 6:57:20