当前位置:文档之家› 分布式系统中进程的同步方法

分布式系统中进程的同步方法

分布式系统中进程的同步方法【摘要】在分布式操作系统中,为了实现进程的同步,首先要对系统中发生的事件进行排序,还要有良好的分布式同步算法。

本文对分布式操作系统中的一些常见算法进行了分析,从而解析才能使进程在分布式操作系统中更加正确有效地协同工作。

【关键字】分布式操作系统,进程,同步,算法。

【Abstract】In the distributed operating system,in order to achieve the process of synchronization,First, you want to sort of events that occur in the system,but you also distributed synchronization algorithm.This article analyzes some common algorithms in the distributed operating system, to resolve to make the process more correctly and effectively work together in a distributed operating system.【Key words】Distributed operating system, Process, Synchronous, Algorithm.在分布式系统中,处于不同物理位置的若干进程通过传递消息相互通信,进行协同工作完成同一任务。

工作过程中,进程产生了大量的事件和消息,这些事件和消息在时间上的先后顺序对工作正确有效的完成往往是有影响的。

由于进程所处的物理位置不同带来的时钟差异如各地时钟值的差异和时钟运行精度的差异等)和网络传输延时等方面的原因,一个进程所看到的系统内事件和消息的先后顺序很可能与它们的实际顺序是不一致的,这样就带来了问题,如图1所示。

100 150 300 350 物理时间图1 分布式进程通信示例在一个先来先服务的分布式系统中,X地的进程Pi在时刻100时向Z滴的进程Pk发出了请求服务的消息Rq,并盖上了本地的时间戳130,随后Y地的进程Pj也向Pk发出了请求服务消息,并盖上了本地的时间戳120。

Pj的消息在时刻300到达Pk,而Pi的消息在时刻350才到达Pk。

这样,对Pk而言,不管到达的顺序还是按照时间戳的大小都应该先对Pj进行服务,这显然是不公平的。

因此,在分布式系统中必须采取一定的同步机制来保证工作的顺利进行和结果正确。

进程同步大致有两种程度:一种是局部的松散同步,即事件和消息产生的逻辑顺序上简单同步;一种是全局的精确同步,即各进程的本地时钟基于现实世界物理时间标准同步。

前一种同步能由Lamport算法和Ricart and Agrawla 算法等算法实现。

在这种同步机制中,各进程利用逻辑时钟产生时间戳,能保证按序发送消息,同样接收进程也能按序接收。

或者说,接受进程能按序从各个不同进程接收消息,而且从同一进程接收的消息也是顺序的。

但这种同步仅仅保证了事件和消息的顺序一致性,而不能反映它们产生的真实时间,因为同步机制中所采用的时间戳只能看作是一个数字编号,并没有和物理时钟精确对应起来。

这种同步机制在分布式系统的实际应用中有着很大的局限,因为很多现实的分布式系统都要求系统内的事件和消息的产生时间是精确的,甚至有些系统的任务结果是否正确直接有赖于这些精确的时间值,比如大型分布式数据库系统、电子商务和证券交易等金融业服务系统、分布式文件系统等。

在这些系统中,各进程间的同步就必须达到基于物理时钟同步的程度。

以证券系统为例,如果客户机的时钟与服务器的时钟不同步,那么客户按照自己的时钟所提出的服务请求将会被服务器提早或推迟执行,这可能会给客户带来巨大的损失。

这时,客户的服务请求是否被顺序公平的响应已失去了意义。

在单机条件下,诸进程运行于同一个处理机和内存环境中,进程通信十分简单。

进程之间可以借助于“共享存储器”进行直接通信。

而在多机条件下,相互合作的进程可能在不同的处理机上运行,进程间的通信涉及处理机的通信问题。

在松散耦合系统中,进程间通信还可能要通过较长的通信信道,甚至网络。

因此,在多机条件下,广泛采用间接通信方式,即进程间是通过消息进行通信的。

在分布式操作系统中,为了实现进程的同步,首先要对系统中发生的事件进行排序,还要有良好的分布式同步算法。

首先,看事件排序问题。

在单处理机系统及紧密耦合的多处理机系统中,由于共有一种时钟又共享存储器,确定两个事件的先后次序比较容易。

而在分布式系统中,既无共用时钟,又无共享存储器,自然也就难于确定两个事件发生的先后次序了。

这里所说的排序,既包括要确定两个事件的偏序,也要包括所有事件的全序。

Lamport于1978年提出的一个算法。

该方法建立在以下基础上:(1)事件之间存在的偏序;(2)为每一个进程设置一个逻辑时钟。

所谓逻辑时钟,是指能为本地启动的所有活动,赋予一个编号的机构,他可以用计数器来实现。

在系统中,每一个进程都拥有自己的逻辑时钟c。

在一个系统的逻辑时钟系统,应满足条件:对于任何活动a(ini)和b(inj),如果a->b,则相应的逻辑时钟c(i,a) < b(j,b)。

其中i,j表示处于不同物理位置的进程。

为了满足上述条件,必须遵循以下规则:第一,根据活动发生的先后,赋予每个活动唯一的逻辑时钟值。

第二,若活动a 是进程i 发送的一条消息m,消息m中应包含一个时间邮戳T(m)=c(i,a);当接受进程j在收到消息时,如果其逻辑时钟c(j,b)<c(i,a),则应当重置c(j,b)大于或等于c(j,b)。

这里我们对第二个规则作些说明。

由于每个进程都拥有自己的逻辑时钟,这些时钟的运行并非同步,因此可能出现这种情况:一个进程i发送的消息中所含的逻辑时钟c(m)=100,而接收进程j在收到此消息时的逻辑时钟c(j)= 96,这显然违背了全序的要求,因为发送消息事件A和接收事件B 之间存在着A->B 的关系。

因而提出了第二项规则,用于实现逻辑时钟的同步。

根据这个规则,应该调整进程j 的时钟,使c(j)>=c(m),例如c(j)=c(m)+1=101。

其次,看同步算法。

在所有的同步算法中,都包含以下四项假设:(1)每个分布式系统具有N个节点,每个节点有唯一的编号,可以从1 到N。

每个节点中仅有一个进程提出访问共享资源的请求。

(2)按序传送信息。

即发送进程按序发送消息,接收进程也按相同顺序接收消息。

(3)每个消息能在有限的时间内被正确地传送到目标进程。

(4)在处理机间能实现直接通信,即每个进程能把消息直接发送到指定的进程,不需要通过中转处理机。

在同步算法中,相对比较著名的算法还有Ricart and Agrawla 算法和Mackawa(Square-Root)算法等。

1、Ricart and Agrawla 算法Ricart 等提出的分布式同步算法,同样基于Lamport 的事件排序,但又做了些修改,使每次访问共享变量时,仅需发送2(N-1)个消息。

下面是对Ricart and Agrawla 算法的描述。

(1)当进程Pi要求访问某个资源时,它发送一个Request(Ti,i)消息给所有其他进程。

(2)当进程Pj收到Request(Ti,i)消息后,执行如下操作:●若进程Pj正处在临界区中,则推迟向进程Pi发出Reply响应;●若进程Pj当前并不要求访问临界资源,则立即返回一个有时间邮戳的Reply消息;●若进程Pj也要求访问临界资源,而在消息Request(Ti,i)中的邮戳时间早于(Tj,i),同样立即返回一个有时间邮戳的Reply消息;否则,Pj保留Pi发来的消息Request(Ti,i),并推迟发出Reply响应。

(3)当进程Pi收到所有其他进程发来的响应时,便可访问该资源。

(4)当进程释放该资源后,仅向所有推迟发来Reply消息的进程发送Reply 消息。

该算法能够获得较好的性能:能够实现诸进程对共享资源的互斥访问;能够保证不发生死锁,因为在进程--资源图中,不会出现环路;不会出现饥饿现象,因为对共享资源的访问是按照邮戳时间排序的,即按照FCFS原则服务的;每次对共享资源访问时,只要求发2(N-1)个消息。

下图说明了进程在访问共享资源时的状态转换:当然这个算法也有一定的问题:第一,每个要求访问共享资源的进程,必须知道所有进程的名字,因此,一旦有新进程进入系统,它就将通知系统中所有进程。

第二,如果系统中有一个进程失败,则必然会使发出Request消息的进程无法收到全部响应,因此,系统还应该具备这样的功能,即一旦某个进程失效,系统能将该进程的名字通知其他进程。

2、令牌传送法为实现进程互斥,在系统中可设置令牌(token),表示存取权力。

令牌本身是一种特殊格式的报文,通常只有一个字节的长度,它不断地在由进程组成的逻辑环(logical ring)中循环。

环中的每一个进程只有唯一的前驱者(prodecessor)和唯一的后记者(successor)。

当环路中的令牌循环到某个进程并被接收时,如果该进程希望进入临界区,它便保持该令牌,进入临界区。

一旦它推出临界区,再把令牌传送给后继进程。

如果接收到令牌的进程并不要求进入临界区,便直接将令牌传送给后继进程。

由于逻辑环中只有一个令牌,因此也就实现了进程的互斥。

使用令牌时,必须满足以下两点要求:(1)逻辑环应该具有及时发现环路中某进程失效或退出,以及通信链路故障的能力。

一旦发现上述情况,应立即撤消该进程,或重构逻辑环。

(2)必须保证逻辑环中,在任何时候都有一个令牌在循环,一旦发现令牌丢失,应立即选定一个进程产生新令牌。

利用令牌传送法实现互斥,所需要的消息数目是不定的。

因为,不管是否有进程要求进入其临界区,令牌总是在逻辑环中循环,当逻辑环中所有进程都要求进入临界区时,平均每个进程访问临界区只需要一个消息。

但如果在令牌循环一周的时间内,只有一个进程要求进入临界区,则等效地需要N个消息(N是逻辑环中进程数)。

即使无任何进程要进入临界区,仍需不断的传输令牌。

另一方面,在令牌传送法中,存在着自然的优先级关系,即上游站具有更高的优先级,它能够优先进入临界区。

就好象FCFS队列一样,环路中的进程可依次进入自己的临界区,因而不会出现饥饿现象。

进程同步是分布式系统尤其是松耦合分布式系统中一个非常重要的问题,对系统的工作效率和工作精度等性能指标有着至关重要的影响。

因此,必须在系统中采用某种机制来实现进程间的同步。

不同的系统对进程之间同步程度的要求是不相同的,某些分布式系统中,要求进程之间达到物理时钟上的同步,才能正确有效地协同工作。

相关主题