【问题标题】:About distributed logical clock, Lamport Algorithm关于分布式逻辑时钟、Lamport 算法
【发布时间】:2021-07-11 03:16:10
【问题描述】:
大家好,我想问一下分布式系统中的逻辑时钟。 Lamport 算法定义当事件 a 在进程 Pi 中发送消息,并且在进程 Pj 中事件 b 收到该消息,则可以定义事件 a 在 b 之前发生。假设进程 Pj 在事件 b 处收到消息之前,事件 c 发生在 Pj 上(因此 c 发生在 b 之前)并发送消息进程 Pi,然后进程 Pi 在事件 a 之后在事件 d 处收到消息,那么我们就有事件 c , 以及 a, 发生在 d 之前。
我的问题是,如何定义事件a(第一个事件发生在进程Pi上)和事件c(第一个事件发生在进程Pj上)之间的关系?如何让进程 Pi 和 Pj 都同意事件 a 和 c 的顺序?
Lamport 算法:http://en.wikipedia.org/wiki/Lamport_timestamps
【问题讨论】:
标签:
synchronization
logic
clock
distributed-system
【解决方案1】:
答案很简单。基于 Lamport 算法,您无法定义事件 a 和 c 之间的任何关系。我们所知道的所有事情是:
a -> b 和 c -> d 和 a -> d 和 c -> b
但你不能得出 a -> c 或 c -> a
就这样。
【解决方案2】:
重要的是这些过程在事件发生的顺序上是一致的。
为了同步逻辑时钟,Lamport 定义了一种称为先前发生的关系。表达式 a -> b 读作“a 出现在 b 之前”。这种发生关系可以在两种情况下看到:
-
如果'a'和'b'是同一个进程的事件,并且'a'发生在'b'之前,那么
a -> b 为真。
-
如果'a'是进程发送消息的事件,'b'是事件
另一个进程收到消息,则 a-> b 也为真。
算法是如何工作的?
每条消息都有发件人的发送时间。所以接收器修改时间,以防它的时间小于发送器的时间。所以算法同步接收器的时钟。
发送到另一个进程的每条消息都将包含发送消息的时间单位,因此会检查时钟。