一通电话,五页纸之后才出现。
原帖说 1978 年那篇论文「开头藏着一个打电话的例子」。我把 lamport.org 上的八页 PDF 逐页扒了一遍:开头 p.558 用的是 airline reservation system,机票预订。打电话那对 A 城 B 城,在 p.562「Anomalous Behavior」节,第五页。例子本身改写得挺好,连「messages external to the system」那层意思都传达出来了;位置错了。
这种小错本来不值一提。可这篇帖子后面那个不等式,错得就不小了。
回一手源对账
- 帖子写「ξ/(1−κ) 不超过 μ」,并把 ξ 解成「同步后两台钟还能差出的最大值」,μ 解成「消息在两台机器之间飞的最短时间」。p.563 的原文是 ε/(1−κ) ≤ μ。ε(epsilon)才是 PC2 里两钟读数差的上界 |Ci(t)−Cj(t)| < ε;ξ 在同页另有定义,「ξm = vm − μm the unpredictable delay of the message」,是消息不可预测延迟。至于 μ,论文写「μ is less than the shortest transmission time for interprocess messages」——它是外部因果(那通电话)造成的最小物理间隔的一个下界,还特别说「depending upon how messages in ℰ are transmitted, μ could be significantly larger」。把它讲成系统内消息的最短时间,恰好把「系统外」这层吞掉了。
- 于是「钟越准、消息越快,越安全」这句就自相矛盾:真按帖子的定义,消息越快 μ 该越小;可公式要 μ 大才安全。改成「钟差够小、外部事件隔得够开」才读得通。κ 也不是「一秒走 1+κ 秒」,PC1 是 |dC/dt − 1| < κ,双边偏差,典型晶振 ≤10⁻⁶。
- 「永远不会发生」是有前提的定理。p.563 明文假设「时钟重置时 always set forward and never back」,并说这条不等式要「together with PC1 and PC2」才推出 anomalous behavior is impossible。前提一条都不能少。
- 逻辑钟「收到消息取大者再加一」:IR2(b) 只要求把 Ci 设成「≥ 当前值且 > Tm」,没有 +1。max+1 是后来教材的通行实现,不是 Lamport 1978 的原文。
- 「慢,但对」。同一页 p.562 论文自己交代了代价:这套状态机「requires the active participation of all the processes」,「the failure of a single process … thereby halting the system」。任一进程挂了全系统停摆,这个致命弱点被四个字盖过去了。
- 还有一条归属:p.565 致谢写「The use of timestamps to order operations, and the concept of anomalous behavior are due to Paul Johnson and Robert Thomas」。Lamport 是作者,概念他自己归给了那两位。
1978 年 7 月 CACM 21(7),pp.558–565,八页,版权行印着 $00.75——全对。happened-before 三条件、并发的定义、「problems often arise because people are not fully aware of this fact」那句提醒、Clock Condition 的单向性、按进程编号把偏序补成全序且「全序不唯一、只有偏序唯一确定」、互斥那五条规则,都准确。图灵奖授奖词里的 causality and logical clocks、2000 年 PODC 首届最具影响力论文奖(2003 年才改名 Dijkstra Prize)、Chandy-Lamport 1985 快照、Fidge 1988 与 Mattern 1989 的向量钟,也都有出处。
补三个日期:Received 1976-03,revised 1977-10,published 1978-07。声明日、修订日、上架日,分开摆着好看些。
说到底
这篇论文最狠的一手,是把「分布式系统里时间是什么」这个哲学问题,压成了一道能验的工程不等式。原帖这个判断我完全同意。可不等式里的每个字母都是有主儿的,前提也得一条条挂着。把 ε 写成 ξ,飞机照样不落地——形式全在,里子错了。