lamport_soon
Lamport算法
- 时间戳
- 概念定义原理做法等
概述
- 逻辑时钟定义
vector时钟 向量时钟
Lamport算法
时间戳
- 用于表示时间的标记或编号,通常是一个数字或字符串。时间戳通常用于记录或标记事件发生的时间点,以便进行时间顺序排序、时间间隔计算、事件跟踪等操作。
- 确定事件发生顺序
概念定义原理做法等
- 旨在解决分布式系统中的事件顺序问题,即如何在不同的节点上准确确定事件的发生顺序
- 核心思想是通过引入逻辑时钟(Logical Clock)来解决事件顺序问题。每个节点在事件发生时都会为事件分配一个逻辑时钟值。逻辑时钟是一个全局有序的计数器,它不同于物理时钟,不一定要与真实的时间同步。
- 每个事件都有一个唯一的时间戳(逻辑时钟值)。
- 如果事件A在事件B之前发生,那么A的时间戳应该小于B的时间戳。
- 事件的时间戳由以下规则确定:
- 对于本地事件(仅在一个节点上发生的事件),时间戳递增。
- 当一个节点发送消息时,将消息的时间戳设置为发送节点的当前时间戳。
- 当一个节点接收到消息时,将消息的时间戳更新为消息时间戳和接收节点的当前时间戳中的较大者加1。
- 主要局限性是,它只关注事件的发生顺序,而不考虑事件的实际时间间隔
- 初始化:
- 初始时,A 和 B 的逻辑时钟都为 0。
- 事件发生:
- 在节点 A 上发生一个本地事件,例如,A 在本地生成了一个数据项:
Event A1
。此时,A 的逻辑时钟增加到 1,并将时间戳附加到事件上:Event A1 [1]
。 - 然后,A 将
Event A1
发送给节点 B,时间戳为 1。
- 在节点 A 上发生一个本地事件,例如,A 在本地生成了一个数据项:
- 接收事件:
- 当节点 B 接收到来自 A 的消息
Event A1 [1]
时,B 的逻辑时钟需要更新。 - 首先,B 比较本地时钟(0)和消息时间戳(1),取较大值加1,于是 B 的逻辑时钟变为 2。
- 然后,B 在接收到的事件上附加时间戳,创建一个新事件:
Event A1 [2]
。 - 现在,B 的事件顺序是
Event A1 [2]
。
- 当节点 B 接收到来自 A 的消息
- 初始化:
概述
-
同步化是分布式系统中的一个重要概念,同步化主要解决的是排序问题。例如:多个线程不能同时操作一个变量,而是将多个线程使用锁或无锁结构进行同步,同步的目的就是将多个线程排序为一个操作时序对这个变量进行操作。
-
分布式系统中,一般用进程来抽象整个系统中的节点,一般理解为一个进程为一台计算机。
-
在单个计算机中,时间是明确的。当进程想要获取时间时,进程就进行一次系统调用,然后操作系统内核就会返回时间给这个进程。
-
计算中物理时钟的的主要问题是时钟偏移(clock skew)。通俗点描述时钟偏移就是钟摆摆动的偏移变慢或者变快或者时快时慢导致时钟不同步。
-
物理时钟同步有一个很重要的点就是即使当前计算机时钟大于标准时间或UTC时间,那么这台计算机的物理时钟也是不会回退的,因为回退会造成很多问题,甚至是致命的问题。通常的解决方式是如果物理时钟过快就增加保持寄存器的值从而增加了时钟的振荡周期;如果物理时钟国漫就减少保持寄存器的值从而减少了时钟的振荡周期;以上都是通过一个过渡期来慢慢调整物理时钟从而达到与标准时间或UTC时间一致的结果。
-
Lamport逻辑时钟只保证因果关系(偏序)的正确性,不保证绝对时序的正确性。
-
逻辑时钟定义
- 如果a和b是同一进程中的两个事件,且a在b之前发生,则a->b为真。
- 如果a是一个进程发送消息的事件,而b为另一个进程接受这个消息的事件,则a->b为真。
- 如果时间x和y发生在两个互不交换消息的进程中,那么x->y不为真,y->x也不为真,我们就称这两个事件是并发的
-
实现Lamport逻辑时钟,每个时钟进程Pi维护一个局部计数器Ci,计数器按照如下步骤进行更新:
- 执行一个事件之前,P执行Ci=Ci+1;
- 当进程Pi发送一个消息m给Pj,在执行1的步骤后,把m的时间戳ts(m)设置为Ci;
- 在接收到消息m时,进程Pj调整自己的局部计数器为Cj=max(Cj, ts(m)),然后执行第一步,即也加一,并把消息传送给应用程序。
vector时钟 向量时钟
- 表示因果关系,可以靠箭头方向看出更精确的事件顺序
- 向量时钟是通过让每个进程Pi维护一个向量VCi来完成的,向量时钟的有以下两个性质:
- VCi[i]是进程Pi截止到目前为止事件发生的数量(也就是自己进程发生的事件数量);
- 如果VCi[j]=K,那么进程Pi就知道进程Pj中已经发生了K个事件。因此,进程Pi知道了进程Pj的逻辑时间。
-