分布式系统时钟同步(未完)

来源:互联网 发布:与淘宝相似的软件 编辑:程序博客网 时间:2024/05/16 12:01

先说说make的工作原理。其实很简单,程序员修改完所有的源文件后启动make程序,make程序检查所有源文件和目标文件最后被修改的时间。如果源文件input.c的时间是2151,而相应的目标文件input.o的时间是2150,那么make程序知道在input.o创建之后曾经对input.c进行修改过,因此必须对input.o重新编译。在没有全局时钟的情况下可能出现这种情况


物理时钟:

物理时钟大致上就是有两个寄存器与每个石英晶体相关联,一个是计数器,另一个是保持寄存器。石英晶体每次震荡使计数器减1。当计数器减为0时,产生一个中断,计数器从保持计数器中重新装入初始值。每次中断成为一个时钟滴答。

在单机单时钟情况下,如果这个时钟有少许偏差是不会有太大问题的。一旦引入多CPU系统,每个CPU都有自己的时钟,情况将发生变化。实际上,当一个系统有n台计算机时,所有n个晶体都将以略微不同的速度震荡,导致时钟逐渐不同步。


时钟同步算法:

假设每台机器都有一个每秒产生H次中断的计时器。当计时器产生中断时,中断处理程序将软件的时钟值加1,软件时钟记录从过去某一约定时间开始的滴答(中断)数。我们将这个值成为C。更具体的说,当UTC时间为T时,机器P上的时钟值为Cp(t)。最理想的情况是对所有的p和t,都有Cp(t)=t,换言之dC/dt的理想值为1


(1)Cristian算法

这种算法适合于只有一台机器上有WWV接收器,其他所有机器都要与那台机器同步。

这种方法有两种问题,一个主要,一个次要。主要问题是时间不能倒退,所以要逐步的调整。次要问题是发送时间的过程有延迟,解决办法是检测延迟。


(2)Berkeley算法

这种算法适合没有一台机器有WWV接收器的。该系统中的服务器是主动的,它定期的询问每台机器的时间,基于这些回答,它计算出一个平均时间值,并告诉所有其他机器将它们的时钟拨快到一个新的时间,或者拨慢。



逻辑时钟

 对于某类算法而言重要的是时钟的内部一致性,而不是它们是否与真实时间接近,这类算法通常将时钟称为逻辑时钟。

(1)Lamport时间戳

Lamport定义了一个“先发生”的时间关系,a->b表示所有进程一致认为a先发生,然后b才发生。这种先发生关系有两种情况:

如果a和b是同一个进程中的两个事件,且a在b发生之前,则a->b为真

如果a是一个进程发送消息的事件,b是一个进程接收消息的事件,则a->b也为真。

先发生关系满足传递性。

一个例子

a图由于三台机器以不同的时钟频率运行,可能出现奇怪的问题C从进程2传递到进程1发生了时间倒退,消息D从进程1到进程0也发生了。

Lamport解决方法是遵循先发生关系。既然C在60是可离开那么它只能在61或更晚的时刻到达,每个消息都应该携带依据发送者时钟的发送时间,当消息到达并且接受者时钟显示的时间值比发送时间早,接受者就将它调到比发送时间大1的时刻。

总结一下:每两个事件之间,时钟必须至少滴答一次。

一个例子:全序多播

为了提高查询效率,银行可能在两个不同的城市都保存了一个账户数据库的拷贝,比如纽约和旧金山,一个查询总是被发送到最近的那个拷贝。假设一位旧金山客户想在他的账户中村$100,且他当前账户中有$1000,与此同时纽约的银行职员要向该账户加进1%的利息,但是由于网络延迟(一个在东海岸,一个在西海岸),两个操作的顺序不同了。

像这种情况需要进行一次全序多播。

每个消息都以它的发送者的当前逻辑时间作为时间戳。进程收到一个消息后,将他放进一个本地队列中,并根据他的时间戳进行排序,最终所有的进程都将有相同的本地队列拷贝,只有当队列中的一个消息处于队头,并且已经被所有其他的进程确认时,进程才可以将他交付给运行这种的应用程序,此时把消息从队列中删除。

(2)向量时间戳

一个例子:

Four locations:  pitcher’s mound, first base, home plate, and third base

Ten events:

e1:  pitcher throws ball to home
e2:  ball arrives at home
e3:  batter hits ball to pitcher
e4:  batter runs to first base
e5:  runner runs to home
e6:  ball arrives at pitcher
e7:  pitcher throws ball to first base
e8:  runner arrives at home
e9:  ball arrives at first base

e10:  batter arrives at first base

pitcher知道e1->e6->e7

home plate知道e2->e3->e4->e8

e8 e9之间的关系不清楚

使用Lamport得到

        L(e1) = 1     (pitcher throws ball to home)
        L(e2) = 2     (ball arrives at home)
        L(e3) = 3     (batter hits ball to pitcher)
        L(e4) = 4        (batter runs to first base)
        L(e5) = 1        (runner runs to home)
        L(e6) = 4        (ball arrives at pitcher)
        L(e7) = 5        (pitcher throws ball to first base)
        L(e8) = 5        (runner arrives at home)
        L(e9) = 6        (ball arrives at first base)
        L(e10) = 7    (batter arrives at first base)

使用向量时间戳



0 0