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进程发出的资源请求而言,由全序关系 ,排在队列前面的请求先得到满足。再由❺的b),pi收到所有的其它进程发过来的请求,意味着pi知道了其他进程的事件请求操作情况,因此,它就知道了当前它的Tm:pi 请求在整个系统中是不是最早的,而❺的b)中:pi 收到了所有其他进程发给它的时间戳大于Tm的消息,这样它就确定Tm是最早的资源申请请求了,就会给Pi的Tm:pi 请求分配资源。
因此ⓑ成立
证明ⓒ的成立:
根据❸❹❺可请证明ⓒ成立。假设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 逻辑时钟就不能对所有的事件进行全排序了。因此,就引入了物理时钟来解决该问题。
其次,对于逻辑时钟而言,是没有错误概念这一说的。failure这个概念只有在物理时间上下文中才有意义,如果没有物理时间,就没有办法去区分进程是出错了还是只是处于事件之间的间隔之中。用户只能通过系统很长时间都没有响应来判断系统出了问题。
引入物理时钟之后,物理时钟的正确工作是需要一定的条件的,即各个计算机使用的物理时钟值不能偏差太大。因此,又提出了物理时钟同步。物理时钟的同步主要有两种方式: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 学习的更多相关文章
- 我对Lamport Logical Clock的理解
建议先看论文原文再来看这篇文章,我不会对论文中的各个点都具体说明.仅仅是写一些我自己的想法,帮助理解. 大家都知道.分布式环境下.确定各个事件发生的顺序非常重要,不然就会发生一些麻烦的问题. 考虑一下 ...
- 分布式系统根基:物理时钟和Lamport逻辑时钟
分布式系统解决了传统单体架构的单点问题和性能容量问题,另一方面也带来了很多的问题,其中一个问题就是多节点的时间同步问题:不同机器上的物理时钟难以同步,导致无法区分在分布式系统中多个节点的事件时序.19 ...
- [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle
[源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Mingle 目录 [源码解析] 并行分布式框架 Celery 之 Lamport 逻辑时钟 & Ming ...
- Vector Clock/Version Clock
physical clock 机器上的物理时钟,不同的机器在同一个时间点取到的physical clock不一样,之间会存在一定的误差,NTP可以用来控制这个误差,同一个机房内的机器之间的时钟误差可以 ...
- redis学习六 集群的原理(转载)
转载自 http://shift-alt-ctrl.iteye.com/blog/2285470 一.Redis Cluster主要特性和设计 集群目标 1)高性能和线性扩展,最大可以支撑到1 ...
- 《In Search of an Understandable Consensus Algorithm》翻译
Abstract Raft是一种用于管理replicated log的consensus algorithm.它能和Paxos产生同样的结果,有着和Paxos同样的性能,但是结构却不同于Paxos:它 ...
- Java内存模型-jsr133规范介绍
原文地址:http://www.cnblogs.com/aigongsi/archive/2012/04/26/2470296.html; 近期在看<深入理解Java虚拟机:JVM高级特性与最佳 ...
- 深入浅出Hadoop之mapreduce
卿哥原创,转载请注明出处,谢谢 之前已经作出预告,那么今天就聊聊mapreduce,起源于Google的map reduce paper, 而后经历了mapreduce 1,和构建于yarn上的map ...
- Raft翻译
英文原文:https://web.stanford.edu/~ouster/cgi-bin/papers/raft-atc14 In Search of an Understandable Conse ...
随机推荐
- React 支持JS
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- python学习笔记三——控制语句
2.5 运算符与表达式 2.5.1 算术运算符和算术表达式 算术运算符包括四则运算符.求模运算符和求幂运算符. 算术运算符 加减乘除:+ - * / 表达式:x+y x-y x*y x/y ...
- ubuntu iftop工具安装和参数
安装iftop有很多依赖关系: sudo apt-get install flex bison wget http://www.tcpdump.org/release/libpcap-1.5.3.ta ...
- js 算數(Math)對象
算數對象不需要聲明,可以直接使用, Math對象方法及作用: round()四捨五入: random()生成0到1的隨機數: max()選擇較大的數: min()返回較小的數:
- linux 运维常用的一些命令收集
1.删除0字节文件find -type f -size 0 -exec rm -rf {} ; 2.查看进程按内存从大到小排列ps -e -o “%C : %p : %z : %a”|sort ...
- BZOJ1895Pku3580 supermemo——非旋转treap
题目描述 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx:::Ayg的每个元素都加上D.例如对f1,2, 3,4,5g执行"AD ...
- BZOJ3453 XLkxc(拉格朗日插值)
显然f(i)是一个k+2项式,g(x)是f(i)的前缀和,则显然其是k+3项式,插值即可.最后要求的东西大胆猜想是个k+4项式继续插值就做完了.注意2p>maxint…… #include< ...
- VMware配置Linux中APPache服务器
[软件] VMware SecureCRT [镜像文件] Centos6.8 APPache软件包 [步骤] 1.将所需文件通过SCRT传入到虚拟机中 2.挂载镜像 2.1 将镜像挂载到mn ...
- HSQL可视化工具
本地使用HSQL数据库进行开发,多是集成在开发工具的内部,比如studio,往往看不到HSQL数据库,那么如何查看HSQL数据库呢? 可以使用hsql自带的可视化工具,运行hsqldb-*.jar 包 ...
- ARC062 - F. Painting Graphs with AtCoDeer (Polya+点双联通分量)
似乎好久都没写博客了....赶快来补一篇 题意 给你一个 \(n\) 个点 , 没有重边和自环的图 . 有 \(m\) 条边 , 每条边可以染 \(1 \to k\) 中的一种颜色 . 对于任意一个简 ...