分布式互斥"/>
进程协作之分布式互斥
进程协作
进程协作分类:
- 分布式互斥:如何保证临界资源的互斥利用
- 选举:如何保证从多个并发进程中选举出一个进程扮演协调者
- 事件排序;组通信中的排序组播:如何就一组进程间发生的事件的顺序达成一致
- 分布式死锁:要求一组进程对共享资源进行公平的源自访问,不出现死锁,不出现饿死
- 同步器:在异步网络中模拟时钟的嘀嗒(tick,round)
有序组播
FIFO排序:如果一个进程发multicast(g, m),然后发multicast(g, m’),那么,每个传递m’的正确的进程将在m’前传递m
因果排序:如果 multicast(g, m) multicast(g, m’),其中 是发生在先关系且只由g的成员之间发送的消息引起,那么,任何传递m’的正确的进程将在m’前传递m因果排序隐含FIFO排序
全排序:如果一个正确的进程在传递m’前传递消息m,那么,任何其它传递m’的正确的进程将在m’前传递m
全排序未必是FIFO或因果排序
混合排序:FIFO-全排序,因果-全排序
有序组播并不隐含可靠性。例如,在全排序下,如果正确的进程p传递消息m然后传递m’,那么正确的进程q可以传递m而不传递m’或按序排在m后的任何消息。
分布式互斥
目标:实现对进程共享资源的排他访问,保证访问共享资源的一致性
具体手段:基于消息传递
- 在分布式系统中,共享变量或者单个本地操作系统内核提供的设施都不能被用来解决这个问题
基本概念
进程的历史:由这个进程发生的事件组成
系统的全局历史:系统中的单个进程历史的并集
系统执行的割集(cut):进程历史前缀的并集形成系统全局历史的子集
割集的边界:是指由进程处理的最后一个事件的集合
一致的割集:如果对这个割集包含的每个事件,它也包含了所有在该事件之前发生的所有事件
一致的全局状态:指相对于一致割集的状态
**走向(run)**是对全局历史中所有事件的全排序,同时,它与每个本地历史排序是一致的
一致的走向(consistent run)或线性化走向(linearization) 是与全局历史上的发生在先关系一致的所有事件的一个排序
- 不是所有的走向都经历一致的全局状态,但所有线性化走向仅经历一致的全局状态
如果有一个经过状态S和S’的线性化走向,那么状态S’是从状态S可达的
设S0是系统的原始状态
安全性(safety):设α是一个系统全局状态不希望有的性质,该性质是一个系统全局状态的谓词。关于α的安全性是一个断言,即,对所有可从S0到达的所有状态S,α的值为False
- Bad things never happen
活性(liveness):设β是一个系统全局状态希望有的性质。关于β的活性是指对任一从状态S0开始的线性化走向L,对可从S0到达的状态SL,β的值为True
- Good things eventually happen
对互斥性的基本要求:
ME1:(安全性)在临界区(CS)一次最多有一个进程可以执行
ME2:(活性)进入和离开临界区的请求最终成功执行
- 条件ME2隐含着既无死锁也无饥饿的问。
- 没有饥饿问题是一个公平性条件
ME3:(→顺序)如果一个进入CS的请求发生在线,那么进入CS时仍按此顺序
ME3指定第一个进程在第二个进程之前被准予进入临界区
互斥算法的评价标准
- 消耗的带宽
- 客户的延迟时间:每个进入或者退出操作中由进程导致的客户延迟
- 对系统吞吐量的影响,用同步延迟衡量
- 吞吐量是每秒能处理的对临界区操作的请求个数
- 吞吐量 = 1/(同步延迟+进程在临界区内工作的最大时间值)
- 同步延迟:一个进程离开临界区和下一个进程进入临界区之间的时间
中央服务器互斥算法
假设系统是异步的,进程不出现故障,并且采用异步消息传递,消息传递是可靠的,这样任何传递的消息最终都被完整的发送恰好一次
算法流程
- 为进入一个临界区,一个进程向服务器发送一个请求消息并等待服务器的权标(token)。如果在请求时没有其它进程拥有这个权标,服务器就立刻应答来授予权标。如果此时另一进程持有这个权标,服务器就不应答而是把请求放入队列
- 进程在退出临界区时,发一个消息给服务器,交回这个权标。如果等待进入临界区的进程队列不空,那么,服务器就会选择时间最早的进程,把它从进程队列中删除并给这个进程一个应答。这样,这个进程就持有了权标
算法分析:
-
若系统不发生故障,满足ME1,ME2。不满足ME3
反例:进程A先发进入临界区的请求ra,然后给进程B发一个消息m。B在收到m后,发进入临界区的请求rb。如果要满足顺序条件,应该先处理A的请求,再处理B的请求。由于消息传递有延迟,B的请求可能会先于A的请求到达服务器,所以服务器会先处理B的请求。
-
性能:
-
服务器会造成失败的节点
- 需要后备节点
基于环的互斥算法
- 把进程安排成环,环的拓扑结构可以与计算机之间物理互联无关。每个进程 P i P_i Pi只需要与环中的下一个进程 P ( i + 1 ) m o d N P_{(i+1)}modN P(i+1)modN
- 权标在进程环沿着环顺时针或者逆时针传递,获得权标,就能访问共享资源、
- 如果一个进程在收到权标时不需要进入临界区,那么它立即把权标传给它的邻居。需要权标的进程将一直等待,直到接收到权标,它在访问共享资源时,会保留权标。为了退出临界区,进程把权标发送到它的邻居
算法分析:
-
满足安全性、活性
-
不满足ME3
性能:
- 该算法连续地消耗网络带宽
- 请求进入临界区的进程会延迟0个(这时,它正好收到权标)到N个(这时,它刚传递了权标)消息
- 退出临界区只需要一个消息
- 在一个进程离开和下一个进程进入临界区之间的同步延迟可以是1到N个消息传输
故障的检测和处理
- 故障:进程崩溃,消息(token)丢失
Lamport Algorithm: Using multicast and logical clocks
-
假设:消息使用FIFO排序,并且是可靠的,但是异步方式传递
-
时间戳格式为:(C(event),process id)
-
对于事件a,b, a → b a\rightarrow b a→b 需要满足以下两个条件之一:
- C(a)<C(b)
- C(a)=C(b) 但是pid(a)<pid(b)。
-
每一个进程 P i P_{i} Pi维护有个本地的请求队列Q
-
Timestamped requests are sorted in total order → \rightarrow → in Q.
-
There are three messages: Request, Reply, Release message
具体步骤:
- P i P_i Pi向所有其他进程包括他自己发送 R e q u e s t ( C ( c r e q i ) , i ) Request (C(creq_i),i) Request(C(creqi),i)这一个请求信息
- 当进程 P j P_j Pj收到一个来自 P i P_i Pi请求消息 R e q u e s t ( C ( c r e q i ) , i ) Request (C(creq_i),i) Request(C(creqi),i)时,把他放入队列Q,并且***马上***发送一个消息: R e p l y ( C ( r e q j ) , j ) Reply(C(req_j),j) Reply(C(reqj),j)给 P i P_i Pi。
- P i P_i Pi进入并使用他自己的CS(临界资源),需要以下两个条件成立:
- P i P_i Pi'自己的请求在Q的头部(第一个)
- P i P_i Pi从其他所有的进程收到 P k P_k Pk消息 r k r_k rk(either Request, Reply or Release)消息的时间戳为 C ( r k ) C(r_k) C(rk),并且 ( C ( r e q i ) , i ) < ( C ( r k ) , k ) (C(req_i),i)<(C(r_k),k) (C(reqi),i)<(C(rk),k)
- P i P_i Pirelease the source by removing its request from Q, and send a release message R e l e a s e C ( c r e q i ) , i ) Release C(creq_i),i) ReleaseC(creqi),i)to all processes.
- When P j P_j Pj receives a release message from P i P_i Pi ,it removes P i P_i Pi’s request from Q.
算法分析1:
-
满足ME1,ME2,ME3
-
具体证明省略,证明ME3用到反证法
Ricart-Agrawala algorithm: an optimized version of Lamport’s solution
和Lamport’s不同点:
-
每一个进程想要进入CS时,只需要向系统中的其他进程发送一个时间戳请求,不包含他自己
-
进程受到请求时,只有以下两种情况发生时,才会发送回复消息:
- 当前进程队进入自己的CS不感兴趣
- 或者,当前进程正在尝试进入他自己的CS,但是他自己的时间戳比发送者的要大。
如果进程已经在他自己的CS中了,他会把所有的请求缓存下来,直到它离开CS。
-
进程当收到其他n-1个进程的回复信息时,才能够进入自己的CS
-
从CS退出后,进程必须在发出请求或执行其他操作之前向每个挂起的请求发送应答
算法的伪代码:
On initialization:state := RELEASED;
To enter the section: state := WANTED;multicast request <T, pi> to all processes where T:= request’s timestamp; wait until (number of replies received= (N – 1));state := HELD;
On receipt of a request <Ti, pi> at pj (i ≠ j):if (state = HELD or (state = WANTED and (T, pj) < (Ti, pi)))then queue request from pi without replying;else reply immediately to pi;end if
To exit the critical section:state := RELEASED;reply to any queued requests;
算法分析:
- 满足ME1、ME2、ME3.
性能:
- 在n个进程的环境中,一个进程进入临界区,需要2(n-1)次消息传递。或者,如果硬件支持组播,请求只需要一个消息,总数是n个消息
- 同步延迟仅是一个消息传输时间
进一步改进:
- N points of failure: some processes fail
- Improvement: the receiver always sends a reply, either granting or denying permission.
- Improvement: ask only permission from a majority of processes / the quorum of processes
具体的改进措施:
- To request for the resource, Pi sends a request to all n process
- A process Pj will send a reply if it is not using the resource and it has not sent a reply to another process Pk (unless Pi has sent a release message back to Pj to announce that it is done)
- Pi can use the resource if it gets a reply from a majority ceiling((n+1)/2) of processes
- When Pi is done, it sends release to all processes it receives a reply
Maekawa投票算法
算法的实现
需要注意、选举集是如何计算得来的
算法分析:
更多推荐
进程协作之分布式互斥
发布评论