我目前正在尝试了解Lamport时间戳。考虑两个过程 P1 (产生事件 a1 , a2 ,...)和 P2 (产生事件 b1 , b2 ,...)。令 C(e)表示与事件相关联的Lamport时间戳 e 。我为每个事件创建了时间戳,如Wikipedia article about Lamport timestamps所述:
根据Wikipedia的描述,以下关系对于所有事件 e1 , e2 均成立:
如果e1发生在e2之前,则C(e1)
让我们看一下 a1 和 b2 。显然 a1 发生在 b2 之前,并且由于 C(a1)= 1 和 C(b2)= 3 ,该关系成立: C(a1)。
问题:该关系不适用于 b3 和 a3 。显然, b3 发生在 a3 之前。但是, C(b3)= 4 和 C(a3)= 3 。因此, C(b3)适用而不适用。
我误会了什么?非常感谢您的帮助!
最佳答案
是的,该定义可能会有些困惑。到目前为止,其他所有人所说的都是正确的,但是为了更好地理解系统,可能遗漏了一个词。 -并发
如果您的进程 p1 和 p2 在同一台计算机上运行,则实际上并不需要太多使用Lamport时钟的方法(也许是某些非常特殊的情况)。相反,您可以只使用操作系统提供的时钟。但是,如果 p1 和 p2 位于由缓慢且不可靠的网络隔开的计算机上怎么办?
Lamport假定,您不能信任本地时钟,并且您没有分布式系统的任何全局状态,在这种状态下,分别在2台计算机上发生了事件。那是您调用那些同时发生的事件的时候。
当您调试分布式系统的执行并看到事件 a3 和 b3 时,您自然会认为 a3 发生在 b3 之前。在您的特定情况下,您现在可以声明,是的,但这是错误的。但是,由于事件不相关,因为它们彼此之间没有通信,所以通常假定顺序是并发的,在这种情况下,对于整个执行过程,哪个事件是第一发生还是第二发生都没有关系。系统。
由于计算机和网络运行得如此快速且仍然非常精确,因此有时很难理解,让我们以略有不同的方式看待同一件事:
p1 和 p2 是生活在几百年前的两个不同山谷中的两个人。他们使用pidgins进行交流,从不谈论何时完成某项任务,只是谈论他们做了什么。这样,没人知道 a3 发生在 b3 之前还是相反,因此它们是同时发生的。也许不是没有人,上帝从 p1 和 p2 上观看就可以看到它。
不幸的是,当您拥有分布式系统时,您不能成为上帝,不能同时观看 p1 和 p2 ,这仅仅是出于 p1 的消息可能比 p2 花费更长的时间的原因。因此,即使您的监控系统(上帝)在收到有关 a4 的信息之前已经收到 b3 的信息,这并不意味着它们按此顺序发生,也许包含有关 a4 信息的软件包花费了更长的时间。或更慢的路径。
最后,还有另一件事叫做vector clocks。对于系统中的每个进程,每个进程都有一个Lamport时钟。此处的关键是,如果 a 的所有Lamport时钟都小于或等于 b 的所有Lamport时钟,则事件 a 只会在事件 b 之前发生。如果您在这个小示例上进行尝试,您会发现在另一个 =>它们是并发之前,没有任何事件发生。