管程和条件变量87_第1页
管程和条件变量87_第2页
管程和条件变量87_第3页
管程和条件变量87_第4页
管程和条件变量87_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、 end;5管程的结构condition c1wait(c1)condition cn wait(cn)Urgent queue signal局部数据条件变量过程1过程k出口初始化代码入口管程等待调用的进程队列管程等待区域6管程的示例TYPE SSU = MONITOR var busy : boolean; nobusy : semaphore; define require, return; use wait, signal; procedure require; begin if busy then wait(nobusy); /*调用进程加入等待队列*/ busy := ture; e

3、nd; procedure return; begin busy := false; signal(nobusy); /*从等待队列中释放进程*/ end; begin /*管程变量初始化*/ busy := false; end;7管程的条件变量(1)条件变量:当调用管程过程的进程无法运行时,用于阻塞进程的一种信号量同步原语wait:当一个管程过程发现无法继续时,它在某些条件变量condition上执行wait,这个动作引起调用进程阻塞8管程的条件变量(2)另一个进程可以通过对其伙伴在等待的同一个条件变量condition上执行同步原语signal操作来唤醒等待进程。条件变量与P、V操作中信

4、号量的区别? 9管程的问题讨论 使用signal释放等待进程时,可能出现两个进程同时停留在管程内。解决方法:执行signal的进程等待,直到被释放进程退出管程或等待另一个条件被释放进程等待,直到执行signal的进程退出管程或等待另一个条件霍尔采用了第一种办法;汉森选择了两者的折衷,规定管程中的过程所执行的signal操作是过程体的最后一个操作 10管程与进程作比较(1)管程定义的是公用数据结构,而进程定义的是私有数据结构;管程把共享变量上的同步操作集中起来,而临界区却分散在每个进程中;管程是为管理共享资源而建立的,进程主要是为占有系统资源和实现系统并发性而引入的;11管程与进程作比较(2)管

5、程是被欲使用共享资源的进程所调用的,管程和调用它的进程不能并行工作,而进程之间能并行工作,并发性是其固有特性;管程是语言或操作系统的成分,不必创建或撤销,而进程有生命周期,由创建而产生至撤销便消亡。123.4.2管程实现:Hoare方法霍尔方法使用P和V操作原语来实现对管程中过程的互斥调用,及实现对共享资源互斥使用的管理。不要求signal操作是过程体的最后一个操作,且wait和signal操作可被设计成可以中断的过程。 13Hoare管程数据结构(1) 1. mutex对每个管程,使用用于管程中过程互斥调用的信号量mutex(初值为1)。进程调用管程中的任何过程时,应执行P(mutex);进

6、程退出管程时应执行V(mutex)开放管程,以便让其他调用者进入。为了使进程在等待资源期间,其他进程能进入管程,故在wait操作中也必须执行V(mutex),否则会妨碍其他进程进入管程,导致无法释放资源。14Hoare管程数据结构(2) 2. next和next-count对每个管程,引入信号量next(初值为0),凡发出signal操作的进程应该用P(next)挂起自己,直到被释放进程退出管程或产生其他等待条件。进程在退出管程的过程前,须检查是否有别的进程在信号量next上等待,若有,则用V(next)唤醒它。next-count(初值为0),用来记录在next上等待的进程个数。 15Hoa

7、re管程数据结构(3) 3. x-sem和 x-count引入信号量x-sem(初值为0),申请资源得不到满足时,执行P(x-sem)挂起。由于释放资源时,需要知道是否有别的进程在等待资源,用计数器x-count(初值为0)记录等待资源的进程数。执行signal操作时,应让等待资源的诸进程中的某个进程立即恢复运行,而不让其他进程抢先进入管程,这可以用V(x-sem)来实现。 16Hoare管程数据结构 每个管程定义如下数据结构 :TYPE interf = RECORD mutex:semaphore; /*进程调用管程过程前 使用的互斥信号量*/ next:semaphore; /*发出si

8、gnal的进程挂起 自己的信号量*/ next_count:integer;/*在next上等待的进 程数*/ END; 17Hoare的wait操作Procedure wait(var x_sem:semaphore,x_count:integer, IM:interf);begin x_count := x_count + 1; if IM.next_count 0 then V(IM.next); else V(IM.mutex); P(x_sem); X_count := x_count 1;end;18Hoare的signal操作procedure signal(var x_sem:

9、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;19Hoare的外部过程形式 任何一个调用管程中过程的外部过程应组织成下列形式,确保互斥地进入管程。P(IM.mutex); ;if IM.next_count 0 then V(IM.next); else V(IM.mutex);20霍尔方法实现五个哲学家

10、吃通心面问题(1)TYPE dining-philosophers = MONITORvar state : array0.4 of (thinking, hungry, eating); s : array0.4 of semaphore; s-count : array0.4 of integer; define pickup, putdown; use wait, signal;21霍尔方法实现五个哲学家吃通心面问题(2)procedure test(k : 0.4);beginif state(k-1) mod 5eating and statek=hungry and state(k

11、+1) mod 5eating then begin statek := eating; signal(sk, s-countk, IM); end;end; 22霍尔方法实现五个哲学家吃通心面问题(3)procedure pickup(i:0.4);begin statei := hungry; test(i); if stateieating then wait(si,s-counti,IM);end;23霍尔方法实现五个哲学家吃通心面问题(4)procedure putdown(i:0.4);begin statei := thinking; test(i-1) mod 5); test

12、(i+1) mod 5);end;begin for i := 0 to 4 do statei := thinking; end;24霍尔方法实现五个哲学家吃通心面问题(6)cobegin process philosopher-ibegin P(IM.mutex); call dining-philosopher.pickup(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 t

13、hen V(IM.next); else V(IM.mutex); end;coend; 25管程实现:汉森方法(1)汉森方法的管程中的过程所执行的signal操作一定是过程体的最后一个操作,一个进程当所调用的过程执行了signal操作后,便立即退出了管程。汉森方法使用四条原语:wait,signal,check,re1ease实现对管程的控制。26管程的实现:汉森方法(2) 每个管程使用的一个数据类型:TYPE interf = RECORD intsem : semaphore; /* 开放管程的信号量 */ count1 : integer; /* 等待调用的进程个数 */ count2

14、 : integer; /* 调用了管程中的过程且不END; 处于等待状态的进程个数 */27管程的实现:汉森方法(3)调用查看原语check: 如果管程是开放的,则执行这条原语后关闭管程,相应进程继续执行;如果管程是关闭的,则执行这条原语后相应进程被置成等待调用状态28管程的实现:汉森方法(4)procedure check(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;2

15、9管程的实现:汉森方法(5)开放原语release: 如果除了发出这条原语的进程外,不再有调用了管程中过程但又不处于等待状态的进程,那么就释放一个等待者或开放管程30管程的实现:汉森方法(6)procedure release(var IM interf); begin IM.count2 := IM.count2 - 1; 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;31管程的实现:汉森方法(

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

17、语后释放指定等待进程队列中的一个进程。如指定等待进程队列为空,本操作相当于空操作34管程的实现:汉森方法(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); end; end;35管程的实现:汉森方法(11) 用管程实现进程同步时,进程应按下列次序工作: 请求资源。 使用资源。 释放资源。36汉森方法实现读者写者问题(1) 有两组并发进程:读者与写者,共享一个文件,要求:1)允许多个读者同时执行读操作;2)

18、任一写者在完成写操作之前不允许其他读者和写者工作;3)写者欲工作,要等待已存在的读者完成读操作,新的读者与写者均被拒绝37汉森方法实现读者写者问题(2)type read-writer = MONITOR var rc, wc : integer; R, W : semaphore; define start-read, end-read, start-writer, end-writer; use wait, signal, check, release;38汉森方法实现读者写者问题(3)procedure start-read; begin check(IM); if wc0 then w

19、ait(R,IM); rc := rc + 1; signal(R, IM); release(IM); end;procedure end-read;begin check(IM); rc := rc - 1; if rc=0 then signal(W,IM); release(IM);end;39汉森方法实现读者写者问题(4)procedure start-write;begin check(IM); wc := wc + 1; if rc0 or wc1 then wait(W,IM); release(IM);end;procedure end-write;begin check(I

20、M); wc := wc - 1; if wc0 then signal(W,IM); else signal(R, IM); release(IM);end; 40汉森方法实现读者写者问题(5)初始化语句begin rc := 0; wc := 0; R := 0; W := 0; end;41汉森方法实现读者写者问题(6)cobegin process readerbegin call read-writer.start-read; read; call read-writer.end-read;end; process writerbegin call read-writer.start

21、-write; write; call rear-writer.end-write;end;coend;42汉森方法实现苹果橘子问题(1) 桌上有一只盘子,每次只能放入一只水果,爸爸专向盘中放苹果,妈妈专向盘中放橘子,一个儿子专吃盘中橘子,一个女儿专吃盘中苹果43汉森方法实现苹果橘子问题(2)TYPE FMSD = MONITOR var plate : (apple, orange); full : boolean; SP, SS, SD : semaphore; define put, get; use wait, signal, check, release; 44汉森方法实现苹果橘子问

22、题(3)procedure put(var fruit:(apple, orange);begin check(IM); if full then wait(SP,IM); full := true; plate := fruit; if fruit=orange then signal(SS,IM); else signal(SD,IM); release(IM);end;45汉森方法实现苹果橘子问题(4)procedure get(varfruit:(apple,orange),x:plate);begin check(IM); if not full or platefruit then

23、 begin if fruit = orange then wait(SS,IM); else wait(SD,IM); end; x := plate; full := false; signal(SP, IM); release(IM);end;46汉森方法实现苹果橘子问题(5)初始化语句begin full := false; SP := 0; SS := 0; SD := 0; end;47汉森方法实现苹果橘子问题(6)cobegin process fatherbegin 准备好苹果; call FMSD.put(apple);end; process motherbegin 准备好

24、桔子; call FMSD.put(orange);end;48汉森方法实现苹果橘子问题(7) process sonbegin call FMSD.get(orange,x); 吃取到的桔子; end; process daughterbegin call FMSD.get(apple,x); 吃取到的苹果;end;coend;49nWkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$

25、qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#pXlUiQfNcK8H5E2A+x*u$rZnWkThPeMaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNb

26、K8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v

27、%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgO

28、dLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A-x*u$qZnWkShPdMaJ7F4C1z)w&

29、s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H6E2B+x(u%rZoWlThQeMbJ8G4D1A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x*u$rZnWkThPe

30、MaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0zs#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$

31、qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNb

32、K8G5D2A-x*u$qZnVkShPdMaF3B0y(v%s#oXlUiQfNcK8H5D2A+x*u$rZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C1z)w&s!pYmUjRgOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%r#oWlThQeNbJ8G5D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%r

33、ZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK81A-w*t!qYnVjSgPdLaI6F3C0y)v&s#pXlUiRfNcK9H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#oXlUiQfNcK8H5E2A+x*u$rZnWkThPeMaJ7G4C1z-w&t!pYmVjRgOdL9I6E3B0y(v%s#oXlTiQfNbK8H5

34、D2A-x*u$qZnWkShPdMaJ7F4C1z)w&t!pYmUjRgOcL9I6E3B+y(v%r#oXlTiQeNbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E2B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRbK8G5D2A-x*t$qZnVkShPdMaI7F4C0z)w&s!pXmUjRfOcL9H6E3B+y(u%r#oWlTiQeNbJ8G5D1A-x*t$qYnVkSgPdMaI7F3C0z)v&s!pXmUiRfOcK9H6E2B+x(u%rZoWl

35、ThQeMbJ8G4D1A-w*t$qYnVjSgPdLaI7F3C0y)v&s#pXmUiRfNcK9H5E2B+x(u$rZoWkThQeMbJ7G4D1z-w*t!qYmVjSgOdLaI6F3B0y)v%s#pXlUiQfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+x*u$qZnWkShPeMaJ7F4Cv%s#pXlUiRfNcK8H5E2A+x(u$rZnWkThPeMbJ7G4C1z-w&t!qYmVjRgOdL9I6F3B0y(v%s#oXlUiQfNbK8H5D2A+

36、x*u$qZnWkShPeMaJ7G4C1z)w&t!pYmVjRgOcL9I6E3B0y(v%r#oXlTiQfNbK8G5D2A-x*u$qZnVkShPdMaJ7F4C0z)w&s!pYmUjRfOcL9H6E3B+y(v%r#oWlTiQeNbK8G5D1A-x*t$qZnVkSgPdMaI7F4C0z)v&s!pXmUjRfOcK9H6E2B+y(u%rZoWlThQeNbJ8G4D1A-w*t$qYnVkSgPdLaI7F3C0z)v&s#pXmUiRfOcK9H5E2B+x(u%rZoWkThQeMbJ8G4D1z-w*t!qYnVjSgOdLaI6F3C0y)v%s#pXlUiRfNcK8H5E2A+x(u$rZoWkThPeMbJ7G4D1z-w&t!qYmVjSgOdL9I6F3B0y)v%s#o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论