More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. paper
  3. 正文

Time Clocks and the ordering of events Notes

2022年4月12日 521点热度 0人点赞 0条评论

这篇论文讲的就是lamport的logic lock

The Partial Ordering

如果一个事件A发生早于B,大多数人会说A发生在B之前。因为他们会用物理时间来证明这个定义。然而,如果一个系统要满足规范,那么这个规范就必须根据系统内可观察到的事件给出。如果我们的规格是物理时间,那么系统必须包含真正的时钟,而且就算是他包含了真正的时钟,我们也会遇到时钟不准确的可能性。所以我们不通过物理时钟定义“happened before“

我们假设一个系统由若干个进程组成,每个进程包含了具有全序关系的若干个事件。同时将进程间的发送消息和接受消息也定义为事件

我们让->表示happend before,然后有如下的定义:
1. 如果a和b是在同一个进程中的事件,并且a在b的前面,则a->b
2. 如果a是一个进程发送一个消息,而b是另一个进程接收这个消息,那么a->b
3. 如果a->b,b->c,则a->c

对于两个事件,如果不满足a->b,也不满足b->a,那么说a和b是并发的

同时也假设不存在a->a这种情况。所以综上可以发现->是一个自反的偏序关系

20220412101435

图中是一个演示,其中点表示了事件,而曲线表示的是消息的发送。通过图可以看出如果a->b,那么我们可以沿着进程线以及消息线按照时间增加的方向从a移动到b

另一种看待这个定义的方式是说如果a->b,那么就有可能a对b有因果影响(casually affect),如果两个事件没有因果关系,那么两个事件就是并发的

后面他提到了这个定义和狭义相对论的近似。但是狭义相对论中的事件指的是"messages that could be send",而我们的系统中则是"messages that actually are send"

Logical Clocks

我们定义系统中的clock。对于Ci来说,他就是进程Pi对应的时钟。那么Ci\langle a \rangle则代表了对应进程中的事件a的时间。而对于整个系统的始终C以及任意的事件b来说,则有C\langle b \rangle = Cj\langle b \rangle

结合之前的符号->,我们可以给出一个定义,对于任意的事件a,b,如果a->b,则C\langle a \rangle

注意对于反过来的情况是不成立的,因为他们可能是并发的关系,而非happen before

然后再根据->符号的定义,我们可以得到两个条件:
* C1: If a and b are events in process Pi, and a comes before b, then C_i \langle a \rangle
* C2: If a is the sending of a message by process Pi and b is the receipt of that message by process Pj, then C_i \langle a \rangle

然后将clock加入到之前的figure 1中

20220412134726

图中的虚线代表了tick line,即每次clock tick

C1指定了,同一个进程线下的每两个事件之间都必须有一次tick

而C2指定了对于每一条message line,都必须穿过一个tick line

我们可以将tick line作为时间轴上的坐标线(我不知道咋翻译了,含义就是平行于时间轴的线),然后重新画出figure 2

20220412135504

现在假设Ci是进程Pi的时钟寄存器,即当事件a发生的时候,Ci的值是C_i \langle a \rangle,然后下面说我们怎么实现上面提到的clock

对于C1条件来说,我们有:
IR1:Each process Pi increments Ci between any two successive events.

对于C2来说,我们要求每个信息m都要包含他的timestamp Tm,也就是发送消息时候的时间。而进程则必须将其时钟调整到大于Tm。具体的:
IR2(a): If event a is the sending of a message m by process Pi, then the message m contains a timestamp Tm = C_i\langle a \rangle. (b): Upon receiving a message m, process Pj sets Cj greater than or equal to it's present value and greater than Tm.

通过这两个规则,我们就可以让我们的clock满足上面的条件,也就可以追踪到因果关系

Ordering the Events Totally

对于构造全序关系,我们可以结合用任意的一个进程间的全序关系即可。如果两个事件发生的时间相同,那么就用进程之间的全序关系导出事件的全序关系即可。

然后论文中给出了一个通过全序关系解决问题的例子

核心就是通过在消息之间传递时间戳,从而传递因果关系。即如果一个进程收到了其他进程的确认信息,那么就可以保证该进程已经知道了所有在他之前的请求。

这里的因果有两点,如果进程i确认了进程j的请求,那么进程j后续的请求一定会排在进程i现有请求的后面。如果进程i收到了进程j的请求,那么进程i后续的请求一定会排在进程j现有请求的后面。

这样我们就可以构造出两个进程的请求的前后顺序,从而防止出现因果颠倒的情况。

Anomalous Behavior

这里讲的就是对于系统检测不到的因果关系,我们是没办法去构造一个预期的顺序的。

第一种解决的方法就是人工来去指定涉及到外部消息时候的timestamp。

而第二种方法则是构造一个新的系统,满足Strong Clock Condition,即可以探测到外部事件的情况。而很棒的一点是,我们是有可能通过相互独立的物理时钟来构造这样的系统的。所以我们可以通过物理时钟来消除掉这些异常现象。

Physical Clocks

我们在之前的时空图下引入物理时间轴,然后令C_i(t)代表在物理时间t下读取Ci的值。为了数学方面的方便,我们假设时钟是连续的,而非是在离散的tick中运行的

更准确的说,我们可以假设C_i(t)是一个连续可微的函数,那么对应的导数就代表了时钟增加的速率

为了确保时钟Ci是一个物理时钟,我们需要确保他在近似正确的速率上运行,即dC_i(t) / dt \approx 1

更具体的,我们这样假设:
PC1. There exists a constant \kappa << 1, such that for all i: |dC_i(t)/dt - 1|<\kappa

对于ctystal controlled clocks,\kappa \leq 10^{-6}

每一个clock都独立的运行在正确的速率上还不够,我们还需要保证他们是同步的,即:
PC2. For all i,j: | C_i(t) - C_j(t) |<\epsilon

对于figure2来说,如果我们假设tick line代表了物理时间,那么一个tick line在高度上的变化就不能超过\epsilon

现在我们考虑,我们需要多小的\kappa以及\epsilon才能保证不会出现之前提到的异常现象

我们首先假设我们的时钟已经满足了之前的要求,即在不出现系统外部的消息的情况下,我们可以保证顺序。现在只需要考虑的情况就是当用之前的规则错误的时候,我们怎么通过物理时钟来保证不会出现这种情况

我们假设当出现a \boldsymbol{\rightarrow} b(即Strong Clock Condition的条件下)的时候,满足a发生在t时刻,而b发生在t + \mu时刻后。换句话说就是\mu是进程间通信的最小的时间

为了防止异常情况的发生,我们需要保证C_i(t + \mu) - C_j(t) > 0。然后把这条规则和上面的PC1以及PC2结合到一起,就可以得到一个关系。注意我们假设当clock重置的时候,我们不会让时钟回调(因为要保证C1的成立)

PC1则指出C_i(t + \mu) - C_i(t) > (1 - \kappa)\mu
然后根据PC2可以推导出当\epsilon/(1 - \kappa) \leq \mu的时候满足 C_i(t + \mu) - C_j(t) > 0

然后说一下怎么保证PC2的条件,因为时钟会偏移,所以随着时间流逝他们会偏移的越来越多

m代表一个消息,从物理时间t发送,并在物理时间t`接收。我们定义vm = t` - t,作为消息m的总延迟。这个延迟对于收到消息的进程来说是感知不到的。我们可以假设一个最小延迟\mu_m \geq 0,并且\mu_m \leq v_m。我们称\xi_m = v_m - \mu_m为不可预测的延迟(unpredictable delay)

我们现在为物理时钟定义一些规则:
IR1`: For each i, if Pi does not receive a message at physical time t, then Ci is differentiable at t and dC_i(t) / dt > 0
IR2`: (a) If Pi sends a message m at physical time t, then m contains a timestamp T_m = C_i(t). (b) Upon receiving a message m at time t`, process Pj sets Cj(t`) equal to maximum(Cj(t` - 0), Tm + \mu_m)

现在考虑进程之间的关系为一个图,如果Pi到Pj有一条弧,则有一条消息会在每\tau秒从Pi向Pj发送一条消息。图的直径d则是对于图中的任意两个点,他们的之间最多有d条弧

假设任意一个强连通的图都可以满足IR1`以及IR2`。假设对于任意的消息m,有\mu_m \leq \mu,以及对于所有的t \geq t_0,则有(a) PC1 holds. (b) There are constants \tau and \xi such that every \tau seconds a message with an unpredictable delay less thant \xi is send over every arc. Then PC2 is satisfied with \epsilon \approx d(2\kappa\tau + \xi) for all t \gtrsim t_0 + \tau d, where the approximations assume \mu + \xi \ll \tau

标签: 暂无
最后更新:2022年4月12日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS