【每周论文】Time, Clocks, and Ordering of Events in a Distributed System

来源:互联网 发布:淘宝代理货源平台 编辑:程序博客网 时间:2024/06/05 07:24

这篇文章是Leslie Lamport于1978年发表的,并在2007年被选入SOSP的名人堂,被誉为第一篇真正的“分布式系统”论文,该论文曾一度成为计算机科学史上被引用最多的文章。文章的作者Lamport享有分布式计算原理之父的美誉,并且因其对分布式系统研究作出的卓越贡献,2013年他被授予了图灵奖。


在分布式系统中的时钟同步是一个非常难的问题,因为在分布式系统中,是使用消息进行通信的,若使用物理时钟来进行同步,一方面是不同的process的时钟有差异,另一方面是时间的计算也有一定的误差,这样若有两个时间相同的事件,则无法区分它们谁前谁后了。这篇文章主要解决分布式系统中的时钟同步问题。

在文末的总结中,作者写了这么一句话“In a distributed system, it is important to realize that the order in which events occure is only a partial ordering”(在分布式系统中,事件发生的顺序只能是偏序),那什么是偏序呢?

以下图为例,有三个进程(P、Q、R),每个进程拥有一系列的事件(如进程P拥有事件p1、p2、p3、p4)。对于在同一个进程中,为每个事件区分前后是很简单的,比如下图时间从下往上是增大的,则最先发生的是p1,最晚发生的是p2;对于在不同的进程之间,假设事件p1代表了P向Q发送了一个消息,事件q2代表Q接收到这个消息,我们则称p1发生在q2之前,并且p1和q2存在一个偏序关系(happened before);对于p3和q3,我们则无法判断它们是谁先发生、谁后发生的,我们称其为并发的。

这里写图片描述

偏序(happened before)的定义:

  1. 在同一个进程中有两个事件a、b,如果a先发生,b后发生,则表示为a->b;
  2. 在不同的两个进程中,若a为发消息的事件,b为接受消息的事件,则a先发生,b后发生,表示为a->b;
  3. 若无法判断a和b谁先发生,则表示为并发的。


接下来作者定义了逻辑时钟

Clock Condition:如果 a -> b ,则 C(a) < C(b)(C(a)可以理解成事件a的”发生时刻”)
C1:若 a,b是同一进程i中的两个事件且 a->b,则 Ci(a) < Ci(b).
C2:若事件a代表发送消息的进程i 发送消息,事件b代表接收进程j接收该消息,则Ci(a) < Cj(b).

因此当C1和C2成立时,则Clock Condition成立。

在C1和C2的基础之上,作者提出了,IR1和IR2。
IR1:每个进程Pi在任意连续的两个事件之间会增加Ci的值
IR2:(a)如果事件a代表了进程Pi发送消息m的事件,那么消息m应包含时间戳Tm=Ci(a);(b)在收到消息m后,进程Pj会设置Cj的值使得它大于等于它的当前值并大于Tm.

在以上的基础上,作者提出了事件的全序

作者通过对进程进行排序(arbitrary total ordering),当进程之间有并发的事务时,以进程的顺序来决定事务的顺序,这样就可以对所有的事务定义一个全序了,并解决了对分布式系统中事务进行排序的问题。


此外,作者还提出了对分布式系统中资源互斥的三个条件:

  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 releases it, then every request is eventually granted.(每个获取资源的进程最终都会释放资源,每个申请资源的请求最终会获得资源)

  4. 为了请求资源,Pi给其他的每个进程发送一个消息提:Tm:Pi,其中Tm是发送的本地时间戳;然后将这个消息放入自己的消息队列中;

  5. Pj收到Tm:Pi时,将它放到自己的请求队列中,并发送一个带有时间戳的确认给pi
  6. 释放资源时,Pi从自己的消息队列中删除所有的 Tm:Pi请求,并向其他所有的进程发送带有时间戳的 pi资源释放消息。
  7. 当其他进程,如Pj收到Pi的资源释放消息时,Pj从自己的消息队列中删除所有的 Tm:Pi请求消息。
  8. 任何进程Pi能获取到资源的条件是:1)在它的消息队列中,才能在Tm:Pi请求消息,且这个消息在其他所有消息之前;2)Ti从每个进程那里接收到了比Tm更晚的消息;
阅读全文
0 0
原创粉丝点击