Lamport Logical Clock 学习

1,导论

①如何在分布式环境下定义系统中所有事件的发生顺序?②分布式环境下多个进程竞争资源时如何互斥?③什么是偏序,偏序的作用是什么,有什么不足?④什么是全序,全序的作用是什么,有什么不足?⑤为什么需要物理时钟,物理时钟如何同步?下面来进行介绍。

2,偏序的定义、发生在先(happened before)关系

考虑单一的进程A,在某时刻发生了事件E1,经过一段时间后,发生事件E2,可以说:E1发生在E2前面。考虑多个进程,进程A向进程B发送消息,进程A发送消息时记为事件E1,进程B接收到进程A发送的消息记为E2,可以说:E1发生在E2前面。以上两个例子表明了E1与E2是一种偏序的关系。之所以说明这两个例子所代表的关系是偏序的,是因为:当需要判断下图中的 a 和 e 这两个事件谁先谁后时,在偏序关系下是无法判断的。

偏序的定义:(1)若a,b 是同一进程中的两个事件,且 a 发生在 b 之前,则 a ---> b  (---> 符号 表示 发生在先 关系, !---> 符号 表示 非发生在先 关系)

(2)若 a 是 "一个进程发送消息 "事件,b 是一个进程接收消息事件,则 a ---> b

(3)若 a !--->b and b!---> a ,则称 a、b是并发的。如上图中 事件a 与 事件e 就是并发的。

发生在先关系即偏序的代名词。

3,全序

在 2 中,由于偏序不能表示 图中事件a 和 事件e 的先后关系,而在分布式系统中对所有的事件排序又是必须的,因此就需要另一种方法来定义所有事件的顺序,即用Lamport 逻辑时钟来定义分布式系统中所有事件的全序。

“引用自网络”
Logical Clock解决的问题是找到一种方法,给分布式系统中所有时间定一个序,
这个序能够正确地排列出具有因果关系的事件(注意,是不能保证并发事件的真实顺序的)
,使得分布式系统在逻辑上不会发生因果倒置的错误。 

Lamport 逻辑时钟如下:

首先定义一个Clock Condition:如果 a ---> b ,则 C(a) < C(b)(C(a)可以理解成事件a的"发生时刻")。再给出两个条件C1和C2,C1定义:若 a,b是同一进程i中的两个事件且 a---> b,则 Ci(a)<Ci(b)

C2定义:若事件a代表发送消息的进程i 发送消息,事件b代表接收进程j接收该消息,则Ci(a) < Cj(b)。显然,当条件C1与C2成立时,Clock Condition是成立的。

在C1 和 C2 的基础上,再定义两个处理操作:IR1 和 IR2 (参考论文中的描述)。IR1、IR2 的本质就是,在同一进程中,a 在 b 之前发生 ,则需要设置 b 的时间戳大于 a的时间戳;在不同进程之间发送消息时,设置接收消息的事件的时间戳要 大于 发送消息这一事件的时间戳。

全序的定义:

各个进程间发生的事件的全序定义,可采用不同的方式。即论文中提到的 arbitrary total ordering.

理解如下:比如,可以把各个进程之间标序号。如1,2,3,4……当进程之间有并发的事件时,规定序号小的进程相应的事件 发生得早。比如上图:设进程P的序号为1,进程Q的序号为2,对于事件e和事件a而言,就认为 事件e “早于” 事件a 发生。

这样,由IR1 和 IR2 这两个操作,再加上 将各进程标序号这种方式 就可以对所有的事件定义一个全序了,这样就解决了在分布式系统中如何对所有事件排序这一问题。上图的一个全序如下:

(1:1,e)---(1:2,f)---(2:1,a)---(2,2,b)    格式解释:(进程序号:事件顺序号,事件名称)

在这里出现了一个小小的问题:(1:2,f)---(2:1,a)???----可能是向量时钟需要解决的吧???

4,分布式环境下,多个进程之间竞争资源如何互斥?

现有一临界资源,对它的访问要求如下:

?占有资源的进程,在它将该资源授权其其他资源时,必须先释放该资源

?对资源的授权必须按照 提出资源请求的顺序 进行。即,若进程A先于进程B申请资源(有全序关系的保证,当然就知道请求的先后顺序了),那么在分配资源时,应该将资源先分配给A用。

?对任何已获得资源的进程,最终会释放资源;也即,任何进程发生的 申请资源的请求最终会被响应。换句话说,占有资源的进程最终会使用完该资源并释放(不会死锁),这样就保证了任何资源请求最终会

被响应。

如何解决该问题呢?

Lamport 大师提出了一个算法如下:

?若要请求资源,进程Pi需要发送一个格式为 Tm:pi 的请求消息给系统中的其他所有进程,并将该消息放入自己的请求队列中。(Tm表示消息的时间戳)

?当其他进程如Pj收到 Tm:pi请求后,将它放到自己的请求队列中,并发送一个带有时间戳的确认给pi。

?释放资源时,pi从自己的消息队列中删除所有的 Tm:pi请求,并向其他所有的进程发送带有时间戳的 pi资源释放消息。

?当其他进程,如pj收到pi的资源释放消息时,pj从自己的消息队列中删除所有的 Tm:pi请求消息。

?若同时满足如下两个条件,则将资源分配给进程pi:

a)按照 全序 关系 排序后, Tm:pi请求 排在它的请求队列的最前面---即,在进程pi中, Tm:pi资源请求消息是最先 发生的。

b)pi 收到了所有其他进程发给它的时间戳大于Tm的消息

根据算法的?????能够证明???是成立的。

部分证明的理解如下:

证明?的成立:反证法。

假设?不成立,则意味着在资源分配给某进程后,假设该进程为Pm,还有其他进程未释放该资源,假设为Pn,那么对于这个进程来说,意味着它还未释放资源,根据??,也就意味着它还未将该请求从自己的队列中删除,同时,由?可知,pm中还存储着pn请求资源的消息。而进程Pm之所以能获取资源,说明它满足了?的两个条件,但是根据?的条件a)说明进程Pm的资源请求是最早的,但是实际上Pn的请求要更早,因为它比Pm更早获得授权,但是该请求还未从Pm的队列中删除,因此?的条件a)就不可能满足,这样就找到了矛盾的地方。

证明?的成立:

根据?的a)可知,资源的分配是按照 发生资源请求的 全序关系排序的,且排在队列最前面的请求最先得到满足。因此?成立

证明?的成立:

根据???可请证明?成立。假设pi已经拥有的资源,它发送一个带时间戳的资源释放请求给其他所有进程,其它进程就把当初进程pi请求资源时发送给它们的消息从队列中删除(参考?),这样使得其它进程(非pi进程)的请求队列中资源请求消息变成最早的了(因为,最最早的pi资源请求消息已经被删除了),这样就使得任何进程发出的资源请求消息最终能够被响应。

5,逻辑时钟存在的问题(Anomalous Behaviour)以及引入物理时钟的原因

采用上述讨论的逻辑时钟还不能完成给事件排序。考虑下面一个情况:小A 在 A市 的计算机A上发送了一个请求A,然后打电话告诉 住在B市的小B,让小B 在计算机B上产生一个请求B。在现实的物理世界中看出是请求A导致了请求B的发生,即A是因,B是果。但在逻辑时钟系统下,可能会出现A的时间戳排在B的时间戳的后面。为啥?因为“打电话”这一手段可以理解为是在逻辑时钟系统外部发生的。比如请求A在标号为2的进程上发生,而请求B在标号为1的进程上发生,排全序时,请求B的时间戳会小于请求A的时间戳。

如何解决这样的情况?一种解决思路是把“打电话”这一事件也加入到系统中来考虑。这时,单纯地用Lamport 逻辑时钟就不能对所有的事件进行全排序了。因此,就引入了物理时钟来解决该问题。

引入物理时钟之后,物理时钟的正确工作是需要一定的条件的,即各个计算机使用的物理时钟值不能偏差太大。因此,又提出了物理时钟同步。物理时钟的同步主要有两种方式:1)有一个标准的时间服务器,各个Client都去连接该时间服务器同步时钟,从而达到各个Client的时钟是同步的。2)Berkeley算法:时钟服务器主动地询问各个Client的当前的时钟值,各个Client就会告诉时钟服务器它们各自的时钟是多少,时钟服务器把收集到的这些值,再加上自己的时钟值,得出一个平均值。并计算出各个Client的时钟值与该平均值的差值,时钟服务器把该差值分别发送给各个Client,让它们进行调整。

如:Client A 比平均值少5秒,则Client A 需要加快自己的时钟计数(并不是把自己的时钟值倒退5秒),其实相当于物理学中的将加速度增大了。

6,Lamport逻辑时钟的局限性

a)使用逻辑时钟的方法给所有的事件排序时,必须保证所有的进程都参与其中(参考上面的算法描述),即不容许进程失败。而这在现实的分布式系统中几乎是不可能的。b)该算法假设消息是按序到达的,且一定会传递成功。这可以通过消息序号和确认机制来保证(TCP协议)。

7,参考文献

《time clocks and the ordering of events in a distributed system》论文

Time Clocks and the Ordering of Events in a Distributed System(译文)

全序, 分布式一致性的本质

我对Lamport Logical Clock的理解

时间: 2024-10-07 05:10:06

Lamport Logical Clock 学习的相关文章

我对Lamport Logical Clock的理解

建议先看论文原文再来看这篇文章,我不会对论文中的各个点都具体说明.仅仅是写一些我自己的想法,帮助理解. 大家都知道.分布式环境下.确定各个事件发生的顺序非常重要,不然就会发生一些麻烦的问题. 考虑一下这个问题:小明要用同学给的优惠码在京东上买一本书.如果京东的后台架构如图一所看到的.A是前端代理server,负责接收用户请求,B是优惠码验证server,当用户请求使用优惠码的时候,A会把请求发给B.让B来验证.C是日志server.专门存放日志.系统中的不论什么一个操作都会记录到日志server

[转载] 架构领域学习资料

原文: http://qing.blog.sina.com.cn/2244218960/85c41050330031zq.html 系统架构领域的一些学习材料 标签:架构学习材料系统systemresearch 系统架构是一个工程和研究相结合的领域,既注重实践又依赖理论指导,入门容易但精通很难,有时候还要讲点悟性,很具有“伪科学”的特征.要在此领域进阶,除了要不断设计并搭建实际系统,也要注意方法论和设计理念的学习和提炼. 经常有同学询问如何学习,特贴一篇学习材料,供大家参考.09年时写的,在系统

系统架构领域的一些学习材料

标签:架构学习材料系统systemresearch 转载:http://qing.blog.sina.com.cn/2244218960/85c41050330031zq.html?utm_source=tuicool&sudaref=www.tuicool.com 系统架构是一个工程和研究相结合的领域,既注重实践又依赖理论指导,入门容易但精通很难,有时候还要讲点悟性,很具有"伪科学"的特征.要在此领域进阶,除了要不断设计并搭建实际系统,也要注意方法论和设计理念的学习和提炼.

redis学习六 集群的原理(转载)

转载自 http://shift-alt-ctrl.iteye.com/blog/2285470 一.Redis Cluster主要特性和设计     集群目标 1)高性能和线性扩展,最大可以支撑到1000个节点:Cluster架构中无Proxy层,Master与slave之间使用异步replication,且不存在操作的merge.(即操作不能跨多个nodes,不存在merge层) 2)一定程度上保证writes的安全性,需要客户端容忍一定程度的数据丢失:集群将会尽可能(best-effort

(转)一些经典的计算机书籍

以下列表中的计算机书籍(中文版)来自微博:@程序员的那些事 粉丝的推荐.按推荐次数,从高到低往下排.如果大家还有其他计算机相关的经典书籍推荐,请在评论中留言,或者在这条微博的评论中留言,我们将继续扩充这个列表.1. 算法导论(第2版)2. 代码大全(第2版)3. C++ Primer中文版(第4版)4. 设计模式:可复用面向对象软件的基础5. 浪潮之巅6. Java编程思想(第4版)7. Java核心技术 卷1:基础知识8. Java核心技术 卷2:高级特性9. 人月神话10. Linux内核编

Java内存模型-jsr133规范介绍

原文地址:http://www.cnblogs.com/aigongsi/archive/2012/04/26/2470296.html; 最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几个章节的内容,觉得受益匪浅.废话不说,简要的介绍一下java内存规范. 什么是内存规范 在jsr-133中是这么定义的 A memory model describes,

后端技术:分布式系统理论 - 从放弃到入门

分布式系统理论 - 从放弃到入门随承载用户数量的增加和容灾的需要,越来越多互联网后台系统从单机模式切换到分布式集群.回顾自己毕业五年来的工作内容,同样有这样的转变. 毕业头两年负责维护运行在刀片机上的业务,在机房里拔插单板的日子是我逝去的青春.设备之间通过VCS组成冷备,但即使有双机软件保护,宕机.网络丢包等问题发生时业务仍会受影响.这样的系统架构下为保证SLA,有时候需要深入 Linux系统内核或硬件层面分析机器重启的原因. 接下来负责维护承载在分布式集群上的业务,相比前面的工作,这个阶段主要

分布式系统理论进阶 - Raft、Zab

引言 <分布式系统理论进阶 - Paxos>介绍了一致性协议Paxos,今天我们来学习另外两个常见的一致性协议——Raft和Zab.通过与Paxos对比,了解Raft和Zab的核心思想.加深对一致性协议的认识. Raft Paxos偏向于理论.对如何应用到工程实践提及较少.理解的难度加上现实的骨感,在生产环境中基于Paxos实现一个正确的分布式系统非常难[1]: There are significant gaps between the description of the Paxos al

分布式系统理论基础 - 时间、时钟和事件顺序

十六号…… 四月十六号.一九六零年四月十六号下午三点之前的一分钟你和我在一起,因为你我会记住这一分钟.从现在开始我们就是一分钟的朋友,这是事实,你改变不了,因为已经过去了.我明天会再来. —— <阿飞正传> 现实生活中时间是很重要的概念,时间可以记录事情发生的时刻.比较事情发生的先后顺序.分布式系统的一些场景也需要记录和比较不同节点间事件发生的顺序,但不同于日常生活使用物理时钟记录时间,分布式系统使用逻辑时钟记录事件顺序关系,下面我们来看分布式系统中几种常见的逻辑时钟. 物理时钟 vs 逻辑时