Lamport Logical Clock 學習

1,導論

①如何在分佈式環境下定義系統中所有事件的發生順序?②分佈式環境下多個進程競爭資源時如何互斥?③什麼是偏序,偏序的作用是什麼,有什麼不足?④什麼是全序,全序的作用是什麼,有什麼不足?⑤爲什麼需要物理時鐘,物理時鐘如何同步?下面來進行介紹。

 

2,偏序的定義、發生在先(happened before)關係

考慮單一的進程A,在某時刻發生了事件E1,經過一段時間後,發生事件E2,可以說:E1發生在E2前面。考慮多個進程,進程A向進程B發送消息,進程A發送消息時記爲事件E1,進程B接收到進程A發送的消息記爲E2,可以說:E1發生在E2前面。以上兩個例子表明了E1與E2是一種偏序的關係。之所以說明這兩個例子所代表的關係是偏序的,是因爲:當需要判斷下圖中的 a 和 e 這兩個事件誰先誰後時,在偏序關係下是無法判斷的。

偏序的定義:(1)若a,b 是同一進程中的兩個事件,且 a 發生在 b 之前,則 a ---> b  (---> 符號 表示 發生在先 關係, !---> 符號 表示 非發生在先 關係)

(2)若 a 是 "一個進程發送消息 "事件,b 是一個進程接收消息事件,則 a ---> b

(3)若 a !--->b and b!---> a ,則稱 a、b是併發的。如上圖中 事件a 與 事件e 就是併發的。

發生在先關係即偏序的代名詞。

 

3,全序

在 2 中,由於偏序不能表示 圖中事件a 和 事件e 的先後關係,而在分佈式系統中對所有的事件排序又是必須的,因此就需要另一種方法來定義所有事件的順序,即用Lamport 邏輯時鐘來定義分佈式系統中所有事件的全序。

“引用自網絡”
Logical Clock解決的問題是找到一種方法,給分佈式系統中所有時間定一個序,
這個序能夠正確地排列出具有因果關係的事件(注意,是不能保證併發事件的真實順序的)
,使得分佈式系統在邏輯上不會發生因果倒置的錯誤。 

Lamport 邏輯時鐘如下:

首先定義一個Clock Condition:如果 a ---> b ,則 C(a) < C(b)(C(a)可以理解成事件a的"發生時刻")。再給出兩個條件C1和C2,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、IR2 的本質就是,在同一進程中,a 在 b 之前發生 ,則需要設置 b 的時間戳大於 a的時間戳;在不同進程之間發送消息時,設置接收消息的事件的時間戳要 大於 發送消息這一事件的時間戳。

全序的定義:

各個進程間發生的事件的全序定義,可採用不同的方式。即論文中提到的 arbitrary total ordering.

理解如下:比如,可以把各個進程之間標序號。如1,2,3,4……當進程之間有併發的事件時,規定序號小的進程相應的事件 發生得早。比如上圖:設進程P的序號爲1,進程Q的序號爲2,對於事件e和事件a而言,就認爲 事件e “早於” 事件a 發生。

這樣,由IR1 和 IR2 這兩個操作,再加上 將各進程標序號這種方式 就可以對所有的事件定義一個全序了,這樣就解決了在分佈式系統中如何對所有事件排序這一問題。上圖的一個全序如下:

(1:1,e)---(1:2,f)---(2:1,a)---(2,2,b)    格式解釋:(進程序號:事件順序號,事件名稱)

在這裏出現了一個小小的問題:(1:2,f)---(2:1,a)???----可能是向量時鐘需要解決的吧???

 

4,分佈式環境下,多個進程之間競爭資源如何互斥?

現有一臨界資源,對它的訪問要求如下:

ⓐ佔有資源的進程,在它將該資源授權其其他資源時,必須先釋放該資源

ⓑ對資源的授權必須按照 提出資源請求的順序 進行。即,若進程A先於進程B申請資源(有全序關係的保證,當然就知道請求的先後順序了),那麼在分配資源時,應該將資源先分配給A用。

ⓒ對任何已獲得資源的進程,最終會釋放資源;也即,任何進程發生的 申請資源的請求最終會被響應。換句話說,佔有資源的進程最終會使用完該資源並釋放(不會死鎖),這樣就保證了任何資源請求最終會

被響應。

如何解決該問題呢?

Lamport 大師提出了一個算法如下:

❶若要請求資源,進程Pi需要發送一個格式爲 Tm:pi 的請求消息給系統中的其他所有進程,並將該消息放入自己的請求隊列中。(Tm表示消息的時間戳)

❷當其他進程如Pj收到 Tm:pi請求後,將它放到自己的請求隊列中,併發送一個帶有時間戳的確認給pi。

❸釋放資源時,pi從自己的消息隊列中刪除所有的 Tm:pi請求,並向其他所有的進程發送帶有時間戳的 pi資源釋放消息。

❹當其他進程,如pj收到pi的資源釋放消息時,pj從自己的消息隊列中刪除所有的 Tm:pi請求消息。

❺若同時滿足如下兩個條件,則將資源分配給進程pi:

a)按照 全序 關係 排序後, Tm:pi請求 排在它的請求隊列的最前面---即,在進程pi中, Tm:pi資源請求消息是最先 發生的。

b)pi 收到了所有其他進程發給它的時間戳大於Tm的消息

根據算法的❶❷❸❹❺能夠證明ⓐⓑⓒ是成立的。

部分證明的理解如下:

 證明ⓐ的成立:反證法。

假設ⓐ不成立,則意味着在資源分配給某進程後,假設該進程爲Pm,還有其他進程未釋放該資源,假設爲Pn,那麼對於這個進程來說,意味着它還未釋放資源,根據❸❹,也就意味着它還未將該請求從自己的隊列中刪除,同時,由❸可知,pm中還存儲着pn請求資源的消息。而進程Pm之所以能獲取資源,說明它滿足了❺的兩個條件,但是根據❺的條件a)說明進程Pm的資源請求是最早的,但是實際上Pn的請求要更早,因爲它比Pm更早獲得授權,但是該請求還未從Pm的隊列中刪除,因此❺的條件a)就不可能滿足,這樣就找到了矛盾的地方。

證明ⓑ的成立:

根據❺的a)可知,資源的分配是按照 發生資源請求的 全序關係排序的,單獨考慮pi進程發出的資源請求而言,由全序關係 ,排在隊列前面的請求先得到滿足。再由❺的b),pi收到所有的其它進程發過來的請求,意味着pi知道了其他進程的事件請求操作情況,因此,它就知道了當前它的Tm:pi 請求在整個系統中是不是最早的,而❺的b)中:pi 收到了所有其他進程發給它的時間戳大於Tm的消息,這樣它就確定Tm是最早的資源申請請求了,就會給Pi的Tm:pi 請求分配資源。

因此ⓑ成立

證明ⓒ的成立:

根據❸❹❺可請證明ⓒ成立。假設pi已經擁有的資源,它發送一個帶時間戳的資源釋放請求給其他所有進程,其它進程就把當初進程pi請求資源時發送給它們的消息從隊列中刪除(參考❹),這樣使得其它進程(非pi進程)的請求隊列中資源請求消息變成最早的了(因爲,最最早的pi資源請求消息已經被刪除了),這樣就使得任何進程發出的資源請求消息最終能夠被響應。

 

5,邏輯時鐘存在的問題(Anomalous Behaviour)以及引入物理時鐘的原因

採用上述討論的邏輯時鐘還不能完成給事件排序。考慮下面一個情況:小A 在 A市 的計算機A上發送了一個請求A,然後打電話告訴 住在B市的小B,讓小B 在計算機B上產生一個請求B。在現實的物理世界中看出是請求A導致了請求B的發生,即A是因,B是果。但在邏輯時鐘系統下,可能會出現A的時間戳排在B的時間戳的後面。爲啥?因爲“打電話”這一手段可以理解爲是在邏輯時鐘系統外部發生的。比如請求A在標號爲2的進程上發生,而請求B在標號爲1的進程上發生,排全序時,請求B的時間戳會小於請求A的時間戳。

如何解決這樣的情況?一種解決思路是把“打電話”這一事件也加入到系統中來考慮。這時,單純地用Lamport 邏輯時鐘就不能對所有的事件進行全排序了。因此,就引入了物理時鐘來解決該問題。

其次,對於邏輯時鐘而言,是沒有錯誤概念這一說的。failure這個概念只有在物理時間上下文中才有意義,如果沒有物理時間,就沒有辦法去區分進程是出錯了還是隻是處於事件之間的間隔之中。用戶只能通過系統很長時間都沒有響應來判斷系統出了問題。

引入物理時鐘之後,物理時鐘的正確工作是需要一定的條件的,即各個計算機使用的物理時鐘值不能偏差太大。因此,又提出了物理時鐘同步。物理時鐘的同步主要有兩種方式:1)有一個標準的時間服務器,各個Client都去連接該時間服務器同步時鐘,從而達到各個Client的時鐘是同步的。2)Berkeley算法:時鐘服務器主動地詢問各個Client的當前的時鐘值,各個Client就會告訴時鐘服務器它們各自的時鐘是多少,時鐘服務器把收集到的這些值,再加上自己的時鐘值,得出一個平均值。並計算出各個Client的時鐘值與該平均值的差值,時鐘服務器把該差值分別發送給各個Client,讓它們進行調整。

如:Client A 比平均值少5秒,則Client A 需要加快自己的時鐘計數(並不是把自己的時鐘值倒退5秒),其實相當於物理學中的將加速度增大了。

 

6,Lamport邏輯時鐘的侷限性

a)使用邏輯時鐘的方法給所有的事件排序時,必須保證所有的進程都參與其中(參考上面的算法描述),即不容許進程失敗。而這在現實的分佈式系統中幾乎是不可能的。b)該算法假設消息是按序到達的,且一定會傳遞成功。這可以通過消息序號和確認機制來保證(TCP協議)。

 

總結:在分佈式系統中,討論各個事件的發生順序時,一般講的都是偏序!!

7,參考文獻

《time clocks and the ordering of events in a distributed system》論文

Time Clocks and the Ordering of Events in a Distributed System(譯文) 

全序, 分佈式一致性的本質

我對Lamport Logical Clock的理解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章