第6章互斥问题和选举算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程,包括它自己; • 任意进程Pj收到请求资源的消息时,将该消息按时标顺序放 在自己的局部请求队列中并发回一个带时戳的应答; • 进程Pi获得资源访问权的条件是 – 它已收到从其它所有进程发来的应答 – 它的请求r在它的请求队列的顶部 – 它从所有其它进程处收到的消息的时标均比r的时戳大; • 为了释放资源,进程Pi发送一个带时戳的消息给所有的进程, 包括它自己; • 任意进程Pj收到来自Pi的资源释放消息时,要从自己的局部 请求队列中清除所有来自Pi的请求。
Maekawa算法
• 将n个进程分成多个子集,子集长度k与进程个数的关系 为n=k(k-1)+1 • 进程Pi在请求访问资源时,向自己的请求子集Ri发出请求 消息 • Ri中的进程Pj在收到请求后,执行如下操作: 如果Pj记录的资源状态为可用,向Pi返回一个应答 如果Pj记录的资源状态为占有,则将这个请求放入自己的 请求队列(时标取请求到达的时间)。 • Pi只有在得到Ri中所有进程的应答后才能访问资源 • Pi在访问结束后要向Ri中的所有进程发送释放消息。 • Ri中的进程在收到释放消息后,如果自己的请求队列为空, 则将资源状态改为可用,否则从队列中选择一个请求发 送应答。
Ricart和Agrawala的第二个算法
• 处理-请求-消息::= [ receive (request_ signal, k, j) →[request(j):=max(request(j),k) ; token_present∧¬token_held → 释放资源 ] ]
存在问题
• 当请求进程没有持有令牌时,以上算法需要 n个消息(n -1个用于广播请求,1个用于传送令牌)。 • 当请求进程持有令牌时,以上算法需要 0个消息。 存在问题: 请求资源可能在token_present:=T之后而在token _held:=T 之前被处理-请求-消息所中断。这种情况下,被中断的进 程将不得不释放刚刚收到的令牌。 解决问题的方法: 让这两个语句合并为一个原子语句,也就是说,这两个语 句作为一个语句来对待。 把 token_held:=T放在token_present:=T之前。
• 互斥算法的分类 1. 基于令牌的算法:通过令牌拥有权来控制 对共享资源的访问。 2. 非基于令牌的算法:通过进程之间的消息 交换来协商对共享资源的访问。
互斥算法的适应性
• 静态互斥算法:算法的行为独立于系统的 状态 • 动态互斥算法:算法的行为依赖于系统的 状态
互斥算法应满足的条件
• 无死锁:当资源可用时进程不应该永远等 待 • 无饥饿现象:每个对资源的访问请求最终 都应能得到满足 • 公平性:进程对资源访问权的获得应是相 对公平的。
基于令牌环的简单算法
• 适合高负荷的环境,低负荷环境造成令牌 的低效移动,浪费系统资源。 • 令牌在移动过程中可能会丢失。
基于令牌环的容错算法 (双令牌互斥算法)
• 动态单一控制点算法(dynamic single contrl point algorithm)有可能丢失控制点 (令牌)。 • 容错算法使用两个令牌(A和B),其中一个 令牌负责检测另一个令牌可能的丢失。其 中的一个令牌用来控制访问共享资源。 • 两个令牌按照相反方向沿着环访问进程。 • 在该算法中,如果某一个进程被同一个令 牌连续两次访问,则令牌的丢失被检测到。
Ricart和Agrawala算法的缺陷
• 由于不应答被认为是资源被占用,所以如 果有某个节点故障,会导致该算法的异常 终止。 • 各进程对资源的使用情况缺乏了解。
Maekawa算法
• 基本思想 • 将进程分成多个请求子集,要求这些集合 两两相交。 • 进程Pi只要得到所属集合中所有进程的应答 后可访问共享资源。
Ricart和Agrawala的第二个算法
Pi中的函数定义: 其他::=所有其他不请求进入临界区的动作 消费::=进入临界区后消费资源 请求资源::=[token_present=T→[send(request_signal,clock,i) to all; receive(access_signal,token); token_present:=T; token_held:=T ] ] 释放资源::=[token(i):=clock; token_held:=F; min j in the order [i+1,…,n,1,2,…,i-2,i-1] ∩(request(j)>token(j)) →[token_present:=F; send(access_signal,token) to Pj ] ]
Lamport时钟பைடு நூலகம்习
• 假设系统中只存在消息发送和接收事件, 如图所示,请给出事件a-g的逻辑时钟。
A B d 5 C f5 逻辑时钟0 g 9 e 7 a 3 b 4 c7
• a,b,c,d,e,f,g的时间分别为3,4,7,5,7,5,9 • 不同进程产生的消息可能具有相同数值的 Lamport时间戳。
Ricart-Agrawala令牌互斥算法
Ricart和Agrawala的第二个算法
• 算法描述 P(i)::=*[请求资源 □消费 □释放资源 □处理-请求-消息 □其他 ]
Ricart和Agrawala的第二个算法
• 需要的变量 Clock:0,1,……,(初始化为0) token_present:Boolean(除了一个进程,对其他进 程均为F) token_held:Boolean(令牌为当前进程拥有,初始为 F) token:array(1..n) of clock(最后用完时间) request:array(1..n) of clock(最后申请时间) 每个进程有一个局部clock,token_present和 token_held
分布式系统中的互斥
本章主要内容 1. 分布式系统互斥目标 2. 分布式系统互斥基本类型 3. 分布式系统互斥算法类型 4. 分布式系统互斥算法的实现
临界区的调度原则
• 临界资源:一次只允许一个进程访问的共享资源。 • 临界区:每个进程中访问临界资源的一段程序代 码。 • 进程进入临界区的调度原则: ①如果有若干进程要求进入空闲的临界区,一次仅 允许一个进程进入。 ②任何时候,处于临界区内的进程不可多于一个。 如已有进程进入自己的临界区,则其它所有试图 进入临界区的进程必须等待。 ③进入临界区的进程要在有限时间内退出,以便其 它进程能及时进入自己的临界区。
Ricart和Agrawala互斥算法的特点
• 能够实现诸进程对共享资源的互斥访问。 • 能够保证不发生死锁,因为在进程--资源图 中,不会出现环路。 • 不会出现饥饿现象,因为对共享资源的访 问是按照邮戳时间排序的,即按照FCFS原 则服务的。 • 每次对共享资源访问时,只要求发2(N-1)个 消息 。
Maekawa算法的实现
Maekawa算法缺陷
• 容易导致死锁:假设P1,P6,P7同时申请临界 区
ACK P1 REQ P6 ACK P2 P7 REQ P3 ACK P4
REQ
• 作业 13个进程共享一个资源,用Maekawa算法来 支持互斥,请划分进程请求子集
基于令牌的互斥算法
• • • • 在基于令牌的互斥算法中,互斥是通过在进程 之间传递一个特殊的消息来实现的。这个消息 即是令牌。 令牌代表了一个控制点,它在所有的进程间传 递。 一个进程当且仅当拥有令牌时就可以进入临界 区。 当令牌被传递到某一个进程时,如果这个进程 不需要访问临界区,则把令牌传递给下一个进 程,否则在访问完临界区才将令牌传递到下一 个进程。
• 在分布式系统中,经常出现多个进程请求 访问同一个临界资源的问题,为了协调访 问,保证访问的正确性(无死锁,无饥饿 现象),需要给出一种有效的互斥算法。 • 互斥是分布式系统设计的关键问题。 • 为了保证数据一致性、逻辑一致性及时序 一致性,分布式互斥算法必须具有公平、 健壮和易于实现的特点。
互斥算法的控制机制
双令牌算法示意图
P1
P6
P2
A令牌
B令牌
P5
P3
P4
双令牌互斥算法
算法基本思想
(2)当进程Pi接收到令牌A时 If Mi==NA Then {令牌B丢失:令牌A在没有改变NA的情况下 绕令牌环网转了一周,也同时表示在令牌B 这段时间内没有访问过Pi}重构令牌B; Else{令牌B无丢失}Mi=NA;
互斥算法的目标
• 互斥的主要目标是保证在一个时刻只能有 一个进程访问临界区。 • 在非基于令牌的算法中,所有进程相互通 信来决定哪个进程可以执行临界区。 • 在基于令牌的算法中引入了令牌的概念。 令牌代表了一个控制点,它在所有的进程 间传递。一个进程拥有令牌时就可以进入 临界区。
分布式系统中的互斥算法
基于令牌环的简单算法
• 如果进程Pi,(i =1…n)连接成一个环,该令 牌绕环传递。 • 在简单令牌环算法中,进程有序构成一个 逻辑环,令牌有序绕环前进,使得每个进 程都能拥有令牌。
基于令牌环的简单算法
图2 基于令牌环的算法
Pi(1.. n): :=[receive token from P((i-1)mod n); 如果需要消费资源; send token to P((i+1)mod n) ] 分布式-互斥: :=| | P(i:1. .n)
(3)当进程释放该资源后,向所有被暂存的请求发送一 个确认消息并删除暂存队列。
Ricart和Agrawala互斥算法
• 要求分布式系统的所有事件是全序的,进程按请求的顺序 获得对公区的访问。 • 进程若未收到所有的应答,就表明有优先级更高的请求存 在。 • 交换的消息数量降至2(n-1)个
t11 t12
衡量互斥算法性能的参数
• 每个请求的消息数 • 同步延迟:一个进程离开临界区到下一个 进程进入该临界区的时间间隔,对共享资 源的有效访问间隔。 • 反应时间:进程发出访问请求到执行完访 问操作的时间间隔,主要依赖于系统的负 载和调度的合理性。
Lamport互斥算法
• 为了请求资源,进程Pi发送带时标的消息r给系统中的所有进
基于令牌的互斥算法
• R i c a r t和A g r a w a l a提出了进一步改进:进 入临界区的进程保留令牌。 • 初始时,令牌被赋予任意一个进程Pi。 • 进程 Pj通过向其他进程广播一个带时戳的消息来 请求令牌。 • 如果当前拥有令牌的进程 Pi不再需要使用临界区, 它就按照i+1, i+2, …, n, 1, 2, …, i-1的顺序搜 索其他进程 • 找出第一个进程Pj,满足条件:Pj最后一次请求令 牌的时戳大于在令牌中记录的 Pj最后一次拥有令 牌的时戳。 • 当满足以上条件时,Pi把令牌传递给Pj。
算法基本思想
• 双令牌互斥算法使用两个令牌(A,B),每个令牌各自带有 一个变量(NA,NB)。 NA:保存连续访问Mi值为1的进程的个数 NB:保存连续访问Mi值为-1的进程的个数 Mi:指定某个进程是否为A令牌或B令牌访问,如果为正值, 则被A令牌访问,如果为负值,则被B令牌访问。访问次 数由具体的数值决定。 • 假设环中有n个进程(P1到Pn),每个进程带有一个变量 Mi(1≦i≦n)。 • 当两个令牌相遇时,更新NA,NB。 基本步骤: (1)算法开始时:NA:=1,NB:=-1; Mi=0(1≦i≦n)
一个例子
改进的Lamport互斥算法
Ricart和Agrawala互斥算法
(1)当进程Pi需要占用公区时,向所有进程发送请求,对 于K-互斥问题,请求消息包括公区号、进程号和时间戳。 接收进程Pj收到请求消息后,执行如下操作: 如果Pj没有占用该公区也没有申请使用它,则向请求进程 发送一个确认消息。 如果Pj正在使用该公区,则不发送确认消息,暂存请求消 息。 如果Pj正在申请使用该公区,则比较请求消息时间戳与本 身请求时间戳的大小,时间戳小者优先。若Pi的时间戳小, 则Pj发送一个确认消息,若Pj的时间戳小,则Pi不发送确认 消息。 (2)当进程Pi收到所有其他进程发来的响应时,便可访 问该资源。