Skip to content

模型Model

向量时钟

Vector clock

用每进程计数向量在标准消息传递模型中精确刻画事件因果偏序。

形式陈述 ​

在含 n 个固定身份进程的标准消息传递模型中,记由进程内顺序与消息发送—接收边生成的因果关系为 →。每个进程 i 维护初始为全零的向量 Vi∈Nn,每个事件的时间戳取该事件完成时钟更新后的值。本地或发送事件前递增自身分量;消息携带向量;进程 i 收到向量 W 时先取逐分量最大值,再递增自身分量:

Vi←max(Vi,W),Vi[i]←Vi[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)。P1 的第一个事件就是一次发送,其递增后的时间戳及消息所携向量为 (1,0,0);P2 已有 (0,1,0),接收后取最大并递增自身,得到 (1,2,0)。独立的 P3 事件为 (0,0,1);它与 (1,2,0) 两边都不逐坐标支配,所以二者并发。

上述精确等价依赖固定进程身份、可靠事件规则和标准 happened-before 模型;压缩时钟或共享内存变体需要重新陈述保证。向量维度固定为参与者数量,动态成员或海量客户端会造成元数据膨胀;版本向量、点版本向量等变体会在特定复制模型中压缩信息。在本页对每个事件都递增的规则下,不同实际事件不会获得相等向量。同一进程的事件由自身坐标严格区分;若另一进程的事件已取得前者的最新计数,前者就已因果先于它,接收方的自身递增又使两向量严格不同。初始化的全零值不是事件时间戳。点式版本向量等针对对象更新的摘要采用不同的编号规则,不能把它们的相等情形套到这个逐事件结论上。

推论与应用

逻辑时钟 只保证因果蕴含时间递增,向量时钟则精确实现 Happens-before 的 偏序 嵌入。它用于多主复制中的冲突检测、因果广播和分布式调试;版本向量等相邻构造会针对对象版本而非每个事件维护因果摘要。其主要代价是时间戳通常包含每个进程一个分量,即 Θ(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。
关系图谱6 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系