http://yang.observer/2020/09/12/vector-clock/#向量时钟算法

https://lrita.github.io/2018/10/24/lamport-logical-clocks-vector-lock/

Lamport Logical Clock 的問題在於「對於兩個事件 a 和 b,如果 $a\rarr b$,則 $C(a)\lt C(b)$。但反過來若 $C(a)\lt C(b)$ 並不代表 $a\rightarrow b$」

想要 $C(a)\lt C(b)\Leftrightarrow a\rarr b$,可以使用 Vector Clock。

Vector Clock 將在每一個 process(或節點)上紀錄一個 Vector 的 Clock,也就是如果有 $N$ 個 process,那麼每個節點都存有 $N$ 個 logical clock。$V_{i}[j]$ 是在 process $P_i$ 上,process $P_j$ 的 logical clock,而 $V_i(a)$ 代表事件 $a$ 在 process $i$ 中的邏輯時間。

算法如下:

  1. 初始化所有的時鐘為 0。
  2. Process $P_i$ 中發生一個事件,將 $V_i[i]=V_i[i]+1$。
  3. Process $P_i$ 給 process $P_j$ 發送消息,需要帶上自己的邏輯時鐘陣列 $V_i$
  4. Process $P_j$ 接收消息後,將本地邏輯時鐘加一 $V_j[j]=V_j[j]+1$,並且更新本地所有邏輯時鐘的其他所有值 $V_j[k]=max\{V_j[k],V_i[k]\}\ \forall\ k\ne j$

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d8476d29-bae7-4aa9-8234-a13959b6eb4b/Untitled.png

若向量 $V_i$ 中的每個元素都小於等於 $V_j$ 中的對應元素,則稱 $V_i\lt V_j$

以上算法可以很輕易地看出: