(4)8 P160:(4)代表该道题属于第4章的内容,8是题号(第8题),P160是该习题在书中的大体页码。
(3)15说明基于时间戳的乐观并发控制算法的基本原理,并举例说明。P110
答:所谓的乐观的并发控制,其核心思想为:尽管放心的去做你想做的,不用在意其他人正在做什么。如果有问题出现,那么以后再考虑。在实际情况中,冲突相对来说非常少,所以这个策略大部分时间都可以正常工作;而基于时间戳的并发控制方法是指在一个事务开始做BEGIN_TRANSACTION的时候给它分配一个时间戳。通过使用Lamport的算法,我们可以确保时间戳是唯一的, 在这里它很重要。系统中的每个文件都拥有一个相关的读取时间戳,以判断哪个已经提交的进程最近一次读取或写入过该文件。如果事务都很短小而且在时间间隔上比较大,那么一般来说当一个进程试图访问某个文件时,该文件的读写时间戳将低于当前事务的时间戳。这种词性意味着事务正在以正确的顺序进行处理,一切正常。当次序不正确时,就表明一个晚于当前事务开始的事务试图插入、访问文件并提交。
这种情况意味着当前事务开始的过早了,因此需要终止。显然基于时间戳的并发控制方法就是一种乐观的并发控制方法,尽管两者的细节完全不同。在乐观的并发控制方法中,我们希望并发事务不使用同一个文件,而在基于时间戳的并发控制方法中,我们不介意并发事务是否使用同一个文件,只要编号小的事务总是先执行就可以了。
假设有三个事务a,b,c,它们使用的文件都是同样的,a很早就开始了,文件的时间戳就是a的时间戳。b和c同时开始,但时间戳不同,b的时间戳小于c的。若b试图写文件,则它先将自己的时间戳Tb和文件的写时间戳Tw对比。除非在b之后的事务c写了此文件并提交,文件的写时间戳是基于c的,Tb
(3)16举例说明RICART和AGRAWALE分布式互斥算法;假定A和B是相互独立的两个临界区,进程0按A、B顺序进入,进程1按B、A顺序进入,R-A分布式互斥算法会导致死锁吗?说明理由。P95
答:RICART和AGRAWALE算法要求系统中所有事件都是全序的,也就是说,对任何事件组消息,哪个先发必须无歧义,算法如下:当一个进程想进入临界区时,他要建立一个包括他要进入的临界区的名字、处理机号、当前时间的消息,然后将消息发送给所有其他进程,也包括发送给自身,当一个进程接收另一个进程消息时,它取决于接受方的状态以及临界区的名字有三种情况:
(1)接受者不在临界区,也不想进入临界区,他就向发送者发送OK消息;
(2)接受者已经在临界区,它不必回答,而是负责对请求队列排队;
(3)接收者要进入临界区,但是还没有进入,它要负责将发来的消息和它发送给其他进程的时间戳对比,取小的那个。如果来的消息时间戳小,接收者发送OK消息,否则接收者负责排列请求队列而不发送任何消息。
在发送完允许进入临界区的请求后,进程将不再做任何事,仅等待所有的允许消息,一旦得到允许,它就进入临界区。它从临界区退出时,向队列中所有进程发送OK消息,并将它从队列中删除。
该算法可能导致死锁。例如:P0、P1在同一时刻分别对临界区A、B发出请求,都得到满足,下一时刻它们又同时发出对临界区B、A的请求。此时由于P0正使用A所以对P1不作回答,只是将其放入队列。 而此时由于P1正使用B所以对P0不作回答,只是将其放入队列。P0得不到B不会释放A,也就不会应答P1,同样,P1得不到A不会释放B,也就不会应答P0,结果死锁。
(3)17在分布式系统中,许多算法都需要一个进程充当协调者,因此需要协调者选举算法。试说明欺负算法的主要思想,并说明在8个进程的情况下号码为3的进程发现协调者崩溃后的选举过程。P99
答:欺负算法:当一个进程发现协调者不再相应请求时,它发起选举。
进程P选举过程如下:
1.P向所有号码比它大的进程发送选举(Election)消息。
2.若无人响应,P获胜成为协调者。
3.若有号码比它大的进程响应,响应者接管,P的工作完成。
在某一时刻,一个进程只能从号码比它小的进程那里得到一个选举消息,当他到达时,接受者就发送ok消息,表明他的存在并接管,然后接收者主持选举(除非它正在主持别的选举)。除了一个进程外的其余进程都得放弃,这一个进程就是新的协调者,它将选举获胜的消息发送给所有进程,告知它是新的协调者。
假设有一个进程,该进程刚刚崩溃过,但现在得到了恢复并主持选举。若它刚好是当前运行进程中号码最大的,它就会获得选举的胜利,从而接管协调者的工作,所以最大的进程总能取胜,故而将该算法命名为欺负算法。
进程3发现协调者崩溃之后,向所有比其进程号大的进程,即4、5、6、7发消息,接收到消息的进程如果不是崩溃的协调者,则向进程3发送OK消息。进程3接到第一个应答时就知道自己的工作已经结束了。然后由进程号大于3的非崩溃协调者都主持选举,每个进程仅把消息发送给比自己进程号大的进程,最后的胜出者就是新的协调者。新的协调者向所有的进程发送协调者(COORDINATOR)消息,工作得到了继续。
(3)18在分布式系统中获得互斥的方法之一是采用集中式的算法,如果有四个进程P0,P 1,P2,P3,P0首先申请资源S,之后P 1,P2,P3 随后申请资源S,试说明采用集中式的算法是如何实现互斥的。P95
答:首先选择一个进程为协调者(比如在最大网络地址机器上运行的进程)。无论什么时候进程要进入临界区,它向协调者发送请求消息,说明它想进入哪个临界区并希望获得允许。如果当前该临界区内没有其他任何进程,协调者就发出允许进入消息。当P0请求资源S时,当应答到达时,P0就可以进入临界区。此时若P1请求资源S,协调者知道该临界区已经有一个进程,所以不能同意P1的请求。此时协调者可以发送“拒绝请求”应答,把进程2的请求临时排在队列中。或者协调者回避应答,这样就阻塞了进程2,使它等待应答。
当进程P1从临界区退出时,它向协调者发送释放互斥消息的访问,此时协调者从推迟请求队列中取出最前面的进程即P2,向它发送允许进入消息。如果该进程仍然(即,这是第一条发送给它的允许进入消息)它不被阻塞且进入临界区。如果明确发送一消息拒绝它进入临界区,此进程应该查询输入的消息,或者接着将它阻塞,不管怎么样,当它发现允许进入时,它还可以进入临界区。如果进程在阻塞状态,它就会被唤醒进入临界区。以此类推,即可实现进程P0、P1、P2和P3对资源S的互斥访问。
显而易见该算法保证了互斥的实现,协调者仅能让某一进程在某一时刻进入临界区。它也很公平,因为允许请求的顺序同他们接受的顺序一致,没有进程永远等待(没有饥饿)。这种方案也很容易实现,没用一次临界区只需3条消息(请求,允许,释放),它不仅仅能管理临界区,也可更普遍的用于资源分配。
(3)19有三个进程分别运行在不同的机器上,每个机器都有自己的时钟并以不同且不变的速率工作(进程1的时钟嘀嗒了6下时,进程2的时钟嘀嗒了8下,而进程3的时钟嘀嗒了10下),举例说明进程之间消息传递中违反先发生关系的情况,并说明如何用Lamport方法解决。
答:
Lamport解决方案直接使用先发生关系,每条消息携带发送者的时钟以指出其发送的时刻,当消息到达时,接收者时钟若比消息发送时钟小,就立即将自己的时钟调到比发送时间大1或更多的值。
如上图,其中消息C从进程2到进程1是在60时刻离开,56时刻到达。同理,消息D从进程1到进程0是在64时序离开,54时刻到达,这是绝对不可能出现的。
Lamport的解决方案是直接使用先发生关系,因为C在60时刻离开,只能在61时刻或更晚时刻到达,所以每条消息都携带发送者的时钟以指出其发送的时刻,当消息到达时,接收者时钟惹比消息发送时钟小,就立即将自己的时钟调到比发送时间大1或更多的值。在b中,我们看到C现在到达的时间是61,同样D到达的时间是70。
(3)20在很多分布式系统应用中,需要物理时钟同步,举一个例子,并说明物理时钟同步的三种算法,Cristian 算法、Berkeley算法及平均值算法。P90
答:在银行系统中,实际时钟时间很重要,对此要用到外部的物理时钟并且要求物理时钟的同步。
Cristian算法:
非常适合于只有一台机器上有WWV接收器 (时间服务器),其它所有机器与它同步的系统。拥有WWV接受的那台机器叫时间服务器(time server),每台机器以小于或等于秒的周期定期地向时间服务器发送消息询问当前的时间,时间服务器接到消息后就尽快回答含有当前时间CUTC值的消息。
由于时间不能倒退,一种方法是发送者根据时钟快慢,中断服务程序调整(增大或减小)每次中断所加的时间值。精确记录从向时间服务器发送请求的起始时间于时间T0和接收到应答的结束时间T1。当前服务器时间估计值=CUTC+(T1-T0)/2,如果考虑服务器中断处理的时间I,那么传输的时间间隔为T1-T0-I,单向传输时间为它的一半。
Berkeley算法:
平均值算法:
将时间分成固定长度的再同步间隔,第i次间隔开始于T0+iR,结束于T0+(i+1)R,T0是过去某一约定的时间,R是一个系统参数。在每次间隔开始处,每台机器根据自己的时钟广播发送当前的时间。在机器广播发送时间之后,它启动本地计时器收集在S时间间隔中到达的其他广播。当所有广播到达后,执行一个算法,得到新的时间值。这个算法可以是求这些值得平均值,或者是去掉m个最大值和m个最小值,平均其余值。
(2)21组通信系统中,原子性的含义是什么,举例说明为什么要保证原子性。在保证原子性的同时还要保证消息顺序,举例说明保证消息顺序的必要性。P75
答:原子性:要么全有要么全无特性的传递称为原子性(automicity)或原子广播(automicbroadcast)。
当两个进程竞相访问LAN时,在网络中消息传送的顺序是无法确定的,我们看图一中,进程0先占用网络向进程1发送了一消息,随后进程4连续三次占用网络,先后向进程0, 1和3发送了消息。在图2中的两部分以不同方式表示了这6条消息的发送顺序。同样它还可以以其他的顺序来发送占用和发送进程。在这出现了消息的顺序问题。
我们再看图2所示的进程l和进程3的情形。进程1先收到了来自进程0的消息,然后收到了来自进程4的消息。进程3开始没有收到消息,继而先后收到了来自进程4和进程0的消息。这样进程4与0的两条消息以不同的顺序到达了进程1和3。如果进程0和4都想去改变数据库中的同一记录的值,那么进程1和进程3执行的最终结果是不相同的。可能导致的后果是原子性失败。这与组内部分成员收到消息而部分成员未收到消息(原子性失败)的情形是一样糟糕的。
为了使编程更为合理,系统必须很好地定义一种消息传递顺序的语义。最好的保证就是立即发送所有消息并让它们保持发送的顺序。这样所有接受者都以同样的顺序接收到消息。这种消息传递的模型编程人员就能理解,而且他们的软件也可以它为基础。它能将消息准确地按发送顺序传递到目的地。