Skip to content

模型Model

逻辑时钟

Logical clock · Lamport clock

为事件赋整数时间戳并保证因果先后蕴含时间戳递增。

形式陈述 ​

Lamport 逻辑时钟为每个事件 a 赋整数 C(a),满足时钟条件

a→b⟹C(a)<C(b),

其中 → 是 happens-before 关系。典型实现中,每个内部事件和每个发送事件都先递增本地计数器;发送消息携带这次递增后的值;接收带时间戳 t 的消息时令

C←max(C,t)+1.

以 (C(a),pid(a)) 的字典序可扩张为事件全序,但附加的进程编号顺序不表示因果。

直觉

逻辑时钟不测量物理秒数,而是把因果先后转成编号的严格递增。本地递增规则保证同一进程的事件顺序;接收消息时越过发送方的编号,则把这项保证延伸到消息两端,再由传递性覆盖整条因果链。反过来,彼此无关的事件也可能取得不同编号,单看编号大小不能断定因果。因此,逻辑时钟的用途是在没有同步物理时钟的条件下提供与因果相容的排序键。

例子与边界

若 P 的发送事件递增后得到时间戳 3,消息就携带 3;Q 接收前为 7,接收后设为 max(7,3)+1=8。因此发送事件时间小于接收事件时间。两个互不通信的进程也可能分别产生时间戳 5 和 9,但不能由 5<9 推出前者导致后者。

这说明 C(a)<C(b) 的逆命题一般不成立,只比较标量时间戳不能精确判断并发。逻辑时钟也不保证与真实墙钟接近,网络延迟和时钟漂移不是其目标。把进程 ID 作为次关键字可把 (C(e),pid) 排成总序,适合确定性日志展示;但这个总序包含人为打破的并发关系,不能替代因果分析。时钟整数溢出、进程重启和持久化则属于实现层问题,理论模型通常假设无界自然数。

混合逻辑时钟把标签分成已见物理读数最大值与同值计数器,接收时按双方分量选择四种更新。它延续本页的单向因果保证,并能在另外给定的物理误差模型下界定距离;并发事件仍可被排成先后,物理回拨也不能靠清空逻辑状态处理。

推论与应用

Lamport 时钟以 自然数 为标签,使 Happens-before 关系 中的每条因果边都指向更大的数。这个映射不必单射,也不反映全部偏序关系,因而不应把它称作偏序的嵌入。若应用需要判断两个事件是否真正并发,应转向 向量时钟 等更丰富的结构;若只需构造与因果相容的全局排序,Lamport 时间戳加稳定 tie-break 已足以支持因果一致的事件排序、日志重放、分布式互斥与复制协议。

ABD 的多写者寄存器也使用 (k,p) 的字典序标签,但其 k 由写者先查询多数副本、取得最大计数后加一产生,不是在每个本地事件上递增。身份 p 区分计数相同的并发写;多数查询继承已完成读写的下界,保证后调用的写生成更大标签。仅用私有计数器加身份虽然也有全序,却不能独自提供原子寄存器要求的实时先后保证。

参考资料
  • Nancy A. Lynch, Distributed Algorithms, Morgan Kaufmann, 1996,Ch. 6。
  • Leslie Lamport, “Time, Clocks, and the Ordering of Events in a Distributed System,” Communications of the ACM 21(7), 1978,Full paper, §§1–3。
关系图谱8 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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