定义happen before关系->满足如下条件:
- 事件a和b在同一个进程中发生,a在b之前发生,那么a -> b
- 事件a是发送信息,事件b是接收该信息,那么a -> b
- a -> b并且b -> c,那么a -> c ,传递性
- 如果a 不happen before b,b也不happen before a,则 a,b是并发的
定义Ci作为进程Pi的时钟,Ci(a)用来给事件a产生一个数字,代表事件的时间。
定义C作为系统的时钟,如果事件b属于进程Pi,那么C(b)=Ci(b),
每个进程都认为自己的时钟是正确的?
逻辑时钟约束:如果a -> b,那么C(a) < C(b)。如果a happen before b,则系统时间存在C(a) < C(b)的关系
实现方式:
为了实现逻辑时钟,假设每个进程i有个变量Ci,用来产生事件的时间。Ci按如下规则变化:
- 每个进程i在节点内事件发生时将Ci递增
- 假设事件a是进程i发送消息m的事件,m需要携带时间戳t=Ci(a);进程j接收到m之后,将Cj设置为比t大并且不小于Cj当前值的值 (存在网络延迟的情况,本地时钟可能已经更新)
发送方递增,接收方更新自己的时间
有了逻辑时钟,我们可以定义所有事件的全序关系了。注意,因为存在两个事件的逻辑时钟一致的情况,所以这里在先任意的选择一个进程全序关系<-,例如我们可以将进程编号的大小关系作为<-。
进程i中的事件a和进程j中的事件b的全序关系=>定义为满足如下任意条件时,a=>b:
- Ci(a) < Cj(b)
- Ci(a) = Cj(b) 并且 Pi <- Pj
Pi,Pj存在某种人为定义的关系即可。