尽管时钟同步是可能的,但是它不是绝对必要的。
如果两个进程不交互,那么它们的时钟也无需同步。
1、Lamport时间戳
如果a,b是同一个进程的两个事件,a在b发生前发生,那么a->b为真。
如果a是一个进程发送消息的事件,而b为另一个进程接受这个消息的事件,则a->b也为真。
逻辑时钟:进程按下列规则修改它们自己的逻辑时钟:
LC1:
在进程Pi发出每个事件之前,Li加1:Li=Li+1、
LC2:
(a)当进程Pi发送消息m时,在m中附加值t=Li
(b) 在接收(m,t)时,进程Pj计算Lj=max(Lj,t),然后在给receive(m)事件打时间戳时应用LC1。
2、向量时间戳
每个进程P维护一个向量V。该向量具有下面两个性质
a: Vi[i]是目前为止进程Pi发送的事件数目
b: 如果Vi[j] = k, 那么进程Pi知道进程Pj已经发生了K个事件
第一个性质通过进程Pi发生新事件事,递增Vi[i]来完成。
第二个性质通过发送消息中携带进程的事件向量来完成。设消息中携带的时间向量为vt[]
进程Pj收到Pi发送的消息m时:Pj调整自己的时间向量,Vj[k] = max{Vj[k], vt[k]},此后将Vj[j]自增1.
PS:一些分布式存储系统,对数据项后面加上版本号,更新时增加版本号的值,应该算一种逻辑时钟吧。