管程幻灯片资料

上传人:youn****329 文档编号:136805729 上传时间:2020-07-02 格式:PPT 页数:49 大小:401.50KB
返回 下载 相关 举报
管程幻灯片资料_第1页
第1页 / 共49页
管程幻灯片资料_第2页
第2页 / 共49页
管程幻灯片资料_第3页
第3页 / 共49页
管程幻灯片资料_第4页
第4页 / 共49页
管程幻灯片资料_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《管程幻灯片资料》由会员分享,可在线阅读,更多相关《管程幻灯片资料(49页珍藏版)》请在金锄头文库上搜索。

1、3.4 管程,3.4.1 管程和条件变量 3.4.2 霍尔方法实现管程 3.4.3 汉森方法实现管程,3.4.1什么是管程?(1) 为什么要引入管程,把分散在各进程中的临界区集中起来进行管理 ; 防止进程有意或无意的违法同步操作, 便于用高级语言来书写程序,也便于程序正确性验证。,什么是管程?(2),管程是由局部于自己的若干公共变量及其说明和所有访问这些公共变量的过程所组成的软件模块,管程有以下属性,共享性: 安全性: 互斥性:,管程的结构,管程的示例,TYPE SSU = MONITOR var busy : boolean; nobusy : semaphore; define requi

2、re, return; use wait, signal; procedure require; begin if busy then wait(nobusy); /*调用进程加入等待队列*/ busy := ture; end; procedure return; begin busy := false; signal(nobusy); /*从等待队列中释放进程*/ end; begin /*管程变量初始化*/ busy := false; end;,管程的条件变量(1),条件变量:当调用管程过程的进程无法运行时,用于阻塞进程的一种信号量 同步原语wait:当一个管程过程发现无法继续时,它在

3、某些条件变量condition上执行wait,这个动作引起调用进程阻塞,管程的条件变量(2),另一个进程可以通过对其伙伴在等待的同一个条件变量condition上执行同步原语signal操作来唤醒等待进程。 条件变量与P、V操作中信号量的区别?,管程的问题讨论,使用signal释放等待进程时,可能出现两个进程同时停留在管程内。解决方法: 执行signal的进程等待,直到被释放进程退出管程或等待另一个条件 被释放进程等待,直到执行signal的进程退出管程或等待另一个条件 霍尔采用了第一种办法;汉森选择了两者的折衷,规定管程中的过程所执行的signal操作是过程体的最后一个操作,管程与进程作比较

4、(1),管程定义的是公用数据结构,而进程定义的是私有数据结构; 管程把共享变量上的同步操作集中起来,而临界区却分散在每个进程中; 管程是为管理共享资源而建立的,进程主要是为占有系统资源和实现系统并发性而引入的;,管程与进程作比较(2),管程是被欲使用共享资源的进程所调用的,管程和调用它的进程不能并行工作,而进程之间能并行工作,并发性是其固有特性; 管程是语言或操作系统的成分,不必创建或撤销,而进程有生命周期,由创建而产生至撤销便消亡。,3.4.2管程实现:Hoare方法,霍尔方法使用P和V操作原语来实现对管程中过程的互斥调用,及实现对共享资源互斥使用的管理。 不要求signal操作是过程体的最

5、后一个操作,且wait和signal操作可被设计成可以中断的过程。,Hoare管程数据结构(1),1. mutex 对每个管程,使用用于管程中过程互斥调用的信号量mutex(初值为1)。 进程调用管程中的任何过程时,应执行P(mutex);进程退出管程时应执行V(mutex)开放管程,以便让其他调用者进入。 为了使进程在等待资源期间,其他进程能进入管程,故在wait操作中也必须执行V(mutex),否则会妨碍其他进程进入管程,导致无法释放资源。,Hoare管程数据结构(2),2. next和next-count 对每个管程,引入信号量next(初值为0),凡发出signal操作的进程应该用P(

6、next)挂起自己,直到被释放进程退出管程或产生其他等待条件。 进程在退出管程的过程前,须检查是否有别的进程在信号量next上等待,若有,则用V(next)唤醒它。next-count(初值为0),用来记录在next上等待的进程个数。,Hoare管程数据结构(3),3. x-sem和 x-count 引入信号量x-sem(初值为0),申请资源得不到满足时,执行P(x-sem)挂起。由于释放资源时,需要知道是否有别的进程在等待资源,用计数器x-count(初值为0)记录等待资源的进程数。 执行signal操作时,应让等待资源的诸进程中的某个进程立即恢复运行,而不让其他进程抢先进入管程,这可以用V

7、(x-sem)来实现。,Hoare管程数据结构,每个管程定义如下数据结构 : TYPE interf = RECORD mutex:semaphore; /*进程调用管程过程前 使用的互斥信号量*/ next:semaphore; /*发出signal的进程挂起 自己的信号量*/ next_count:integer;/*在next上等待的进 程数*/ END;,Hoare的wait操作,Procedure wait(var x_sem:semaphore,x_count:integer, IM:interf); begin x_count := x_count + 1; if IM.next

8、_count 0 then V(IM.next); else V(IM.mutex); P(x_sem); X_count := x_count 1; end;,Hoare的signal操作,procedure signal(var x_sem:semaphore,x_count:integer, IM:interf); begin if x_count 0 then begin IM.next_count := IM.next_count + 1; V(x_sem); P(IM.next); IM.next_count := IM.next_count - 1; end; end;,Hoar

9、e的外部过程形式,任何一个调用管程中过程的外部过程应组织成下列形式,确保互斥地进入管程。 P(IM.mutex); ; if IM.next_count 0 then V(IM.next); else V(IM.mutex);,霍尔方法实现五个哲学家吃通心面问题(1),TYPE dining-philosophers = MONITOR var state : array0.4 of (thinking, hungry, eating); s : array0.4 of semaphore; s-count : array0.4 of integer; define pickup, putdo

10、wn; use wait, signal;,霍尔方法实现五个哲学家吃通心面问题(2),procedure test(k : 0.4); begin if state(k-1) mod 5eating and statek=hungry and state(k+1) mod 5eating then begin statek := eating; signal(sk, s-countk, IM); end; end;,霍尔方法实现五个哲学家吃通心面问题(3),procedure pickup(i:0.4); begin statei := hungry; test(i); if stateiea

11、ting then wait(si,s-counti,IM); end;,霍尔方法实现五个哲学家吃通心面问题(4),procedure putdown(i:0.4); begin statei := thinking; test(i-1) mod 5); test(i+1) mod 5); end; begin for i := 0 to 4 do statei := thinking; end;,霍尔方法实现五个哲学家吃通心面问题(6),cobegin process philosopher-i begin P(IM.mutex); call dining-philosopher.picku

12、p(i); if IM.next-count 0 then V(IM.next); else V(IM.mutex); 吃通心面; P(IM.mutex); call dining-philosopher.putdown(i); if IM.next-count 0 then V(IM.next); else V(IM.mutex); end; coend;,管程实现:汉森方法(1),汉森方法的管程中的过程所执行的signal操作一定是过程体的最后一个操作,一个进程当所调用的过程执行了signal操作后,便立即退出了管程。 汉森方法使用四条原语:wait,signal,check,re1eas

13、e实现对管程的控制。,管程的实现:汉森方法(2),每个管程使用的一个数据类型: TYPE interf = RECORD intsem : semaphore; /* 开放管程的信号量 */ count1 : integer; /* 等待调用的进程个数 */ count2 : integer; /* 调用了管程中的过程且不 END; 处于等待状态的进程个数 */,管程的实现:汉森方法(3),调用查看原语check: 如果管程是开放的,则执行这条原语后关闭管程,相应进程继续执行;如果管程是关闭的,则执行这条原语后相应进程被置成等待调用状态,管程的实现:汉森方法(4),procedure chec

14、k(var IM interf); begin if IM.count2 = 0 then IM.count2 := IM.count2 + 1; else begin IM.count1 := IM.count1 + 1; W(IM.intsem); end; end;,管程的实现:汉森方法(5),开放原语release: 如果除了发出这条原语的进程外,不再有调用了管程中过程但又不处于等待状态的进程,那么就释放一个等待者或开放管程,管程的实现:汉森方法(6),procedure release(var IM interf); begin IM.count2 := IM.count2 - 1;

15、 if IM.count2 = 0 and IM.count1 0 then begin IM.count1 := IM.count1 - 1; IM.count2 := IM.count2 + 1; R(IM.intsem); end; end;,管程的实现:汉森方法(7),等待原语wait: 执行这条原语后相应进程被置成等待状态,同时开放管程,允许其它进程调用管程中的过程,管程的实现:汉森方法(8),procedure wait(var s:semaphore; var IM interf); begin s := s + 1; IM.count2 := IM.count2 1; if I

16、M.count1 0 then begin IM.count1 := IM.count1 1; IM.count2 := IM.count2 + 1; R(IM.intsem); end; W(s); end;,管程的实现:汉森方法(9),释放原语signal: 执行这条原语后释放指定等待进程队列中的一个进程。如指定等待进程队列为空,本操作相当于空操作,管程的实现:汉森方法(10),procedure signal(var s:semaphore; var IM interf); begin if s 0 then begin s := s 1; IM.count2 := IM.count2 + 1; R(s); en

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号