形式陈述
在含 n 个固定身份进程的标准消息传递模型中,记由进程内顺序与消息发送—接收边生成的因果关系 公理库 Happens-before 关系 Happens-before · Causal order 由程序顺序及模型规定的通信或同步边生成的事件因果严格偏序。 为 → 。每个进程 i 维护初始为全零的向量 V i ∈ N n ,每个事件的时间戳取该事件完成时钟更新后的值。本地或发送事件前递增自身分量;消息携带向量;进程 i 收到向量 W 时先取逐分量最大值,再递增自身分量:
V i ← max ( V i , W ) , V i [ i ] ← V i [ i ] + 1. 定义 u ≤ v 为逐分量不大于,u < v 为 u ≤ v 且 u ≠ v 。对事件时间戳 V ( a ) , V ( b ) ,在该模型及规则下
a → b ⟺ V ( a ) < V ( b ) . 两个向量不可比当且仅当相应事件并发。
直觉
向量时钟为每个进程保留一个因果进度分量,其中第 j 个分量记录当前事件已知的进程 j 历史进度。本地事件推进自己的坐标,消息接收则逐坐标取最大值,于是一个事件的向量概括了它所“知道”的各进程历史前缀。逐坐标小于等于恰好对应一份因果知识被另一份完整包含,两个向量互不可比则揭示并发。相比只能保序、不能反推因果的标量逻辑时钟,它用 O ( n ) 元数据换回了因果关系的反向判定能力。
图片加载失败 向量时钟的接收合并
例子与边界
若 V ( a ) = ( 2 , 0 ) 、V ( b ) = ( 0 , 3 ) ,二者不可比,表示并发;若 V ( c ) = ( 2 , 4 ) ,则前两者都先于 c 。
三进程初始均为 ( 0 , 0 , 0 ) 。P 1 的第一个事件就是一次发送,其递增后的时间戳及消息所携向量为 ( 1 , 0 , 0 ) ;P 2 已有 ( 0 , 1 , 0 ) ,接收后取最大并递增自身,得到 ( 1 , 2 , 0 ) 。独立的 P 3 事件为 ( 0 , 0 , 1 ) ;它与 ( 1 , 2 , 0 ) 两边都不逐坐标支配,所以二者并发。
上述精确等价依赖固定进程身份、可靠事件规则和标准 happened-before 模型;压缩时钟或共享内存变体需要重新陈述保证。向量维度固定为参与者数量,动态成员或海量客户端会造成元数据膨胀;版本向量、点版本向量等变体会在特定复制模型中压缩信息。在本页对每个事件都递增的规则下,不同实际事件不会获得相等向量。同一进程的事件由自身坐标严格区分;若另一进程的事件已取得前者的最新计数,前者就已因果先于它,接收方的自身递增又使两向量严格不同。初始化的全零值不是事件时间戳。点式版本向量 公理库 Dotted Version Vector Dotted Version Vector · DVV · 点式版本向量 用版本向量表示连续因果前缀,并以额外 dot 精确标识前缀之外单个更新事件的逻辑时钟。 等针对对象更新的摘要采用不同的编号规则,不能把它们的相等情形套到这个逐事件结论上。
推论与应用
逻辑时钟 公理库 逻辑时钟 Logical clock · Lamport clock 为事件赋整数时间戳并保证因果先后蕴含时间戳递增。 只保证因果蕴含时间递增,向量时钟则精确实现 Happens-before 公理库 Happens-before 关系 Happens-before · Causal order 由程序顺序及模型规定的通信或同步边生成的事件因果严格偏序。 的 偏序 公理库 偏序 Partial order · Partially ordered set 满足自反、反对称和传递性的关系。 嵌入。它用于多主复制中的冲突检测、因果广播和分布式调试;版本向量等相邻构造会针对对象版本而非每个事件维护因果摘要。其主要代价是时间戳通常包含每个进程一个分量,即 Θ ( n ) 空间;稀疏表示和矩阵时钟可在不同工作负载下作进一步权衡。
参考资料
Friedemann Mattern, “Virtual Time and Global States of Distributed Systems,” in Proceedings of the Workshop on Parallel and Distributed Algorithms, 1989, pp. 215–226,Full paper。
Nancy A. Lynch, Distributed Algorithms, Morgan Kaufmann, 1996,Ch. 6。