逻辑时钟:Lamport 时间戳

Logical Clocks: Lamport Timestamps

我目前正在尝试了解 Lamport 时间戳。考虑两个进程P1(产生事件a1a2,...)和P2(产生事件 b1b2,...)。设 C(e) 表示与事件 an e 关联的 Lamport 时间戳。我为每个事件创建了时间戳,如 Wikipedia article about Lamport timestamps:

中所述

根据维基百科,以下关系适用于所有事件 e1e2

如果e1发生在e2之前,则C(e1) < C(e2)。

让我们看看a1b2。显然 a1 发生在 b2 之前,并且由于 C(a1) = 1 C(b2) = 3,关系成立:C(a1) < C(b2).

问题:该关系不适用于 b3a3。显然,b3发生在a3之前。但是,C(b3) = 4C(a3) = 3。所以 C(b3) < C(a3) 适用。

我误会了什么?非常感谢您的帮助!

Lamport 假设:我们通常不能使用物理时间来找出其中发生的任意一对事件的顺序。在建议的示例中,您忽略了这个假设。

P1P2 独立增加它们的时钟。当事件发生时,发起进程将其当前值发送到目标进程,目标进程检查接收到的值是否小于其当前值。如果是,它将其当前值更改为接收值 + 1,否则丢弃接收值。在你的情况下,P1P2 不发送他们的事件 a3b3

我发现了我的错误。我写道:

If e1 happened before e2, then C(e1) < C(e2).

然而,Lamport 将 "happened before" 定义为偏序。这是维基百科关于偏序集的说法:

Such a relation is called a partial order to reflect the fact that not every pair of elements need be related: for some pairs, it may be that neither element precedes the other in the poset.

根据 Lamport 对 "happened before" 的定义,b3a3 不相关,因此 b3 没有 "happen before" a3,因此问题中陈述的等式不一定成立。

是的,这个定义可能有点令人困惑。到目前为止,其他人所说的都是正确的,但是可能缺少一个词,以便更好地理解系统。 - 并发

如果你的进程 p1p2 在同一台机器上 运行 ,真的没有太多需要使用 lamport 时钟(可能是一些非常特殊的情况)。相反,您可以只使用 OS 提供的时钟。但是,如果 p1p2 位于被缓慢且不可靠的网络分隔开的计算机上怎么办?

Lamport 假设,您不能相信您的本地时钟,并且您没有分布式系统的任何全局状态,2 台独立计算机上的事件按此顺序发生。那就是你称这些事件同时发生的时候。

当您调试分布式系统的执行时,您自然会看到事件 a3b3假设 a3 发生在 b3 之前。在您的具体情况下,您现在会声称,是的,但那是错误的。但是,由于事件不相关,因为它们彼此之间没有通信,因此通常假定顺序是并发的,在这种情况下,对于整个执行过程,先发生还是后发生并不重要系统。

由于计算机和网络的工作速度如此之快,而且仍然非常精确,有时很难理解,让我们稍微不同地看待同一件事:

p1p2 是生活在 100 多年前的两个不同山谷中的两个人。他们使用洋泾浜语一起交流,从不谈论他们何时完成某项任务,只谈论他们做了什么。这样,没有人可以知道 a3 是否发生在 b3 之前,或者相反,因此它们同时发生。也许不是没有人,上帝在 p1p2 上看到了。

不幸的是,当你有一个分布式系统时,你不能同时观看 p1p2,只是因为来自 p1 的消息可能比来自 p2 的消息花费的时间更长。因此,即使您的监控系统(上帝)在收到有关 a4 的信息之前已经收到了 b3 的信息,但这并不意味着它们发生在那个顺序,也许包含有关 a4 信息的包只走了更长或更慢的路径。

最后还有个东西叫vector clocks。每个进程都有一个用于系统中每个进程的 lamport 时钟。这里的关键是,事件 a 只会在事件 b 之前发生,如果 a 的所有 lamport 时钟都是小于或等于 b。如果你在你的小例子中尝试一下,你会发现没有事件发生在另一个 => 它们是并发的.