向量时钟不仅同步本进程的时钟值,而且还同步已知的其他进程时钟值
分布式系统中每个进程Pi保存一个本地逻辑时钟向量值VCi,VCi(j)代表进程Pi知道的进程Pj的本地逻辑时钟值
- 初始化VCi向量为[0,…]
- 进程Pi每发生一次事件,VCi[i]加一
- 进程Pi给进程Pj发送消息,需带上自己的向量时钟VCi
- 进程Pj接收消息后
- 更新VCj向量为VCj向量与VCi向量中的最大值
- 将VCj中自己对应时钟值加一,也就是VCj[j]加一
从以上算法可以很容易地得出下面两个结论:
- 同一个进程内的两个事件a和b,如果 a → b,那么 VCi (a) < VCi (b)。
- a是Pi进程的消息发送事件,b是Pj进程该消息的接收事件,那么 VCi (a) < VCj (b)。
那么如何证明VC(a) < VC(b) 可以推导a → b呢?
如果事件a、b在同一个进程,那么肯定a->b
如果事件a、b分别在进程Pa和Pb中那么设c为发送a更新事件,d为接收a更新时间
- 如果a=c且d=b,那么显然a->b
- 如果a=c且d->b,那么a->b
- 如果a->c且d=b,那么a->b
- 如果a>c且d->c,那么a->b
因此可得VC(a)<Vc(b)的情况下,a->b
Ref
- https://yang.observer/2020/09/12/vector-clock/