时间和时钟Time and Clock
时钟有什么用处
1.知道发送请求到服务器需要多久
需要客户端和服务端时钟是同步的
2.用时间戳来安排在分布式系统中的事务
需要分布式系统中的时钟是同步的
3.A是什么时候转钱给B
需要准确的时钟,与global authority 同步
时钟偏移(skew)和时钟漂移(drift)
1.时钟偏移是指 两个时钟的读数的瞬间的不同。
2.时钟漂移率 是指由参考时钟度量的每个单位时间内,时钟与参考的偏移量
同步系统对于最大时钟漂移率有个界限
两种同步方式
外部同步
如果需要准确的时间戳。用外部时间源同步进程的时钟Ci。时钟与外部时钟同步到一定精度D。
内部同步
内部同步是指在分布式系统内,所有时钟同步到一定精度。
内部同步的时钟未必是外部同步的。
但是一个系统外部同步到范围D,那么这个系统在范围2D之内是内部同步的。
同步系统中如何同步
1.如果直接让Ts=Tc,相当于我们直接忽略网络延迟。偏移最大为最大的网络延迟
2.如果我们直接加最大或者最小的网络延迟。偏移最大为max-min
3.最好办法是折中
异步系统同步的三种方式
Cristian 方法
直接用来回的时间除以二来估计单向的时间偏移。
如何提高精度?
先发送几个空的request,得到若干T round,然后取其中最小的那个(如果T round= 2T)偏移程度直接为0
Berkeley 方法
只用于内部同步。
服务器轮询客户端。客户端把他们的时间返回给服务器。服务器用Cristian的办法得出时间。然后计算包括他自己在内,时钟的平均值。然后发送调整值(offset)给其他客户端,让他们做出调整。
解决了读取错误时钟的问题。主机采用容错平均值,读不到出错的那个。
主机有毛病了,就选个新的主机。
网络时间协议(Network Time Protocol)
定义了时间服务的体系结构和在互联网上发布时间信息的协议
1.使互联网用户与UTC同步
如何实现同步
1.组播
组播模式用于高速LAN。准确率低。相当于直接把时间发出去。
2.过程调用模式(procedure-call mode)
类似于Cristian算法。
3,对称模式(symmetric mode)
最高准确性。一对服务器互发消息。
实际的传输时间和偏移
估计偏移时间可以简化成
实际的偏移时间和估计的偏移时间差为
d为精确度估计
总结
同步系统界限
bound=(max-min)/2
异步系统同步有以下几个办法
1.Cristian算法
2.Berkeley算法
3.网络时间协议
1.组播
2.过程调用模式(procedure-call mode)
3.对称模式(symmetric mode )
逻辑时间与时间戳
在同步系统的情况下,时间可以按着时钟来排序进行。
如果没有同步时钟,该如何排序?
进程(Process)状态(State)事件(Event)
一个系统里有n个进程
进程的状态随时间改变
状态改变由事件决定:
1.本地计算
2.发送信息
3.接受信息
事件排序
在同一个进程中,事件可以根据本地时钟排序。
那么跨进程的事件该怎么安排?
发生在先关系 Happened-before(HB)
因果序,潜在因果序
1.在同一进程中,时间发生的顺序就是观察到的顺序
2.消息在不同进程传递,先是发送再是接收
HB规则
1.同一进程可以直接观察到顺序
2.对于消息,肯定是先发送再接收
3.传递性
例子:
这种情况不能判断在a之前或者之后。a和e是并发concurrent的。
Lamport 逻辑时钟(logical clock)
进程给事件加上Lamport时间戳。捕获happen-before 关系
算法:
对于每个进程pi
1.初始化本地时钟Li=0
2.在进程发出每个事件之前 Li+1
3.发消息时,要把附加值带着t=Li
4.接收消息时,进程pi Lj=max(Lj,t)
5.接收消息前,Lj=Lj+1
如果事件e’发生在e之后,那么L(e’)肯定大于L(e)
反推L(e’)>L(e),不能判断哪个在前面
向量时钟
每个事件都有一个数组。每个进程维护它自己的向量时钟Vi,数组大小取决于有几个进程。
算法操作类似于上面的逻辑时钟。
如何比较向量时钟。
比较数组中的所有元素的大小来得出:
如果不能比较,两个事件就是并发的
时间戳总结
如何跨进程比较时间戳
1.物理时间戳
要求时钟同步
2.lamport时间戳
不能区分因果和并行顺序的事件
3.向量时间戳
需要的信息很大