Note: Time clocks and the ordering of events in a distributed system

http://research.microsoft.com/en-us/um/people/lamport/pubs/time-clocks.pdf

分布式系统的时钟同步是一个非常困难的问题,this paper致力于分布式系统的逻辑时钟同步问题。

文中有个结论值得注意:
In a distributed system, it is important to realize that the order in which events occure is only a partial ordering. 
分布式系统中事件的时序只能是偏序(不可能为全序)。

文中使用了一种确认两个事件a、b是否存在先后顺序的简单有效的方法:在时空图中如果能找到从a到b的时间线,则认为a、b纸件存在先后顺序;否则,认为他们是同时发生的(无法判断先后则认为同时发生)。

image

文中介绍了一种简单的分布式逻辑时钟系统,不同进程间通过事件中的时间戳来缺点事件发生的先后,它是偏序的;同时指出,如果要构建全序的时钟系统,需要一种方法定义在偏序中被认定为“concurrent“的事件的先后;同一套系统,使用不同的方法可能得到不同的先后顺序;

文中证明了一种使用有偏差的物理始终,构建一个分布式始终,它能达到的偏差的理论上限;这个误差与同步时间间隔、两个节点间的不可预见延时成正比;

image

文中提出了分布式系统中对互斥资源管理正确性的三个条件(充分条件,没有证明是必要条件):

1.  a process which has been granted the resource MUST release it before it can be granted to another process;
如果一个资源已经分配给了某个进程,那么在分配给其他进程前必须先释放这个资源;(可能主动也可能被动释放,这个确保了资源的独占性);

2. different requests for the resource MUST be granted in the order in which they are made
获取资源的顺序必须与请求的顺序相同。(这是非常困难的条件)

3. if every process which is granted the resource eventually release it, then every request is eventually granted.
如果最终每个获取到资源的进程都释放了请求,那么每一个请求都已经获取到了资源;(这是条件,不是结果)

文中提出了一种能满足上述三个条件的实现方法:

前提假设(不是必要的假设,只是为了简化问题):

1.对于任何两个进程pi和pj,消息的发送和接收拾有序的(使用tcp即可做到这点);
2.消息最总都能发送成功,不会丢失(tcp的重传也能做到这点);
3.每个进程p都维护一个请求消息队列,各个队列之间是完全独立运作的;

imageimage
算法步骤:
1. pi为了请求资源,给其他的每个进程发送一个消息提:Ti:Pi,其中Ti是发送的本地时间戳;然后将这个消息放入自己的消息队列中;
2.Pj收到Tm:Pi时,将这个消息放入自己的消息队列中,并发送一个带时间戳的ack给Pi(如果Pj已经发送过一个比Tm更晚的ack,这里不需要发送;注意早晚的判断使用的事Pi的时间戳比较的)
3.释放资源时,Pi从队列中删除所有Tm:Pi请求消息,并发送一个带时间戳的释放资源消息给所有的进程;
4.当Pj接收到Pi的释放消息时,它删除队列中所有的Tm:Pi请求消息;
5.任何进程Pi能获取到资源的条件是:1)在它的消息队列中,才能在Tm:Pi请求消息,且这个消息在其他所有消息之前;2)Ti从每个进程那里接收到了比Tm更晚的消息;

其实上面的算法要求,每个进程要获取到资源,都要知道在它获取的事件点之前,系统其他所有节点是否有申请资源。

原文地址:https://www.cnblogs.com/zwCHAN/p/3652948.html