https://lamport.azurewebsites.net/pubs/time-clocks.pdf

http://yang.observer/2020/07/26/time-lamport-logical-time/

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

實現方法:

  1. 初始時每個 process $P_i$ 中包含一個本地時鐘 $C_i=0$,$C_i(a)$ 代表事件 $a$ 的邏輯時鐘值。
  2. Process $P_i$ 中每發生一個事件,將 $C_i=C_i+1$。
  3. Process $P_i$ 給 process $P_j$ 發送消息,需要帶上自己的邏輯時鐘 $C_i$。
  4. Process $P_j$ 接收消息後,將 $C_j=max\{C_i,C_j\}+1$

如此一來有先後順序關係的 events 時間都一定不會錯亂了(本地中每發生一個 event 時間就加一,發送/接收的消息,「接收的 event 的邏輯時間」一定大於「發送的 event 的邏輯時間」)

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/553b2f4f-64a3-498d-b04c-a3b41dd6bd45/Untitled.png

所以對於兩個事件 a 和 b,如果 $a\rarr b$,則 $C(a)\lt C(b)$。但反過來若 $C(a)\lt C(b)$ 並不代表 $a\rightarrow b$。

如此一來我們可以得到一個偏序(Partial order)的事件集。偏序的定義即集合中的元素是部分有序的。例如上圖中我們並不知道事件 $a$ 與 $f$ 的先後順序。

要能達到全序的效果也很簡單,只要符合以下其中一個條件,我們就稱 $a\rArr b$。

  1. $C_i(a)\lt C_i(b)$
  2. $C_i(a)=C_i(b)\And P_i\lt P_j$

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/db506135-f7be-4ef8-a775-de568efd7ac1/Untitled.png

全序的用途:http://yang.observer/2020/07/26/time-lamport-logical-time/#真分布式锁