分布式操作系统考试题.docx
《分布式操作系统考试题.docx》由会员分享,可在线阅读,更多相关《分布式操作系统考试题.docx(20页珍藏版)》请在冰豆网上搜索。
分布式操作系统考试题
分布式操作系统
1在交换式Dash多处理机系统中,为了保持缓存一致性,采用了Dash协议,某一簇中的一CPU写一未缓存的数据块,之后另外一簇的另外一CPU读该数据块。
试详细说明写操作和读操作是如何进行的。
写操作:
该CPU查看缓存发现没有该数据块,它在本地发送请求查看邻近CPU的缓存中是否有该数据块。
如果有,执行缓冲区到缓冲区的传送,如果块状态为干净宿主所在簇的其他拷贝置为无效。
如果在本地查找失败,CPU发送体育馆到其宿主所在簇。
如果块为未缓存,标记为脏并发送给请求者;如果块为干净,所有拷贝置为无效,标记为脏并发送给请求者;如果块为脏,请求传送到拥有该数据块拷贝的远程簇,该簇将自己的拷贝置为无效并满足写操作。
读操作:
另一CPU查看自己缓存与本地簇其他CPU缓存发现无此数据块。
该CPU发送请求包给宿主所在簇,发现所需块的状态为脏,目录查找拥有该块的簇的标志。
该簇响应请求。
并将该数据块发送给请求簇,将其状态改为干净,还要给宿主所在簇发回一个拷贝以更新存储器,这时块的状态被置为干净。
2在基于总线的多处理机系统中,遵循writeonce协议,假设有C1,C2,C3,C4四个CPU,一操作序列如下:
C1读一字W1(只存在于共享存储器中)、C1继续读该字、C2读该字;C1修改该字、C3读该字、C4读该字。
试详细说明以上操作序列是如何执行的。
C1查看缓存发现没有该字,从共享存储器中读取W1,同时缓存中也存储W1,状态为干净。
C1又一次读W1。
查看自己缓存发现存在该字,从缓存中读取W1。
C2读W1先在自己缓存中查找发现没有缓存,从共享存储器读取W1并存储在缓存中,状态为干净。
C1修改W1将缓存中的该字修改,状态变为脏,同时C2监听到写请求,将自己缓存中的W1置为无效。
C3读该字,C1发现读请求发信号禁止存储器响应,C1向C3提供该字并将自己的项置为无效,C3发现该字来自其他缓存其状态置为脏,并将自己缓存项标记为脏。
C4读该字,C3发现读请求禁止存储器响应,并向C4提供该字,并且将自己的项置为无效。
C4发现该字来自其他缓存,其状态为脏,则标记自己缓存项为脏。
3在分布式系统,为了获得文件读写的效率,需要使用高速缓存,说明设置缓存的各种方法及用途。
并说明解决一致性问题的四种算法及各种算法存在的问题。
在一个各自有主存和磁盘的客户一服务器系统中,有四个地方可用来存储文件或存储部分文件:
服务器磁盘,服务器主存,客户磁盘(如果可用的话)或客户主存。
在服务器内存设置缓存,可以减少I/O次数,而在客户端内存和磁盘中设置缓存,可以减少网络通信。
1.在服务器磁盘
在服务器磁盘上,有允足的空间,存放在那里的所有文件对所有客户都是可访问的。
而且,由于每一个文件只有一份拷贝,所以不会产生一致性的问题.
2.在服务器主存
将最近使用的文件保留在服务器的主存中。
客户读取一个刚好在服务器主存中的文件,可以消除磁盘传送,但网络传送仍然存在。
在服务器主存中设置高速缓存:
容易、对客户是完全透明的。
由于服务器可以保证其主存和磁盘拷贝同步。
从客户的观点看,每个文件只有一个拷贝,不会产生一致性问题。
3.在客户磁盘
客户磁盘保存数据多但速度慢。
如果使用大量的数据,客户磁盘高速缓存可能更好些。
4.客户端高速缓存
此时有三种可使用的选择来精确定义高速缓存的位置:
a)、在每个用户进程自己的地址空间直接进行文件高速缓存。
b)、在内核中。
c)、在一个单独的用户级高速缓存管理者进程中,它保持了(微)内核独立于文件系统编码,因此易十编程,并巨更加灵活.
四种算法:
1直接写算法:
(WRITE-THRONG算法)当修改一个高速缓存项(文件或块)时,新的值保存在高速缓存中并立即写到服务器;
2延迟写:
延迟写操作使得语义变得不清楚。
当另一个进程读此文件时,它所得结果取决于时间选择。
延迟写只好在运行效率和清晰的语义之间权衡。
3关闭时写:
仅当文件关闭后才将文件写到服务器,与对话语义相配;
4集中控制算法:
a当打开一个文件时,打开该文件的机器向服务器发送一条消息。
服务器保存谁打开了哪个文件以及打开是为了读还是写或者两者兼有。
b如果文件是为读而打开,允许其他进程为读而打开,避免为写而打开。
如果某个进程为写而打开一个文件,必须禁止所有其他访问。
c当关闭文件时,必须报告,以便服务器更新。
d缺点:
不健壮,不能规模化。
存在的问题:
(1)直接写:
有效,但不影响写流量。
(2)延迟写:
效率较高,但可能语义不清。
(3)关闭时写:
与会话语义相配。
(4)集中控制:
UNIX语义,但不健壮,不能规模化。
4给出实现文件复制的三种方法,并举例说明更新复制文件的Gifford算法,并说明某些服务器崩溃时,应该采取什么措施。
三种方法:
1、显式复制:
当进程产生一个文件时,可以在其他服务器上生成另外的拷贝。
如果目录服务存在允许一个文件有多个拷贝,所有拷贝的网络地址都可以和这个文件名联系起来。
2、懒惰复制:
只要在某个服务器上建立每个文件的一个拷贝,服务器自己在其他的服务器上也可自动生成副本。
3、使用组通信:
所有的写系统调用同时传送到所有的服务器。
于是,其他的拷贝在原文件产生时就产生了。
Gifford算法:
即表决(voting),其基本思想是在读或写一个拷贝文件之前要求中请并获得多个服务器的允许。
下面举一简单的例子来说明该算法是如何工作的:
假设一个文件在N个服务器上都有拷贝。
建立一个更新文件的规则:
首先客户必须和超过半数的服务器联系,并让它们同意它进行更新。
如果它们同意,就改变文件,并将一个新的版本号和新文件联系起来。
该版本号用来标识该文件的版本,这对所有新近更新的文件都是一样的。
当读一个已有拷贝的文件时,客户必须和超过半数的服务器联系,并请求它们发送与该文件相联系的版本号。
如果所有版本号相一致,则说明这是最新的版本,如果企图只更新剩余服务器,会因为数目不足而失败。
例如,有5个服务器,客户已确定它们中的三个有版本号8,则其他两个的版本号不可能是9。
因为任何从版本号8到版本号9的成功更新需要三个服务器同意,而不是两个。
Gifford的方案实际上比这更普通一些。
在该方案中,读一个已有N个拷贝存在的文件时,客户需要获得一个读法定数,它是任何Nr个或更多服务器的任一集合。
同样,修改一个文件需要一个至少Nw个服务器的写法定数Nr和Nw的值必须满足约束条件Nr+Nw>N。
只有在适当数目的服务器同意参与时,文件才能读或写文件。
假设最近的写法定数由从C到L的10个服务器组成,所有这些服务器得到了新版本和新版本号,任何随后的由3个服务器组成的读法定数中将至少包含一个该集合中的成员。
当客户查看版本号时,它将知道哪一个是最新的并得到它。
解决办法:
虚像表决通过为每个已崩溃的服务器建立一个没有存储器的虚拟服务器解决了服务器崩溃的问题。
虚设者不允许出现在读法定数中,但它可以加入写法定数中。
当一个崩溃的服务器重新启动时,它必须获得一个读法定数来找到最新的版本。
在它开始正常工作之前,它将为自己拷贝一份该拷贝。
5试说明举例什么是有状态服务器,什么是无状态服务器,并对有状态和无状态服务器进行详细的比较。
无状态服务器:
当客户发送一个请求到给服务器,服务器完成请求,发送一个应答,然后从内部表中移出关于该请求的所有信息。
在请求之间,服务器不保存具体客户的信息。
有状态服务器:
服务器保存两个请求之间的客户的状态信息。
比较:
无状态服务器的优点:
容错、不需要OPEN/CLOSE调用、没有服务器表空间的浪费、没有打开文件数目的限制、客户崩溃时不会造成服务器错误。
有状态服务器的优点:
请求消息比较短,减少网络带宽、更好的性能、可以预读,预先读信息块减少延迟、易于幂等性(客户第二次发送相同请求时,可以不用再传输)、可以对文件加锁。
无状态服务器在本质上有更多的容错。
不需要OPEN和CLOSE调用,这就减少了消息编号,特别对于那些整个文件用一次就可读出的普通情况,服务器不用浪费空间来存放表。
使用表时,如果太多的客户一次打开太多的文件,则将表填满,就不能打开新的文件。
最后对于状态服务器,如在文件打开时窗户出了故障,服务器就会牌困境中。
如果它对此束手无策,它的表最终将充满垃圾。
如果它超时了还未打开文件,那么客户因两个请求之间等待时间太长将被拒绝服务。
有状态服务器由于READ和WRITE消息并不是必须包含文件名,所以它可以更短些,这样就使用更小的网络带宽。
由于关于打开文件的信息在文件关闭之前都可保存在主存储器中,所以有较好的性能。
由于大多数文件都是按顺序读的,可以预先读信息块减少延迟。
6在分布式系统中,可支持上载/下载文件模式或远程访问模式,说明这两种模式并进行比较。
上载/下载模式:
文件服务只提供两种主要的操作:
读文件和写文件。
读文件操作是将整个文件以一个文件服务器传送到提出请求的客户;写操作是将整个文件从客户传送到服务器。
优点:
概念简单。
使用这种模式不需要掌握复杂的文件接口,而且整个文件传送也是高效的。
缺点:
客户端必具有足够大的存储空间来存储所需的所有文件。
如果只需要文件的一小部分,移动整个文件是很浪费的。
远程访问模式:
文件服务提供了大量的操作用于打开和关闭文件,读写文件的一部分,在文件中来回移动,检查和改变文件属性等。
优点:
在客户端不需要很大的空间,当仅需要文件的一小部分时,不需要传送整个文件。
7分布式协同一致算法的目标是使所有无故障处理机对待某些问题的意见达到一致,在3个正常处理机,2个出错处理机的情况下,用Lamport算法能否达成一致,给出算法的具体步骤。
假设:
正常处理机为:
ABC。
错误处理机为:
DE。
1.每个处理发送消息给其它处理机消息:
A:
1B:
2C:
3D:
x1y1z1m1E:
x2y2z2m2
2.把第一步声明的结果收集组成向量的形式
A:
(1,2,3,x1,x2)
B:
(1,2,3,y1,y2)
C:
(1,2,3,z1,z2)
D:
(1,2,3,4,m2)
E:
(1,2,3,m1,5)
3.每个处理现将各自的向量传递给其它处理机。
A:
(1,2,3,y1,y2)
(1,2,3,z1,z2)
(1,2,3,4,m2)
(1,2,3,m1,5)
每个处理机检查所有接收向量的第i个元素。
若某个值占多数,放入结果向量中,否则,标记为UNKNOWN
A会得出结论(1,2,3,UNKNOWN,UNKNOWN)
其他处理机进行相同的操作
ABC得到一致的向量(1,2,3,UNKNOWN,UNKNOWN)
8在实时分布式系统中,事件触发和时间触发系统的含义是什么,给出一个例子,并说明为什么动态调度适合于事件触发系统,给出三种动态调度算法。
事件触发系统:
当一个重要的外部事件触发时,它被传感器察觉到,并导致与传感器相连的CPU得到一个中断请求。
时间触发系统:
每△t毫秒产生一次时钟中断,在每一次时钟滴答时,对传感器进行采样,并驱动执行机构。
中断仅在时钟滴答时发生。
例:
考虑对一个100层楼的电梯控制器的设计。
假定电梯在60层等客人。
有人在一层按下按钮。
就在100毫秒后,另一人在100层上按下按钮。
在事件触发系统中,第一次按钮产生一个中断,使电梯启动下行,就在做出下行决定后,第二个按钮事件到来,因此第二个事件被记录下来以作为将来的参考,但电梯还是下行。
在时间触发系统中,它每500毫秒采样一次,若两次按下按钮事件都在一次采样周期中出现,控制就必须做出决定。
动态调度是在运行期间检测到事件时进行调度,用事件触发系统可以在低负载更快的响应。
算法:
1.比率单调算法
2.最早时限优先法
3.最小余度法
9主动复制容错的典型例子是三模冗余容错,说明某组成部件出错和某表决器出错时,是如何容错的。
如果在某一级上同时有两个表决器出错,其它所有部件和表决器均正常,能否屏蔽错误,为什么?
如果服务器采用主动复制的方法会存在什么问题,如何解决?
每个设备复制三次,结果是每级电路都设置了三个表决器,每个表决器都有三个输入和一个输出。
若两个或三个输入相同,输出则等于该输入。
若三个输入各不相同,输出就是不定值。
1.假设A2失效,V1V2V3都得到两个好的输入和一个坏的输入,每个都输出正确值到第二级。
2.A2B3C1都出错,A2出错V1V2V3都输出正确值到第二级,同理B3出错V4V5V6也都输出正确值到第三级。
C1出错同理。
这些影响都被屏蔽,输出结果仍正确
不能。
因为每一级只有三个表决器,如果有两个同时坏掉超过三分之二的要求,不能输出正确结果。
存在问题:
所有请求到达所有服务器的顺序就相同。
解决方法:
1对所有请求做全局计数编号。
2使用Lamport逻辑时钟。
10使用主机后备容错方法容错的主要思想是:
在任何一个时刻都有一台服务器是主机,若主机失效了,后备的服务器将承担其任务。
试说明主机后备方法的工作原理及存在的问题,及解决办法。
工作原理:
在任一时刻都有一台服务器是主机,它完成所有的工作。
若这个主服务器失效了,后备的服务器将承担其任务。
1.如果主机在执行任务前崩溃,则没有损失。
客户端会超时重发直到连上后备机,任务只被执行一次。
解决方案:
客户端只是在超时后,再次重新发送请求消息,直到发送一定次数后,或者因得不到响应而停止发送请求消息,或者它的请求分别得到主服务器和备份服务器的处理,并且只执行一次。
2.如果主机在执行任务后向后备机发送更新消息前崩溃,此时后备机接管,请求消息再次到来,则任务被执行2次。
解决方案:
还没有有效的解决方案,一般来说,在主服务器崩溃后,只正确执行一次请求消息的处理是非常困难的。
3.如果主机在后备机执行任务后自己发送响应消息前崩溃,则任务共被执行三次。
一次主机完成,一次后备机完成,一次后备机接管时完成。
如果请求消息带有序号,则可以减少任务执行次数。
解决方案:
若每个请求消息都带有标志信息,那么请求消息只被执行两次。
一般来说,在主服务器崩溃后,只正确执行一次请求消息的处理是非常困难的。
解决办法:
是使用主机和备份机之间共享的两端口磁盘。
在这种配置下,当主机得到一个请求后,在做任何事之前先将请求写入磁盘,并且也把执行的结果写人磁盘,不再需要向备份机发送消息并接收从备份机发来的消息了,若主机崩溃,备份机可通过读磁盘而得到整个系统现在的状态。
11一个典型的集中的、启发式的处理机分配算法,即上-下算法。
说明该算法的目标,并说明该算法的主要原理。
目标:
让一个等了很久的,没有使用任何处理机的申请优先于已经占用了许多多处理机的申请。
此为该算法的目标即公平的分配系统资源。
主要原理:
算法中有一个协调者,保存着一张使用情况的表,每个工作站在表中都有一个条目,初值为0。
当有重要的时间发生时,将给协调者发信息以更新使用情况表。
算法将根据使用情况表决定处理机的分配。
这些决定发生在调度事件发生时:
有进程请求处理机、处理机进入空闲状态或者是发生了时钟中断。
使用情况表中的记录值可以为整数、零或是负数。
整数表示用户纯粹是在使用系统资源,负数表示用户需要系统资源,零则介于两者中间。
12在支持多线程的系统中,可采用三种模型来组织多线程,详细说明这三种模型。
如果在不支持多线程系统中实现文件服务,如何构造文件服务器。
派遣者/工作者模型:
某一个线程作为派遣者,它从系统邮箱内读出输入请求,然后检查请求,选择一个空闲的工作者线程去处理它。
然后派遣者唤醒睡眠的工作者。
工作者被唤醒后,它检查共享块缓冲区是否可以满足这个请求。
如不能满足,给磁盘发送消息,要求所需的数据块。
且进入休眠状态等待磁盘操作的完成.
团队模型:
所有线程都是批平等的,每个都获得和处理自己的请求。
没有派遣者。
如果工作来了不能处理,尤其是如果每个线程用来处理一种特殊的工作,可以维护一个队列,挂起的作业保存在作业队列中。
线程在察看系统信箱前先察看作业队列。
管道线模型:
第一个线程产生一些数据传给下一个线程去处理。
数据持续从一个线程传到另一个线程,经过的每一个线程都进行处理。
文件服务器在无多线程的情况下可以让它作为单线程执行。
文件服务器的主循环是接收一个请求并检查它,并且在下一个请求到来前完成它。
当文件服务器等待磁盘操作时,它是空闲的且不处理另一请求,如果文件服务器运行于一个专用的机器上,当文件服务器等待磁盘时,CPU也是空闲的。
13在机器0上进程0在等待机器0上进程1所拥有的资源,进程1在等待机器1上进程2所拥有的资源,进程2在等待进程机器1上3,4所拥有的资源,进程3在等待机器2上进程5所拥有的资源,机器2上的进程5在等待机器0上进程0所拥有的资源,画出简化的资源图并说明用Chandy-Misra-Hass提出的分布式死锁检测算法如何检测死锁,并打破死锁。
检测死锁:
当某个进程等待资源时,例如进程0等待进程1。
此时,生成一个特殊的探测消息并发送给占用资源的进程。
消息由三个数字构成:
阻塞的进程,发送消息的进程,接收消息的进程,如由0到1的初始消息包含三元组(0,0,1)。
接到消息后,接受者检查以确定它自己是否也在等待其它进程。
如果是,那么消息就要被更新,第一个字段保持不变,第二个字段改为当前进程号,第三个字段改为等待的进程号。
然后消息接着被发送到等待的进程。
如果在等待多个进程,就需要发送多个不同的消息。
不论资源时在本地还是在远程,该算法都要继续下去。
如果消息转了一圈后又回到了最初的发送者,那么就说明存在一个有死锁的环路系统。
打破死锁:
1.令最初发送探测消息的进程自杀。
但是如果多个进程同时阻塞,同时发送探测消息,那么每个进程都会发现死锁,并因此而自杀。
2.将每个进程的标识符添加到探测消息的末尾,将编号最大的进程中止或者发送消息请求它自杀。
多个进程发现同一环路会选择同一个牺牲者。
14在分布式系统事务提交操作可能需要不同机器上的多个进程的协作,举一个实际例子,并说明实现原子性提交的两阶段提交协议的基本思想。
基本思想:
有一个进程作为协调者,通常是执行事务的进程。
在准备提交阶段,协调者向日志中写入Prepare,然后向所有服务器发送准备提交消息。
服务器接收消息后,检查自己是否准备提交,如果是,就向日志中写入Ready,然后向协调者发送准备好消息。
在提交阶段,协调者接收所有响应后决定提交或终止。
如果所有服务器都准备提交,则提交事务。
如果有一个服务器未准备好,则终止事务。
无论结果如何,协调者都会写入日志,并发送决定消息。
服务器接到消息后,也将结果写入日志,并发送结束消息,完成整个过程。
例子:
航空订票系统。
预订一张从A到D的机票。
若选A作为协调者,在准备提交阶段,协调者A向日志中写入Prepare,然后向服务器B、C、D发送准备提交消息。
服务器B、C、D接收消息后,检查自己是否准备提交,如果是,就向日志中写入Ready,然后向协调者A发送准备好消息。
在提交阶段,协调者A接收所有响应后决定提交或终止。
如果所有服务器都准备提交,则提交事务,完成订票。
如果有一个服务器未准备好,则终止事务。
15说明基于时间戳的乐观并发控制算法的基本原理,并举例说明。
基于时间戳的并发控制方法是指在一个事物开始做BEGIN_TRANSACTION的时候给它分配一个时间戳。
通过使用Lamport的算法,我们可以确保时间戳是唯一的。
系统中的每个文件都拥有一个相关的读取时间戳,以判断哪个已经提交的进程最近一次读取或写入过该文件。
如果事务都很短小而且在时间间隔上比较大,那么一般来说当一个进程试图访问某个文件时,该文件的读写时间戳将低于当前事务的时间戳。
这种词性意味着事务正在以正确的顺序进行处理,一切正常。
当次序不正确时,就表明一个晚于当前事务开始的事务试图插入、访问文件并提交。
这种情况意味着当前事务开始的过早了,因此需要终止。
16举例说明RICART和AGRAWALE分布式互斥算法;假定A和B是相互独立的两个临界区,进程0按A、B顺序进入,进程1按B、A顺序进入,R-A分布式互斥算法会导致死锁吗?
说明理由。
RICART和AGRAWALE算法要求系统中所有事件都是全序的,也就是说,对任何事件组消息哪个先发生哪个后发生必须无歧义,算法如下:
(1)当一个进程想进入临界区时,他要建立一个包括它要进入的临界区的名字、处理机号、当前时间的消息,然后将消息发送给所有其他进程,也包括发送给自身。
(2)当一个进程接收到另一个进程消息时,它取决于接受方的状态以及临界区的命名,有三种情况:
1接受者不在临界区,也不想进入临界区,他就向发送者发送OK消息。
2接受者已经在临界区,它不必回答,而是负责对请求队列排队。
3接收者要进入临界区,但是还没有进入,它要负责将发来的消息和它发送给其他进程的时间戳对比,取小的那个。
如果来的消息时间戳小,接收者发送OK消息,否则接收者负责排列请求队列而不发送任何消息。
(3)在发送完允许进入临界区的请求后,进程将不再做任何事,仅等待所有的允许消息,一旦得到允许它就进入临界区。
(4)它从临界区退出时向队列中所有进程发送OK消息,并将它从队列中删除。
不会导致死锁。
进程0、1分别进入A、B临界区,假设进程0先在A中执行完后,退出A临界区,并发送ok消息给所有的等待进程,之后申请临界区B,因为进程1此时在临界区B中,所以进程1负责将进程0排在临界队列中,当进程1执行完后退出B,它将进程0的请求从队列中取出,并向进程0发送OK,允许进程0进入临界区B,自己再去申请进入临界区A.所以不会产生死锁。
17在分布式系统中,许多算法都需要一个进程充当协调者,因此需要协调者选举算法。
试说明欺负算法的主要思想,并说明在8个进程的情况下号码为3的进程发现协调者崩溃后的选举过程。
欺负算法:
当一个进程发现协调者不再响应请求时,它发起选举。
进程P选举过程如下:
1P向所有号码比它大的进程发送选举消息
②若无人响应,P获胜成为协调者。
③若有号码比它大的进程响应,响应者接管,P的工作完成。
假设8个进程为进程0到进程7,原协调者为进程7
进程3发现协调者崩溃,进程3主持选举,进程4进程5和进程6应答,通知进程3停止,进程4进程5进程6分别主持选举,进程6通知进程5和进程4停止,进程6获胜并通知所有进程。
18在分布式系统中获得互斥的方法之一是采用集中式的算法,如果有四个进程P0,P1,P2,P3,P0首先申请资源S,之后P1,P2,P3随后申请资源S,试说明采用集中式的算法是如何实现互斥的。
首先选择一个进程为协调者。
无论什么时候进程要进入临界区,它向协调者发送请求消息,说明它想进入哪个临界区并希望获得允许。
如果当前该临界区内没有其他任何进程,协调者就发出允许进入消息。
如当P0请求资源S时,当应答到达时,P0就可以进入临界区。
此时若P1请求资源S,协调者知道该临界区已经有一个进程,所以不能同意P1的请求。
此时协调者可以发送“拒绝请求”应答,把进程2的请求临时排在队列中。
或者协调者回避应答,这样就阻塞了进程2,使它等待应答。
当进程P1从临界区退出时,它向协调者发送释放互斥消息的访问,此时协调者从推迟请求队列中取出最前面的进程即P2,向它发送允许进入消息。
如果该进程仍然阻塞,它不被阻塞且进入临界区。
如果明确发送一消息拒绝它进入临界区,此进程应该查询输入的消息,或者接着将它阻塞,不管怎么样,当它发现允许进入时,它还可以进入临界区。
如果进程在阻塞状态,它就会被唤醒进入临界区。
19有三个进程分别运行在不同的机器上,每个机器都有自己的时钟并以不同且不变的速率工作(进程1的时钟嘀嗒了6下时,进程2的时钟嘀嗒了8下,而进程3的时钟嘀嗒了10下),举例说明进程之间消息传递中违反先发生关系的情况,并说明如何用Lamport方法解决。
Lamport解决方案使用先发生关系,每条消息携带发送者的时钟以指出其发送的时刻,当消息到达时,接收者