收藏 分享(赏)

第3章并发控制.pptx

上传人:Facebook 文档编号:9746880 上传时间:2019-08-31 格式:PPTX 页数:109 大小:325.83KB
下载 相关 举报
第3章并发控制.pptx_第1页
第1页 / 共109页
第3章并发控制.pptx_第2页
第2页 / 共109页
第3章并发控制.pptx_第3页
第3页 / 共109页
第3章并发控制.pptx_第4页
第4页 / 共109页
第3章并发控制.pptx_第5页
第5页 / 共109页
点击查看更多>>
资源描述

1、1,计算机操作系统,第3章 并发控制互斥与同步,2,本章知识点:,3.1 并发原理 3.2 互斥软件解决方法 3.3 互斥硬件解决方法 3.4 信号量 3.5 管程 3.6 消息传递 3.7 读者/写者问题 3.8 系统举例(略),3,3.1 并发原理,操作系统设计的核心是进程管理: 在单处理机系统中,并发执行方式: 微观串行,宏观并行。 在多处理机系统中,并发执行方式宏观并行,也有微观并行。 分布式环境,多进程管理并发的存在,要求操作系统 必须能跟踪大量活跃进程, 必须为每一活跃进程分配资源, 必须保护每一进程的数据和物理资源不被其他进程侵犯,并且进程执行的结果与其他并发进程执行时的相对速度

2、无关(P73 例 echo)。,4,回顾:程序结果的不可再现性,程序A 程序BN=N+1; print(N);N=0; 设某时刻N=n;,1、进程的中断可在任何地方 2、访问了共享变量,有效控制对共享资源的访问,原因:,方法:,5,3.1 并发原理,并发系统中的各个进程,由于资源共享、进程合作,而产生进程之间的相互制约;3.1.1 进程间的相互作用 3.1.2 进程间的相互竞争 3.1.3 进程间的相互合作 3.1.4 互斥,6,3.1.1 进程间的相互作用,进程之间常常相互作用,存在某种彼此依赖或相互制约的关系。例如并发进程在竞争使用同一资源时将产生冲突。可将进程间的相互作用划分为: 进程互

3、不觉察: 由OS分配资源 进程间接觉察: 共享方式合作 进程直接觉察: 直接通信,协同工作,7,3.1.2 进程间的相互竞争,并发进程在竞争使用同一资源时将产生冲突。 进程间的竞争面临3个控制问题: 互斥 死锁 饥饿竞争的控制不可避免地涉及到操作系统,因为是操作系统分配资源, 另外,进程自身也必须能以某种方式表达互斥的要求,例如在使用某一资源之前先将其加锁 。,8,互斥,临界资源Critical Resource: 每次仅允许一个进程使用的资源。如打印机,共享变量 临界区Critical Section : 每个进程中访问临界资源的那段代码。互斥Mutual Exclusion:不允许两个以上

4、的共享该资源的并发进程,同时进入临界区,称为互斥。进程进入临界区之前,必须提出申请,经允许后方可进入,进入后加锁,使其他进程无法进入,退出临界区时解锁。,9,互斥(间接作用),10,a := a -1 print (a),a := a +1 print (a),互斥(间接作用),11,互斥的两个后果,死锁(deadlock) 是指多个进程互不相让,都得不到足够资源。饥饿(starvation) 是指某些进程一直得不到资源,或得到资源的概率很小。,12,3.1.3 进程间的相互合作,1.通过共享合作这些进程并不是通过名字察觉到对方,而是通过共享访问间接察觉。进程间通过共享方式进行合作。除互斥、死

5、锁和饥饿外, 保证数据的一致性也是一个潜在的控制问题。,13,3.1.3 进程间的相互合作,2.通过通信合作进程通信是指进程之间,可直接以较高的效率,传递较多数据的信息交换方式。这种方式中采用的是通信机构,在进程通信时往往以消息形式传递信息。因为在消息传递中不存在共享,所以这种形式的合作不需要互斥,但是还存在死锁和饥饿问题。,14,3.1.4 互斥问题的解决原则,互斥原则 P79 任何两个进程不能同时处于临界区 通用性原则 不应对CPU的速度和数目进行任何假设 有效性原则 临界区外的进程不应阻塞其他进程 合理性原则 不得使进程在临界区外无限制的等待 当进程无法进入临界区时,应放弃CPU资源,进

6、程通信,1 空闲让进;2 忙则等待; 3 让权等待;4 有限等待;,15,3.2 互斥软件解决方法,软件方法对并发进程不提供任何支持, 不需要硬件、操作系统、程序设计语言的支持。软件方法易引起较高的进程负荷,和较多的错误,但有利于同学们深刻理解并发的复杂性。 其基本思路: 在进入区,检查和设置一些标志,如果已有进程在临界区,则在进入区通过循环检查进行等待;在退出区,修改标志,允许其他进程进入。 主要问题: 设置什么标志 如何检查标志,Busy-waiting忙等待,浪费了处理器时间。,16,类PASCAL描述语句与C对比,begin end repeat . Forever repeat .

7、until P while P do begin endfunction name1(.):type procedure name2(.)var i,j:integer; var x:array09 of integer; i:=1; ,=,and,or,not, for (;)或while 1 do . do.while !P while P do.type name1(.) void name2(.)int i,j; int x10; i=1; !=,&,|,!,17,3.2.1 Dekker算法,描述了并发进程发展过程中,遇到的大部分共同问题。“爱斯基摩人的小屋协议”: 门和小屋很小,每

8、次只能容纳一个人进入,小屋内有一个标志黑板写着编号。 进程申请进入临界区,必须首先进入小屋并检查黑板标志是否是它的编号: 是,离开小屋,进入临界区,执行完毕,退出临界区, 并返回小屋,修改黑板标志为其他进程 否,反复进入小屋,检查黑板标志,直到标志是它的编号,18,3.2.1 Dekker算法 1,1.第1种途径 这种方法保证了互斥。问题: Pi一定要等待Pj进入过后,才可以再次进入!(临界资源利用率不高,如果Pi死机了Pj就再也不能进入临界区),var turn: 01; turn为共享的全局变量,表示黑板的编号 PROCESS 0 PROCESS 1 while turn0 while t

9、urn1 do nothing do nothing; critical section; critical section; turn: =1; turn: =0; ,19,3.2.1 Dekker算法 2,2.第2种途径,var flag: array01of boolean; 它被初始化为false PROCESS 0 PROCESS 1 while flag1 while flag0 do nothing do nothing; flag0: =true; flag1: =true; critical section; critical section; flag0: =false;

10、flag1: =false; ,flagi 表示Pi在CS中,先设置,再检测?,20,3.2.1 Dekker算法 3,3.第3种途径,PROCESS 0 PROCESS 1 flag0: =true; flag1: =true; while flag1 while flag0 do nothing do nothing; critical section; critical section; flag0: =false; flag1: =false; ,flagi 表示Pi想进入 CS,设置和检测中间发生进程切换,则产生问题!,21,3.2.1 Dekker算法 4,4.第4种途径,PROC

11、ESS 0 PROCESS 1 flag0: =true; flag1: =true; while flag1 do while flag0 do begin beginflag0: =false; flag1: =false;delay for a short time; delay for a short time;flag0: =true; flag1: =true; end; end; critical section; critical section; flag0: =false; flag1: =false; ,22,3.2.1 Dekker算法 4,4.第4种途径,PROCES

12、S 0 flag0: = true; while flag1 do begin flag0: = false; delay for a short time; flag0: = true; end; critical section; flag0: = false; ,P0想要进入CS,考虑途径3情形,可能切换到P1,先撤销flag0标志,礼让P1先进入CS,若P1进入CS,P0 while循环,P1退出CS后,P0退出 while循环,进入CS,23,3.2.1 Dekker算法 4,4.第4种途径 问题:P0:置flag0=true; P1:置flag1=true; P0:执行while

13、flag1; P1:执行while flag0; P0:置flag0=false; P1:置flag1=false; P0: 延迟; P1:延迟; P0:置flag0=true; P1:置flag1=true; 检查其它进程,然后重置,再检查,再重置, 互斥礼让:重置序列可以无线延伸,任何一个进程都不能进入自己的临界区。(不是死锁,只要进程相对速度稍有变化就会打破循环),24,3.2.1 Dekker算法 5,5.一个正确的解决方法设计一个“指示”小屋,小屋内的黑板标明“turn”, 当P0想进入其临界段时,置自己的flag为“true”,然后去查看P1的flag,如果是“false”,则P0

14、就立即进入自己的临界段,如果是“true ”,则P0去查看turn ,如果turn=0,那么它知道自己应该坚持并不时去查看P1的小屋, P1将觉察到(因为 turn=0 )它应该放弃并在自己的黑板上写上“false”,以允许P0继续执行。P0执行完临界段后,它将flag置为“false”以释放临界段,并且将turn置为1,将进入权交给P1 。,25,3.2.1 Dekker算法 5,var flag: array01 of boolean;turn:01; /准许进入临界区标志变量 beginflag0:=false; flag1:= false;turn:=1; /设P1可加入临界区parb

15、eginp0; p1; /并发程序parend end,主要思想:设置两个变量: 1. turn:指出应该哪一个进入临界区turn=0 表示P0可以进入 turn=1 表示P1可以进入 2.Flag:指出当前哪一个在临界区 Flag= false 表示P0当前在临界区 Flag= true 表示P1当前在临界区,26,3.2.1 Dekker算法 5,Procedure P0; beginrepeatflag0:=true; /P0希望进入临界区.while flag1 do /查P1进程标志if turn=1 then / 表明P1在临界区beginflag0:=false;while tu

16、rn=1 do nothing ; /当turn=0,表明P0可以进入临界区flag0:= true; /设标志为真,end; / P0进入临界区critical section;turn:=1; /指定P1进程可进临界区flag0:= false;forever end,Procedure P1; beginrepeatflag1:=true;while flag0 doif turn=0 thenbeginflag 1:=false;while turn=0do nothing;flag1:=trueend;critical section;turn:=0;flag1:= false;fo

17、rever end,27,3.2.1 Dekker算法 5,Procedure P0; beginrepeatflag0:=true; /P0希望进入临界区.while flag1 do /查P1进程标志if turn=1 then / 表明P1在临界区beginflag0:=false;while turn=1 do nothing ; /当turn=0,表明P0可以进入临界区flag0:= true; /设标志为真,end; / P0进入临界区critical section;turn:=1; /指定P1进程可进临界区flag0:= false;forever end,turn,28,3.

18、2.2 Peterson算法,Dekker算法可以解决互斥问题, 但其复杂的程序难于理解,其正确性难于证明。Peterson给出了一个简单的方法。 turn解决同时的冲突, Flag指示进程是否在临界区. 对两参量同时控制,交替进入临界区执行.,29,3.2.2 Peterson算法,procedure P0; begin repeat flag0:=true; /P0希望进临界区 turn:=1; while flag1 and turn=1 do nothing; ; flag0:=false; forever end;,procedure P1; begin repeat flag1:=

19、true; turn:=0; while flag0 and turn=0 do nothing; ; flag1:=false; forever end;,30,互斥软件解法的缺点,1. 忙等待2. 实现过于复杂3. 需要高的编程技巧,31,3.3 互斥硬件解决方法,提供了可以解决临界区问题的特殊的硬件指令。硬件方法通过特殊的机器指令实现互斥,可以降低开销。1、中断屏蔽方法(禁止中断)不允许进程切换 2、硬件指令方法用一条指令完成设置和检测,保证读与写不被打断。,32,3.3.1 禁止中断,在单处理机中,禁止进程被中断即可保证互斥,通过操作系统内核定义的禁止和允许中断的原语,就可获得这种能力

20、。进程执行临界段时不能被中断。屏蔽中断; 进程P的临界段; 开中断;优点:简单,有效,在单处理机中可保证互斥。 缺点:代价较高,使执行效率显著降低在多处理机系统中,禁止中断不能保证互斥,33,3.3.2 使用机器指令,1.特殊的机器指令 在多处理机系统中,多个处理机共享一个共同的主存,这里并没有主/从关系,也没有实现互斥的中断机制。特殊的硬件指令: Test and Set指令: 允许在一个存储周期内去测试和修改一个字的内容, Exchange指令: 允许在一个存储周期内交换两个字的内容,34,Test_and_Set 指令,function testset ( var i:integer )

21、 : boolean ; begin if i = 0 then begin i := 1; testset := true; end else testset :=false; end. 原语,执行过程不能被中断,35,用硬件方法解决互斥,program mutualexclusion; const n=2;(*number of processes* ); var bolt:integer; procedure P(i:integer); beginrepeatrepeat nothing /忙等待,浪费CPU时间until testset(bolt) ;/当bolt为0时,进入临界区,;

22、 bolt:= 0;forever end;,begin(* main program*) bolt:=0; parbegin P(1); P(2); . P(n); parend end,36,3.3.2 使用机器指令,2.机器指令方法的特性 优点: 可用于含有任意数量进程的单处理机或共享主存的多处理机; 比较简单,易于验证; 可支持多个临界段,每个临界段用各自的变量加以定义。 缺点: 采用busy-waiting技术,进程等待进入临界段时耗费处理机时间; 可能产生饥饿; 可能产生死锁。,37,互斥,互斥机制的基本要求: * 描述能力 * 可以实现 * 效率高 * 使用方便都有缺点,有更好的

23、互斥机制吗?操作系统、程序设计语言能提供支持?,38,3.4 信号量 semaphore,3.4.0 信号量 信号量机制、操作、物理意义 3.4.1 用信号量解决互斥问题 3.4.2 用信号量解决生产者/消费者问题 不考虑缓冲区长度,缓冲区有限长 3.4.3 信号量的实现,39,1965年,由荷兰学者Dijkstra提出(1972年获得ACM图灵奖,2002年8月去世)。 所以P、V分别是荷兰语的test(proberen)和increment(verhogen))“信号量”:一种解决进程的同步与互斥的工具 是一个具有非负初值的整型变量,并且有一个队列与它关联。type semaphore =

24、recordcount: integer;queue: List of PCB;end 不是普通的变量,只能进行Wait、Signal操作,3.4.0 信号量,40,信号量上的同步原语,Wait(S): s.count:=s.count-1; /将值减1, if s.count0then being 该进程状态置为等待状态;将该进程的PCB插入等待队列s.queue的末尾;end;Signal(S): s.count:=s.count +1; /将值减1, if s.count =0then being 从等待队列s.queue摘下一个等待进程;将该进程置入就绪队列;end;,41,二元信号量

25、,仅允许取值为0与1, 与一般信号量(允许取值为非负整数)有同等的表达能力,value:(0,1); waitB(s):if s.value=1 then s.value = 0; else begin 将本进程放入 s.queue; 阻塞本进程; end;,signalB(s): if s.queue is empty then s.Value: = 1; else begin 从 s.queue摘下一个等待进程; 将该进程放入就绪队列 ; end;,42,信号量的物理意义,S0时,表示该类资源的可用资源数S=0时,表示已无此类资源可供分配, 请求资源的进程,将被阻塞在相应的信号量S的等待队

26、列中。 S的绝对值 = 该信号量上等待的进程数。,43,Wait操作的物理意义,S0时,每执行一次Wait操作,意味着请求分配一个单位的该类资源,即 S:=S-1;S0时,执行Wait操作,此时已无资源可分配,故进程被阻塞;S0时,执行Wait操作,说明前面已经有进程在等待着分配资源了。 S的绝对值 = 该信号量上等待的进程数。,44,Signal操作的物理意义,每执行一次Signal操作,意味着进程释放一个单位的该类可用资源,即S:=S+1。S=0,根据前面的分析,此时S等待队列中有因等待该资源而被阻塞的进程,故把队列中的一个进程唤醒,转入就绪队列 。,45,3.4.1 用信号量解决互斥问题

27、,Mutex 互斥信号量(mutual exclusion),,Program mutualexclusion; Const n=4;/(进程数) Var Mutex :semaphore (:=1);Procedure P(I:integer); BeginRepeatWait(Mutex );Signal(Mutex );Forever End,Begin (* main program*)ParbeginP(1); p(2);.p(n);parend; End,Mutex.Count取值含义: 1, 0, -1, -2? min ? Max ?,46,用信号量实现互斥,p1,s 1 0-

28、1-2-101,p2,p3,semaphore,Wait 操作信号量非负,P1进入临界区,Wait 操作信号量为负,P2阻塞,Wait 操作信号量为负,P3 阻塞,Signal 操作后信号量非正,从等待队列中唤醒一个进程,Signal 操作后信号量非正,从等待队列中唤醒一个进程,Signal 操作后信号量为正,表示已无进程在临界区,47,思考题,管理临界区时,信号量的初值一般应定义为( )。A. 1 B. 0 C. 1 D. 任意值在下面的叙述中,正确的是( )。 A.临界资源是非共享资源 B.临界资源是任意共享资源 C.临界资源是互斥共享资源 D.临界资源是同时共享资源对进程间互斥地使用临界

29、资源,进程可以( )A.互斥地进入临界区 B.互斥地进入各自的临界区C.互斥地进入同一临界区 D.互斥地进入各自的同类资源的临界区设两个进程共用一个临界资源的互斥信号量mutex, 当mutex1时表示( )。当mutex-1时表示( )。A.一个进程进入了临界区,另一个进程等待B.没有一个进程进入临界区C.两个进程都进入了临界区D.两个进程都在等待,48,判断题,1一个临界资源可以对应多个临界区。 2互斥地使用临界资源是通过互斥地进入临界区实现的。 3同步信号量的初值一般为1。 4进程A、B共享变量x,需要互斥执行;进程B、C共享变量y,B、C也需要互斥执行,因此,进程A、C必须互斥执行。

30、5. 单道程序系统中程序的执行也需要同步和互斥。,49,3.4.2 用信号量解决生产者/消费者问题,问题描述 进程之间的要求 先考虑 缓冲区无限 长 二元信号量 一般信号量 再考虑有限缓冲时,50,1)问题描述,计算机系统中的常见问题模型:,要求: 生产者向其中投放数据, 消费者从中取出数据消费。生产者不能往“满”的缓冲区中放产品消费者不能从“空”的缓冲区中取产品,51,2)进程之间的要求,缓冲区不能并行操作(必须互斥),某时刻只允许一个实体(producer or consumer)访问 方法:使用互斥信号量控制producer and consumer协调(同步)地读/写buffer,即不

31、能向满buffer写数据;不能在空buffer中取数据 方法:使用另一个信号量来控制,52,3)先假设缓冲区无限 长,consumer : repeat while inout do nothing;/无产品 w := bout; out := out + 1; consume item w; forever;,producer: repeat produce item v; bin := v; in := in + 1; forever;,没有同步的情况:,take,append,53,一、使用二元信号量,program producerconsumer; var n: integer ;

32、/n = in out 可取的产品数 s: (*binary*)semaphore (:=1); /互斥访问缓冲区delay: (*binary*)semaphore(:=0); /缓冲区空时,消费者等待begin (* main program*) n:= 0;Parbeginproducer; consumerparend; end,改变初始值可以吗?,54,基本处理语句,procedure producer; beginrepeatproduce;append;n:=n+1;forever end;,procedure consumer; beginrepeattake;n:=n-1;c

33、onsume;forever end;,55,互斥访问缓冲区、共享变量n,procedure producer; beginrepeatproduce;waitB(s);append;n:=n+1;signalB(s); forever end;,procedure consumer; beginrepeatwaitB(s); take;n:=n-1;signalB(s);consume;forever end;,56,解决当缓冲区空时,消费者等待,procedure producer; beginrepeatproduce;waitB(s);append;n:=n+1;signalB(s);

34、 forever end;,procedure consumer; beginwaitB(delay); /仅执行一次repeatwaitB(s); take;n:=n-1;signalB(s);consume;if n=0 then waitB(delay) forever end;,57,append后生产者通知消费者,procedure producer; beginrepeatproduce;waitB(s);append;n:=n+1;if n=1then signalB(delay);signalB(s); forever end;,procedure consumer; begi

35、nwaitB(delay);/仅执行一次repeatwaitB(s); take;n:=n-1;signalB(s);consume;if n=0 then waitB(delay) forever end;,问题:n是共享变量,对n的访问应该考虑并发问题,58,表3.2可能的情况,1,2,3,生产者:,消费者:,3,2,1,阻塞,N=0 应该阻塞,N=1 应该但没有被阻塞!,consume; if N=0 waitB(delay),N=1唤醒,问题:n是共享变量,对n的访问应该考虑并发问题,59,解决方法一:将 signalB(s);移动后面,procedure producer; begi

36、nrepeatproduce;waitB(s);append;n:=n+1;if n=1then signalB(delay);signalB(s); forever end;,procedure consumer; beginwaitB(delay);repeatwaitB(s); take;n:=n-1;/signalB(s);consume;if n=0 then waitB(delay) signalB(s); forever end;,是否可行?,注意细节、逻辑问题,60,解决方法二:使用辅助变量m,procedure producer; beginrepeatproduce;wai

37、tB(s);append;n:=n+1;if n=1then signalB(delay);signalB(s); forever end;,procedure consumer; var m: interger; beginwaitB(delay);repeatwaitB(s); take;n:=n-1; m:=n;signalB(s);consume;if m=0 then waitB(delay) forever end;,61,二、用一般信号量,procedure producer; beginrepeatproduce;append;forever end;,procedure co

38、nsumer; beginrepeattake;consume;forever end;,var n: semaphore(:=0); s: semaphore (:=1);,62,用一般信号量解决生产者/消费者问题,procedure producer; beginrepeatproduce;wait (s);append;signal(s); forever end;,procedure consumer; beginrepeatwait(s);take;signal(s);consume;forever end;,var n: semaphore(:=0); s: vsemaphore

39、(:=1);,63,用一般信号量解决生产者/消费者问题,procedure producer; beginrepeatproduce;wait (s);append;signal(s); signal(n); forever end;,procedure consumer; beginrepeatwait(n); wait(s);take;signal(s);consume;forever end;,var n: semaphore(:=0); s: vsemaphore (:=1);,64,4)缓冲区有限长,解题过程 分析有什么同步问题(应该设置什么信号量); 缓冲区互斥访问 in:一组生产

40、者共用的指向空缓冲区头的指针; out:一组消费者共用的指向满缓冲区头的指针。 生产者不能往“满”的缓冲区中放产品full-满缓冲区资源信号量。 消费者不能从“空”的缓冲区中取产品empty-空缓冲区资源信号量;给信号量赋初值(常用的互斥和同步信号量值的大小);full:= 0; empty:= n; mutex:= 1;,in,out,65,4)缓冲区有限长,consumer: beginrepeat m:=buffer(out);out:=(out+1) mod n; consume m; /产品 forever end,producer: begin repeat Produce m;

41、/产品 buffer(in):=m;in:=(in+1) mod n; forever end,Var mutex,empty, full: Semaphore;buffer:array0n-1 of message;mutex:=1; empty:=n; full:=0;in,out:0n-1;,66,4)缓冲区有限长,consumer: beginrepeat wait (mutex); m:=buffer(out);out:=(out+1) mod n; signal (mutex); consume m; forever end,producer: begin repeat Produ

42、ce m; wait(mutex); buffer(in):=m;in:=(in+1) mod n; signal(mutex);forever end,Var mutex,empty, full: Semaphore;buffer:array0n-1 of message;mutex:=1; empty:=n; full:=0;in,out:0n-1;,67,4)缓冲区有限长,consumer: beginrepeat wait (full); wait (mutex); m:=buffer(out);out:=(out+1) mod n; signal (mutex); signal(em

43、pty); consume m; forever end,producer: begin repeat Produce m; wait(empty); wait(mutex); buffer(in):=m;in:=(in+1) mod n; signal(mutex);signal(full); forever end,Var mutex,empty, full: Semaphore;buffer:array0n-1 of message;mutex:=1; empty:=n; full:=0;in,out:0n-1;,68,使用信号量解决进程同步问题,问题描述 分析问题中的同步关系/要求 设

44、置所需信号量及初值 放置恰当的Wait/Signal操作作业:对生产者/消费者问题回答步骤1,2,3用伪代码完成步骤4,69,对信号量的操作可以分为三种情况:,1) 把信号量视为一个加锁标志位,实现对一个共享变量的互斥访问。 WAIT(mutex); / mutex的初始值为1访问该共享数据SIGNAL(mutex);非临界区2) 把信号量视为是某种类型的共享资源的剩余个数,实现对一类共享资源的访问。 WAIT(resource); / resource的初始值为该资源的个数N使用该资源;SIGNAL(resource);非临界区3) 把信号量作为进程间的同步工具WAIT(S1); 临界区C1

45、;SIGNAL(S2); 临界区C2;,70,例子1:某超市门口为顾客准备了100辆手推车,每位顾客在进去买东西时取一辆推车,在买完东西结完帐以后再把推车还回去。试用WAIT、SIGNAL操作正确实现顾客进程的同步互斥关系。,71,例子1:某超市门口为顾客准备了100辆手推车,每位顾客在进去买东西时取一辆推车,在买完东西结完帐以后再把推车还回去。试用WAIT、SIGNAL操作正确实现顾客进程的同步互斥关系。,分析:把手推车视为某种资源,每个顾客为一个要互斥访问该资源的进程。,72,例子1:某超市门口为顾客准备了100辆手推车,每位顾客在进去买东西时取一辆推车,在买完东西结完帐以后再把推车还回去

46、。试用WAIT、SIGNAL操作正确实现顾客进程的同步互斥关系。,分析:把手推车视为某种资源,每个顾客为一个要互斥访问该资源的进程。,S_CartNum:semaphore; / 空闲的手推车数量,初值为100 Procedure consumer / 顾客进程 BeginWAIT(S_CartNum);买东西;结帐;SIGNAL(S_CartNum); End,73,例子2:两个进程PA、PB通过两个FIFO(先进先出)缓冲区队列Q1、Q2连接。PA从Q2取消息,处理后往Q1发消息,PB从Q1取消息,处理后往Q2发消息。 假设每个缓冲区长度等于传送消息长度. Q1队列长度为n,Q2队列长度为m. 开始时Q1中装满了消息。,74,例子2:两个进程PA、PB通过两个FIFO(先进先出)缓冲区队列Q1、Q2连接。PA从Q2取消息,处理后往Q1发消息,PB从Q1取消息,处理后往Q2发消息。 假设每个缓冲区长度等于传送消息长度. Q1队列长度为n,Q2队列长度为m. 开始时Q1中装满了消息。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报