逻辑时钟:Lamport时间戳

时间:2015-06-20 18:51:59

标签: messaging distributed clock timing distributed-system

我目前正在尝试了解Lamport时间戳。考虑两个流程 P1 (生成事件 a1 a2 ,...)和 P2 (生成事件 b1 b2 ,...)。设 C(e)表示与事件 e 相关联的Lamport时间戳。我按照Wikipedia article about Lamport timestamps

中的说明为每个事件创建了时间戳

enter image description here

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

如果e1发生在e2之前,那么C(e1)< C(E2)。

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

问题 b3 a3 的关系不适用。显然, b3 发生在 a3 之前。然而, C(b3)= 4 C(a3)= 3 。所以 C(b3)< C(a3) 适用。

我误解了什么?非常感谢帮助!

3 个答案:

答案 0 :(得分:4)

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

如果你的进程 p1 p2 在同一台机器上运行,那么确实没有太多需要使用lamport时钟(可能是一些非常具体的情况) )。相反,您可以使用操作系统提供的时钟。但是,如果 p1 p2 在由缓慢且不可靠的网络分隔的计算机上呢?

Lamport假设,您不能信任您的本地时钟,并且您没有分布式系统的任何全局状态,其中发生了两台独立计算机上的事件。那是你同时调用那些事件的时候。

当您调试分布式系统的执行时,您会看到事件 a3 b3 ,您自然会认为 a3 发生在 b3 之前。在您的具体情况下,您现在声称,是的,但这是错误的。但是,因为事件不相关,因为它们没有相互通信,所以通常假定顺序是并发的,并且在这种情况下,无论哪一个发生在第一个或第二个,对于整个执行系统。

由于计算机和网络工作如此之快且仍然非常精确,有时很难理解,让我们看一下同样的事情:

p1 p2 是两个人在100年前生活在两个不同的山谷中。他们使用pidgins进行交流,从不谈论他们何时完成某项任务,只是他们所做的事情。这样,没有人能够知道,如果 a3 发生在 b3 之前或者相反,那么它们就会同时发生。也许不是没有人,上帝在 p1 p2 上看到了它。

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

最后,还有一个名为vector clocks的东西。每个过程都有一个灯管时钟,用于系统中的每个过程。关键是,事件 a 只会在事件 b 之前发生,如果 a 的所有灯管时钟都小于或等于 b的时钟即可。如果你试试看你的小例子,你会发现在其他 =>之前没有发生任何事件。它们是并发的

答案 1 :(得分:2)

Lamport认为:我们通常无法使用物理时间来查明其中发生的任意事件对的顺序。在提出的示例中,您忽略了此假设。

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

答案 2 :(得分:1)

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

  

如果e1发生在e2之前,那么C(e1)< C(E2)。

然而,Lamport将“之前发生的”定义为部分排序。这就是维基百科关于部分有序集的说法:

  

这种关系被称为偏序,以反映不是每一对元素都需要相关的事实:对于某些对,可能是这两个元素都不在另一个元素中。

根据Lamport对“之前发生的”的定义, b3 a3 无关,因此 b3 没有“发生之前” “ a3 ,因此问题中陈述的等值不一定适用。