分布式系统全局时钟事件排序算法

分布式系统全局时钟事件排序算法

首页休闲益智真实事件排序游戏更新时间:2024-05-01

时间概念是我们思维方式的基础,它源于事件发生顺序等更基本的概念,事件排序的概念贯穿于我们对于系统系统的思考。分布式系统由一系列空间上相互分离的进程组成,进程之间通过交换消息通信。如果消息传递时延相比于单进程中事件处理的时间不可忽略,那么它是一个分布式系统。一组网络互联的计算机是一个分布式系统; 单台计算机也是一个分布式系统,它的中央处理器、内存单元及I/O通道是互相分离的进程。在分布式系统中,有时不可能说两个事件中哪一个首先发生,"happended before"关系仅是系统中的局部排序,论文给出了一个分布式算法用于将其扩展到所有事件的一致总排序。该算法可以为实现分布式系统提供有用的机制,使用一种解决同步问题的简单方法来说明其用法

局部排序

通常人们会说事件A发生在事件B之前,如果事件A发生的时间早于事件B发生的时间,它们可能是基于物理时间理论来做论证判断。系统要正确地满足规范,首先必须根据系统内观察到的事件给出该规范。如果规范是物理时间,则系统必须包含实时时钟,即使它确实包含真实的时钟,仍然存在不完全准确并且不能保持精确物理时间的问题。因此,将在不使用物理时钟的情况下定义"happended before"关系

首先更精确的定义我们的系统,假设系统由一系列进程组成,每个进程包含一系列事件。根据应用在计算机上执行一个子程序或者单个机器指令都可以是一个事件,假设一个进程的事件形成一个序列,其中a发生于b之前。如果a发生在b之前,换言之,单个进程被定义为具有先验总排序的一组事件

假设在进程中发送/接收消息是一个事件。定义系统事件集上的"happended before"关系(使用"->"符号标识)满足三个条件的最小关系

1.如果a和b是同一进程的事件,并且a出现在b之前,则有关系 a->b

2.如果a是一个发送消息进程,b是另一个进程接收相同消息,则有关系 a->b

3.如果存在关系 a->b && b->c,然后a->c。如果事件a未发生于事件b之前,并且事件b未发生于事件a之前,则两个不同事件a和b被认为是并发的

系统中任意事件发生于它自身之前似乎没有什么物理意义,因此,->是对系统中所有事件集的反自身排序

Space-Time

时空图: 横向表示空间,纵向表示时间(沿波浪线方向递增),点代表事件(p1,p2,q1,r1...),竖线表示过程,波浪线表示消息

a->b 即沿着进程和消息从a点向前移动到b(e.g. q1 -> r4); 或者描述为事件a与事件b互为因果关系。如果两个事件都不会因为因果关系而影响另一个事件,则会同时发生(并发)。例如事件p3和q3就是并发执行,在事件P4之前,进程P不知道进程Q在q3处做什么,直到它在p4处接收到消息。

从狭义相对论的不变时空公式来理解,这个定义似乎很自然。相对论中事件的顺序是根据可以发送的消息来定义的,但是,我们采取了更实用的方法,只考虑实际发送的消息--通过确实发生的那些事件来判断系统是否正确执行

逻辑时钟

从抽象观点开始,引入系统时钟的概念,其中时钟只是一种为事件分配数字的方式,数字被认为是事件发生的时间。为每一个进程Pi定义时钟Ci,并将数字Ci<a>分配给进程Pi的任意事件a。整个系统的时钟由函数C表示,函数C为系统中任意事件b分配数字C<b>,其中C<b>=Cj<b>,如果b是进程Pj中的事件。到此我们没有假设数字Ci<a>与物理时间的关系,因此我们可以将时钟Ci视为逻辑时钟而不是物理时钟,它可以由没有实际定时机制的计数器实现

基于事件发生的顺序,考虑定义系统时钟条件(强):如果事件a发生在事件b之前,则a应该在比b更早的时间发生。正式描述为: 对于任意事件 a,b: if a-> b then C<a> < C<b>; 不期望该条件反向成立,如果反向亦成立,那么两个并发事件发生必须保证同一时间(太苛刻)

从强时钟条件定义的"happended before"关系,简单实现IR1和IR2意味着满足时钟条件,它们保证了正确的逻辑时钟系统

IR1 每一个进程Pi在两个连续的事件之间保持Ci递增

IR2 (a)如果事件a通过进程Pi发送消息m,消息m包含发送时间戳Tm=Ci<a>; (b)一旦接收到消息m,进程Pj设置Cj大于或等于它自身代表的值,设置时间戳大于Tm

全局排序算法

我们可以使用满足时钟条件的时钟系统来对所有系统事件集合进行总排序。考虑由共享单个资源的固定进程集合组成的系统,一次只能有一个进程使用该资源,因此进程必须自行同步以避免冲突。我们希望找到一种算法将资源授予满足以下三个条件的进程:

(1) 已授予资源的进程必须先将其释放,然后才能将其授予其他进程

(2) 必须按照它们不同请求顺序授予资源

(3) 如果被授予资源的每个进程最终都会释放它,那么每一个请求最终都会被授予资源

算法由以下五个规则定义,方便起见假定每个规则的Action形成单个事件

1.进程Pi将消息Tm:Pi发送到其他进程请求资源,同时将消息put到它的请求队列,Tm是这个消息的时间戳 2.当进程Pj接收到请求消息Tm:Pi,将它放入请求队列同时发送消息通知到Pi 3.为了释放资源,进程Pi从它的请求队列移除Tm:Pi请求资源消息,并且发送Pi释放请求资源消息给所有其他进程 4.当进程Pj接收到Pi释放资源消息,它将从自身的请求队列中移除Tm:Pi请求资源消息 5.当满足以下两个条件时,进程Pi被授予资源 <a>在其请求队列中存在Tm:Pi请求资源消息,该消息在其队列中的任何其他请求消息之前(通过关系=>排序) <b> Pi已经从其他进程接收一个时间戳在Tm之后的消息 小结

"happended before" 概念定义了分布式多进程系统中事件的不变部分排序,论文描述了一种算法,用于将该部分排序扩展到任意总排序,并展示了如何使用这个总排序来解决一个简单的同步问题。算法定义的总排序是任意的,如果它不同意系统用户所感知的排序,则会产生异常行为,这可以通过使用适当同步的物理时钟来防止,定理表明了时钟可以同步的程度
,
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved