http://research.microsoft.com/en-us/um/people/lamport/pubs/time-clocks.pdf

分布式系统的时钟同步是一个非常困难的问题,this paper致力于分布式系统的逻辑时钟同步问题。

文中有个结论值得注意:
In a distributed system, it is important to realize that the order in which events occure is only a partial ordering. 
分布式系统中事件的时序只能是偏序(不可能为全序)。

文中使用了一种确认两个事件a、b是否存在先后顺序的简单有效的方法:在时空图中如果能找到从a到b的时间线,则认为a、b纸件存在先后顺序;否则,认为他们是同时发生的(无法判断先后则认为同时发生)。

文中介绍了一种简单的分布式逻辑时钟系统,不同进程间通过事件中的时间戳来缺点事件发生的先后,它是偏序的;同时指出,如果要构建全序的时钟系统,需要一种方法定义在偏序中被认定为“concurrent“的事件的先后;同一套系统,使用不同的方法可能得到不同的先后顺序;

文中证明了一种使用有偏差的物理始终,构建一个分布式始终,它能达到的偏差的理论上限;这个误差与同步时间间隔、两个节点间的不可预见延时成正比;

文中提出了分布式系统中对互斥资源管理正确性的三个条件(充分条件,没有证明是必要条件):

1.  a process which has been granted the resource MUST release it before it can be granted to another process;
如果一个资源已经分配给了某个进程,那么在分配给其他进程前必须先释放这个资源;(可能主动也可能被动释放,这个确保了资源的独占性);

2. different requests for the resource MUST be granted in the order in which they are made
获取资源的顺序必须与请求的顺序相同。(这是非常困难的条件)

3. if every process which is granted the resource eventually release it, then every request is eventually granted.
如果最终每个获取到资源的进程都释放了请求,那么每一个请求都已经获取到了资源;(这是条件,不是结果)

文中提出了一种能满足上述三个条件的实现方法:

前提假设(不是必要的假设,只是为了简化问题):

1.对于任何两个进程pi和pj,消息的发送和接收拾有序的(使用tcp即可做到这点);
2.消息最总都能发送成功,不会丢失(tcp的重传也能做到这点);
3.每个进程p都维护一个请求消息队列,各个队列之间是完全独立运作的;


算法步骤:
1. pi为了请求资源,给其他的每个进程发送一个消息提:Ti:Pi,其中Ti是发送的本地时间戳;然后将这个消息放入自己的消息队列中;
2.Pj收到Tm:Pi时,将这个消息放入自己的消息队列中,并发送一个带时间戳的ack给Pi(如果Pj已经发送过一个比Tm更晚的ack,这里不需要发送;注意早晚的判断使用的事Pi的时间戳比较的)
3.释放资源时,Pi从队列中删除所有Tm:Pi请求消息,并发送一个带时间戳的释放资源消息给所有的进程;
4.当Pj接收到Pi的释放消息时,它删除队列中所有的Tm:Pi请求消息;
5.任何进程Pi能获取到资源的条件是:1)在它的消息队列中,才能在Tm:Pi请求消息,且这个消息在其他所有消息之前;2)Ti从每个进程那里接收到了比Tm更晚的消息;

其实上面的算法要求,每个进程要获取到资源,都要知道在它获取的事件点之前,系统其他所有节点是否有申请资源。

Note: Time clocks and the ordering of events in a distributed system的更多相关文章

  1. 译《Time, Clocks, and the Ordering of Events in a Distributed System》

    Motivation <Time, Clocks, and the Ordering of Events in a Distributed System>大概是在分布式领域被引用的最多的一 ...

  2. Time, Clocks, and the Ordering of Events in a Distributed System

    作者:Leslie Lamport(非常厉害的老头了) 在使用消息进行通信的分布式系统中,使用物理时钟对不同process进行时间同步与事件排序是非常困难的.一是因为不同process的时钟有差异,另 ...

  3. 【SaltStack官方版】—— Events&Reactor系统—EVENT SYSTEM

    Events&Reactor系统 EVENT SYSTEM The Salt Event System is used to fire off events enabling third pa ...

  4. Method and apparatus for providing total and partial store ordering for a memory in multi-processor system

    An improved memory model and implementation is disclosed. The memory model includes a Total Store Or ...

  5. 「2014-2-23」Note on Preliminary Introduction to Distributed System

    今天读了几篇分布式相关的内容,记录一下.非经典论文,非系统化阅读,非严谨思考和总结.主要的着眼点在于分布式存储:好处是,跨越单台物理机器的计算和存储能力的限制,防止单点故障(single point ...

  6. mysqldump: Couldn't execute 'show events': Cannot proceed because system tables used by Event Schedu

    最近将老版本的mysql 实例倒入 percona 5.5.30,使用的是线上的全备,结果将mysql 库下的表也倒入了,这下可悲剧了,备份报错. 没办法,将mysql库下的数据倒出来,清空,再倒入p ...

  7. Note on Preliminary Introduction to Distributed System

    今天读了几篇分布式相关的内容,记录一下.非经典论文,非系统化阅读,非严谨思考和总结.主要的着眼点在于分布式存储:好处是,跨越单台物理机器的计算和存储能力的限制,防止单点故障(single point ...

  8. 分布式系统(Distributed System)资料

    这个资料关于分布式系统资料,作者写的太好了.拿过来以备用 网址:https://github.com/ty4z2008/Qix/blob/master/ds.md 希望转载的朋友,你可以不用联系我.但 ...

  9. Networked Graphics: Building Networked Games and Virtual Environments (Anthony Steed / Manuel Fradinho Oliveira 著)

    PART I GROUNDWORK CHAPTER 1 Introduction CHAPTER 2 One on One (101) CHAPTER 3 Overview of the Intern ...

随机推荐

  1. O018、理解 Keystone 核心概念

    参考https://www.cnblogs.com/CloudMan6/p/5365474.html   作为OpenStack的基础支持服务,Keystone做了下面几件事情:       1.管理 ...

  2. slf4j日志的使用-学习笔记

    maven项目: 一.首先在pom.xml文件中添加maven依赖 这是其中一种: <dependency>     <groupId>org.slf4j</groupI ...

  3. python3.7 利用pyhive 连接上hive(亲测可用)

    来python爬虫中,经常会遇到数据的存储问题,如果有大量数据,hive存储是个不错的选择. 那么python如何来连接hive呢?网上有各种教程但是都不是很好用,亲自测试pyhive可用 要求:可用 ...

  4. Zabbix 3.2.6使用注意事项

    1.如果需要使用zabbix自带的SMTP发送邮件,需要在安装前升级系统的curl到7.20版本以上 2.zabbix对接PHP 7.1版本,因为PHP 7.1类型强化,会在安装完成zabbix,登录 ...

  5. Linux——Session复制中的失败的可能原因之一

    组播地址问题 route add -net 224.0.0.0 netmask 240.0.0.0 dev eno16777728(自己的网卡名)

  6. xorm:golang的orm(只写了一小部分)

    xorm xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便.这个库是国人开发的,是基于原版 xorm:https://github.com/go-xorm/xorm 的定制 ...

  7. 2.flask模板--jinja2

    1.jinja2模板介绍和查找路径 import os from flask import Flask, render_template # 之前提到过在渲染模板的时候,默认会从项目根目录下的temp ...

  8. c++ 实现https网页上的图片爬取

    一.主要的原理 我们通过发送一个http请求,获得目标网页的html源代码,然后通过正则表达式获取到图片的URL,把该网页的所有的图片都保存到一个文件夹,这就是整个软件的流程. 二.具体的实践 现在很 ...

  9. Jenkins+GitHub 项目环境搭建(一)

    安装Jenkins yum install -y java-1.8.0-openjdk wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkin ...

  10. python分别获取虚拟网卡和真实网卡ip

    #!/usr/bin/python # -*- coding: utf-8 -*- import commands import socket import fcntl import struct C ...