王朝百科
分享
 
 
 

Lamport

王朝百科·作者佚名  2010-04-10  
宽屏版  字体: |||超大  

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;

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如何用java替换看不见的字符比如零宽空格&#8203;十六进制U+200B
 干货   2023-09-10
网页字号不能单数吗,网页字体大小为什么一般都是偶数
 干货   2023-09-06
java.lang.ArrayIndexOutOfBoundsException: 4096
 干货   2023-09-06
Noto Sans CJK SC字体下载地址
 干货   2023-08-30
window.navigator和navigator的区别是什么?
 干货   2023-08-23
js获取referer、useragent、浏览器语言
 干货   2023-08-23
oscache遇到404时会不会缓存?
 干货   2023-08-23
linux下用rm -rf *删除大量文件太慢怎么解决?
 干货   2023-08-08
刀郎新歌破世界纪录!
 娱乐   2023-08-01
js实现放大缩小页面
 干货   2023-07-31
生成式人工智能服务管理暂行办法
 百态   2023-07-31
英语学习:过去完成时The Past Perfect Tense举例说明
 干货   2023-07-31
Mysql常用sql命令语句整理
 干货   2023-07-30
科学家复活了46000年前的虫子
 探索   2023-07-29
英语学习:过去进行时The Past Continuous Tense举例说明
 干货   2023-07-28
meta name="applicable-device"告知页面适合哪种终端设备:PC端、移动端还是自适应
 干货   2023-07-28
只用css如何实现打字机特效?
 百态   2023-07-15
css怎么实现上下滚动
 干货   2023-06-28
canvas怎么画一个三角形?
 干货   2023-06-28
canvas怎么画一个椭圆形?
 干货   2023-06-28
canvas怎么画一个圆形?
 干货   2023-06-28
canvas怎么画一个正方形?
 干货   2023-06-28
中国河南省郑州市金水区蜘蛛爬虫ip大全
 干货   2023-06-22
javascript简易动态时间代码
 干货   2023-06-20
感谢员工的付出和激励的话怎么说?
 干货   2023-06-18
 
>>返回首页<<
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有