【每週論文】Time, Clocks, and Ordering of Events in a Distributed System

這篇文章是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更晚的消息;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章