自考操作系统原理 第七章 进程同步与进程通信._第1页
自考操作系统原理 第七章 进程同步与进程通信._第2页
自考操作系统原理 第七章 进程同步与进程通信._第3页
自考操作系统原理 第七章 进程同步与进程通信._第4页
自考操作系统原理 第七章 进程同步与进程通信._第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

1、进程同步与进程通信进程同步与进程通信进程的顺序性进程的顺序性n进程的进程的顺序性顺序性是指进程在顺序处理器上的执行是是指进程在顺序处理器上的执行是严格按序的,即按照程序规定的操作顺序,只有严格按序的,即按照程序规定的操作顺序,只有在前一个操作结束后才能开始后继操作。在前一个操作结束后才能开始后继操作。n当一个进程当一个进程独占独占处理器时,它具有两个特性:处理器时,它具有两个特性:q封闭性封闭性q可再现性可再现性进程的并发性进程的并发性n每一个进程具有顺序性,但是在多道程序设计系每一个进程具有顺序性,但是在多道程序设计系统中,多个进程要统中,多个进程要竞争竞争,轮流占用轮流占用处理器。处理器。

2、n有两个进程有两个进程A和和B,它们各自顺序执行时的操作序,它们各自顺序执行时的操作序列如下:列如下:q进程进程A : a1,a2,a3,amq进程进程B : b1,b2,b3,bmn在多道程序设计系统中,处理器可能执行的操作在多道程序设计系统中,处理器可能执行的操作序列序列qa1, b1 ,a2, b2 ,a3, b3 qa1, a2, b1 ,a3 ,b2 ,b3 进程的并发性进程的并发性n在一个进程的工作没有完成之前,另一个进程在一个进程的工作没有完成之前,另一个进程就可以开始工作,这些进程就称为就可以开始工作,这些进程就称为可同时执行可同时执行的的。或者称它们。或者称它们具有并发性具有

3、并发性,并且把可同时执,并且把可同时执行的进程称为行的进程称为并发进程并发进程。进程的并发性进程的并发性n如果一个进程的执行不影响另一个进程的执行结如果一个进程的执行不影响另一个进程的执行结果,也不依赖一个进程的进展情况,即它们是各果,也不依赖一个进程的进展情况,即它们是各自独立的,则称这些进程相互之间是自独立的,则称这些进程相互之间是无关无关的。的。n如果一个进程的执行要依赖其他进程的进展状况,如果一个进程的执行要依赖其他进程的进展状况,或者可能会影响其他进程的执行结果,则说这些或者可能会影响其他进程的执行结果,则说这些进程是进程是有交互有交互的。的。与时间有关的错误与时间有关的错误n对于有

4、交互的并发进程来说,并发会破坏对于有交互的并发进程来说,并发会破坏“封封闭性闭性”和和“可再现性可再现性”例例1 :车辆自动计数系统:车辆自动计数系统 process Observer begin L1:observe a lorry; count: = count + 1; goto L1;end; process Reporter begin print count; count := 0;end;系统功能:系统功能: 统计每小时的卡车流量统计每小时的卡车流量观察者进程观察者进程(Observer):观察到一辆卡车,计数器:观察到一辆卡车,计数器+1报告者进程报告者进程(Reporter)

5、:每隔:每隔1小时,将计数值输出,计数器清零小时,将计数值输出,计数器清零例例2:航班售票系统:航班售票系统 process Pi (i=1,2,) begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;Ak代表某天某次航班的代表某天某次航班的剩余票数;剩余票数;Pi代表售票处理进程;代表售票处理进程;Ri是每个售票进程的私是每个售票进程的私有变量;有变量;各个售票处进程的工作各个售票处进程的工作如左边代码所示:如左边代码所示: process P2 begi

6、n Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end; process P3 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;Ri = 5假设某时刻Ak为5,A、B两个人同时在2号3号窗口买票 process P2 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张

7、票;输出一张票; end; else 输出输出”票已售完票已售完“ end; process P3 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;Ri = 5假设某时刻Ak为5,A、B两个人同时在2号3号窗口买票 process P3 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end; process P2 beg

8、in Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;Ri = 5假设某时刻Ak为5,A、B两个人同时在2号3号窗口买票 process P2 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end; process P3 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一

9、张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;Ri = 5假设某时刻Ak为5,A、B两个人同时在2号3号窗口买票 process P3 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end; process P2 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;Ri = 4假设某时刻Ak为

10、5,A、B两个人同时在2号3号窗口买票 process P2 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end; process P3 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;Ak = 4假设某时刻Ak为5,A、B两个人同时在2号3号窗口买票 process P2 begin Ri:=Ak; if Ri=1

11、then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end; process P3 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;Ri = 4假设某时刻Ak为5,A、B两个人同时在2号3号窗口买票 process P3 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else

12、 输出输出”票已售完票已售完“ end; process P2 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;Ak = 4假设某时刻Ak为5,A、B两个人同时在2号3号窗口买票 process P3 begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end; process P2 begin Ri:=Ak; if Ri=1

13、 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;假设某时刻Ak为1,两个窗口同时卖票,可能出现什么情况?与时间有关的错误与时间有关的错误n由于进程交替修改了由于进程交替修改了共享变量共享变量造成结果可能不造成结果可能不正确。正确。n造成不正确的因素与进程占据处理器的时间、造成不正确的因素与进程占据处理器的时间、执行速度以及外界的影响(卡车),这些因素执行速度以及外界的影响(卡车),这些因素都与时间有关,所以称为与时间有关的错误。都与时间有关,所以称为与时间有关的错误。临界区临界区n有交互的并发进

14、程执行时出现与时间有关的错有交互的并发进程执行时出现与时间有关的错误,误,其根本原因是对共享资源(变量)的使用其根本原因是对共享资源(变量)的使用不受限不受限,为了使并发进程能正确地执行,必须,为了使并发进程能正确地执行,必须对对共享变量的使用加以限制共享变量的使用加以限制。 process Observer begin L1:observe a lorry; count: = count + 1; goto L1;end;临界区临界区 process Reporter begin print count; count := 0;end;把并发进程中与共享变量有关的程序段称为把并发进程中与共享

15、变量有关的程序段称为临界区临界区。涉及相同共享变量的临界区称为涉及相同共享变量的临界区称为相关临界区相关临界区。临界区临界区 process Pi(i=1,2) begin Ri:=Ak; if Ri=1 then begin Ri:= Ri -1; Ak = Ri 输出一张票;输出一张票; end; else 输出输出”票已售完票已售完“ end;如果能保证一个进程在临界区执行时,不让另一个进程进入相关的临界区执行,即各进程对共享变量的访问是互斥的,就不会造成与时间有关的错误。临界区临界区(1)当无进程在临界区时,若有进程要进入,则当无进程在临界区时,若有进程要进入,则允许一个进程进入临界区

16、允许一个进程进入临界区(2)当有进程在临界区执行时,其他试图进入临当有进程在临界区执行时,其他试图进入临界区的进程必须等待界区的进程必须等待(3)当有一个进程离开临界区,若有等待进入临当有一个进程离开临界区,若有等待进入临界区的进程,则允许一个进程进入它的临界界区的进程,则允许一个进程进入它的临界区区信号量机制(信号量机制(Semaphores)n1965年,荷兰的年,荷兰的 E.W.Dijkstra (狄克斯特拉狄克斯特拉)提出了信号量同步机制。提出了信号量同步机制。n用于进程同步用于进程同步n广泛应用于存在临界资源和临界区控制的场合广泛应用于存在临界资源和临界区控制的场合信号量的概念信号量

17、的概念n信号量信号量S是一个整数是一个整数S0 可供并发进程使用的资源实体数0 绝对值表示等待使用资源的进程数PV操作操作n对信号量的操作只能由对信号量的操作只能由P、V操作来进行,即:操作来进行,即: 信号量数值的改变只能由信号量数值的改变只能由P、V操作完成操作完成nPV操作由操作由P操作操作和和V操作操作组成,也称组成,也称P操作原语操作原语和和V操操作原语作原语。P操作操作nP(S) : 将信号量将信号量S减减1,若结果小于,若结果小于0,则把调用,则把调用P(S)的进程设置成等待信号量的进程设置成等待信号量S的状态的状态 Procedure P (Var S : Semaphore)

18、; begin S := S-1; if S0 then W(s) end; P W(s)表示把调用表示把调用P(S)的进程设置成等待信号量的进程设置成等待信号量S的状态的状态nV(S) : 将信号量将信号量S加加1,若不大于,若不大于0(小于等于小于等于0),则释放一个等待信号量则释放一个等待信号量S的进程。的进程。 Procedure V (Var S : Semaphore); begin S := S+1; if S=1 then begin Ri:= Ri -1; Ak = Ri V(S); 输出一张票;输出一张票; end; else begin V(S); 输出输出”票已售完票已

19、售完“ end; coend:end;读者读者/写者问题写者问题n计算机中,把可供多个进程使用的文件称为计算机中,把可供多个进程使用的文件称为共共享文件享文件。n想读文件的进程称为想读文件的进程称为读进程读进程,写文件的进程称,写文件的进程称为为写进程写进程。不允许多个进程同时使用共享文件不允许多个进程同时使用共享文件begin S : semaphore; S := 1; cobegin process Readeri(i=1,2,3) begin P(S); read file F; V(S); end; process Writerj(j=1,2,3) begin P(S); write

20、 file F; V(S); end; coend:end;P226 12n有有4个并发执行的进程个并发执行的进程A,B,C,D,它们在执它们在执行时都要读共享文件行时都要读共享文件F。限定:。限定:不允许不允许进程进程A和进程和进程B同时读文件同时读文件F,不允许不允许进程进程C和进程和进程D同时读文件同时读文件F。写出用。写出用PV操作管理时四个进程操作管理时四个进程的程序。的程序。begin S1,S2 : semaphore; S1 := 1; S2 :=1; cobegin process A begin P(S1); read file F; V(S1); end; process

21、 B begin P(S1); read file F; V(S1); end; coend:end;process Dbegin P(S2); read file F; V(S2);end; process C begin P(S2); read file F; V(S2); end;某系统允许某系统允许最多最多10个个进程同时读文件进程同时读文件F,当同时,当同时读文件读文件F的进程不满的进程不满10个时,欲读该文件的其他个时,欲读该文件的其他进程可立即读,当已有进程可立即读,当已有10个进程在读文件个进程在读文件F时其时其他欲读文件他欲读文件F的进程必须等待,直至有进程读完的进程必须等待

22、,直至有进程读完后退出方可去读后退出方可去读, 写出进程并发执行时的程序。写出进程并发执行时的程序。begin S :semaphore; S := 10; cobegin process Readeri(i=1,2,3) begin P(S); read file F; V(s); end; coend:end;允许多个进程同时使用共享文件允许多个进程同时使用共享文件要求:要求: (1) 多个进程可以同时读文件多个进程可以同时读文件F (2) 任何一个进程在对文件任何一个进程在对文件F进行写时,不允许其他进程读或写进行写时,不允许其他进程读或写 (3) 有进程在读文件有进程在读文件F时,不允

23、许任何进程去写时,不允许任何进程去写PV操作的实现思路:操作的实现思路:process Writeri(i=1,2,3)begin P(S); write file F; V(S);end; process Readeri(i=1,2,3.)begin if 是第一个读进程是第一个读进程 then P(S); read file F; if 是最后一个完成的读进程是最后一个完成的读进程 then V(S);end; begin S : semaphore; S = 1; rc : integer; rc = 0; cobegin: process Readeri(i=1,2,3) begin

24、rc := rc + 1; if rc=1 then P(S); read file F; rc := rc-1; if rc=0 then V(S) end; coend:end; process writerj(j=1,2) begin P(S); write file F; V(S);end;begin S,mutex : semaphore; S := 1; mutex :=1; rc : integer; rc := 0; cobegin: process Readeri(i=1,2,3) begin P(mutex); rc := rc + 1; if rc=1 then P(S)

25、; V(mutex); read file F; P(mutex); rc := rc-1; if rc=0 then V(S) V(mutex); end; coend:End;process writerj(j=1,2,3)begin P(S); write file F; V(S);end;进程的同步进程的同步记录记录进程进程B B进程进程A A缓冲区缓冲区存存取取加工加工假设缓冲区容量为假设缓冲区容量为1一个生产者进程,将数据存在缓冲区中;一个消费一个生产者进程,将数据存在缓冲区中;一个消费者进程,从缓冲区中取数据,要求两者同步(即缓者进程,从缓冲区中取数据,要求两者同步(即缓冲区空才

26、可以存,缓冲区满才可以取)冲区空才可以存,缓冲区满才可以取)用用PV操作实现进程的同步操作实现进程的同步begin SP,SG : semaphore; SP := 1; SG :=0; Buffer: integer; cobegin: process producer begin L1: produce a product P(SP); buffer : = product; V(SG); goto L1; end; coend:End;process consumerbegin L2: P(SG); take a product; V(SP); Consume; goto L2;end;

27、n桌上只有一个盘子,一个盘子一次只能放一个桌上只有一个盘子,一个盘子一次只能放一个苹果,爸爸向盘子里放苹果,儿子从盘子里拿苹果,爸爸向盘子里放苹果,儿子从盘子里拿苹果,用苹果,用PV操作实现同步。操作实现同步。begin S1,S2 : semaphore; S1 := 1; S2 :=0; cobegin: process 爸爸爸爸 begin L1: P(S1); 放苹果放苹果 V(S2); goto L1; end; process 儿子儿子 begin L2: P(S2); 拿苹果拿苹果 V(S1); goto L2; end; coend:end;n用用PV操作实现售票员和司机的同步

28、操作实现售票员和司机的同步,假设初始状假设初始状态为车在始发站,要求态为车在始发站,要求售票员进程先开始执行售票员进程先开始执行process 售票员售票员开车门开车门关车门关车门售票售票process 司机司机启动车辆启动车辆 正常行车正常行车 到站停车到站停车begin S1,S2 : semaphore; /S1能否开门,能否开门,S2能否开车能否开车 S1 := 1; S2 := 0; cobegin: process 司机司机 begin L1: P(S2); 启动车辆启动车辆 正常行驶正常行驶 到站停车到站停车 V(S1); goto L1; end; coend:End;proc

29、ess 售票员售票员begin L2:P(S1); 开门开门 关门关门 V(S2); 售票售票 goto L2;end;P225 7n有三个并发进程有三个并发进程R、M、P,它们共享一个只能,它们共享一个只能存放一个记录的缓冲区。存放一个记录的缓冲区。R负责从输入设备读负责从输入设备读信息,每次读一个记录,存在缓冲区中。信息,每次读一个记录,存在缓冲区中。M对对缓冲区中的记录加工,缓冲区中的记录加工,P把加工后的记录打印把加工后的记录打印输出。输出。记录经加工并输出后记录经加工并输出后,缓冲区才能存放,缓冲区才能存放下一个记录。写出它们并发执行时的程序。下一个记录。写出它们并发执行时的程序。n

30、假设有三个进程假设有三个进程R,W1,W2共享一个缓冲区共享一个缓冲区B,又设,又设B中每次只能放一个数。中每次只能放一个数。n要求:要求:q缓冲区中无数时,缓冲区中无数时,R可以从设备读数存到缓冲可以从设备读数存到缓冲q若存到缓冲中的数是奇数,允许若存到缓冲中的数是奇数,允许W1将其取出打印将其取出打印q若存到缓冲中的数是偶数,允许若存到缓冲中的数是偶数,允许W2将其取出打印将其取出打印qR必须等缓冲区空才能放,必须等缓冲区空才能放,W1,W2不能从空缓冲不能从空缓冲区中取数。区中取数。begin SP,SG1,SG2 : semaphore; SP := 1; SG1 :=0; SG2:=

31、0; Buffer: integer; cobegin: process R begin L1: 读入一个数读入一个数number P(SP); buffer : = number; if buffer mod 2 0 then V(SG1) else then V(SG2) goto L1; end; coend:end;process W1begin L2: P(SG1); y:=buffer; V(SP); print y; goto L2;end;process W2begin L3: P(SG2); z:=buffer; V(SP); print z; goto L3;end;多缓冲

32、区的进程同步多缓冲区的进程同步记录记录BA缓冲区缓冲区进程进程存存进程进程取取加工加工假设缓冲区容量为假设缓冲区容量为n,或者假设有,或者假设有n个缓冲区。个缓冲区。一个生产者进程,一个消费者进程,要求消费者一个生产者进程,一个消费者进程,要求消费者进程的处理顺序与生产者进程的输入的完全一样进程的处理顺序与生产者进程的输入的完全一样begin buffer: array0,n-1 of integer k,t: integer; k:=0;t:=0; SP,SG : semaphore; SP := n; SG :=0; cobegin: process producer begin L1:

33、produce a product P(SP); bufferk : = product; k = (k+1) mod n; V(SG); goto L1; end; coend:end;process consumerbegin L2: P(SG); take a product from buffert; t:= (t+1) mod n; V(SP); Consume; goto L2; end;同步与互斥的混合问题同步与互斥的混合问题n某工厂有一个可以存放设备的仓库,总共可以某工厂有一个可以存放设备的仓库,总共可以存放存放8台设备。台设备。n生产部门生产的每一台设备都必须入库。生产部门生

34、产的每一台设备都必须入库。n销售部门可以从仓库中提出设备供应客户。销售部门可以从仓库中提出设备供应客户。n设备出设备出/入库需要借助运输工具,现入库需要借助运输工具,现只有一套只有一套运输工具,每次只能运一台设备运输工具,每次只能运一台设备n请设计一套能够协调工作的自动调度系统。请设计一套能够协调工作的自动调度系统。begin S,SP,SG : semaphore; S := 1; SP := 8; SG :=0 cobegin: process 生产生产 begin L1: 生产一台设备生产一台设备 P(SP); P(S); 运送到仓库;运送到仓库; V(S) V(SG); goto L1

35、; end; coend:end;process 销售销售begin L1: P(SG); P(S); 从仓库运出;从仓库运出; V(S) V(SP); goto L1;end;nm个生产者和个生产者和r个消费者怎样共享容量为个消费者怎样共享容量为n的缓的缓冲区,每个生产者都要把生产的物品存入缓冲冲区,每个生产者都要把生产的物品存入缓冲区,每个消费者要从缓冲区中取物品区,每个消费者要从缓冲区中取物品begin buffer: array0,n-1 of integer k,t: integer; k:=0;t:=0; SP,SG ,mutex1,mutex2: semaphore; SP :=

36、 n; SG :=0; mutex1 := 1 ,mutex2 := 1; cobegin: process produceri(i=1,2.) begin L1: produce a product P(SP); P(mutex1) bufferk : = product; k = (k+1) mod n; V(mutex1) V(SG); goto L1; end; coend:end;process consumeri(i=1,2.)begin L2: P(SG); P(mutex2); take a product from buffert; t:= (t+1) mod n; V(mu

37、tex2) V(SP); Consume; goto L2; end;n桌上放一个盘子,每次只能放一个水果,爸爸桌上放一个盘子,每次只能放一个水果,爸爸像盘子里放苹果,妈妈向盘子里放橘子,女儿像盘子里放苹果,妈妈向盘子里放橘子,女儿专吃苹果专吃苹果,儿子专吃橘子。盘子空的时候爸爸儿子专吃橘子。盘子空的时候爸爸或妈妈才能向盘子里面放一个水果,仅当盘子或妈妈才能向盘子里面放一个水果,仅当盘子里有自己需要的水果时才可取一个水果。把爸里有自己需要的水果时才可取一个水果。把爸爸、妈妈、儿子、女儿看做四个进程,用爸、妈妈、儿子、女儿看做四个进程,用PV操作进行管理,使这四个进程能正确地并发执操作进行管理,

38、使这四个进程能正确地并发执行。行。begin mutex ,SA,SO : semaphore; mutex := 1; SA :=0; SO := 0; cobegin: process 爸爸爸爸 begin L1: P(mutex); 放苹果放苹果 V(SA); goto L1; end; process 妈妈妈妈 begin L2: P(mutex); 放橘子放橘子 V(SO); goto L2; end; coend:end;process 儿子儿子begin L4: P(SO); 拿橘子拿橘子 V(mutex); goto L4;end;process 女儿女儿begin L3: P

39、(SA); 拿苹果拿苹果 V(mutex); goto L3;end;P225 8n如果盘子的容量改为如果盘子的容量改为2,且任何时刻只允许爸,且任何时刻只允许爸爸、妈妈、女儿、儿子中的一个进程去访问盘爸、妈妈、女儿、儿子中的一个进程去访问盘子(放或者取)。子(放或者取)。begin mutex1, mutex2,SA,SO : semaphore; mutex1 := 2; mutex2 := 1; SA :=0; SO := 0; cobegin: process 爸爸爸爸 begin L1: P(mutex1);/盘子盘子 P(mutex2);/伸手伸手 放苹果放苹果 V(mutex2)

40、; V(SA); goto L1; end; process 妈妈妈妈 begin L2: P(mutex1);/盘子盘子 P(mutex2);/伸手伸手 放橘子放橘子 V(mutex2); V(SO); goto L2; end; coend:end;process 女儿女儿begin L3: P(SA); P(mutex2);/伸手伸手 拿苹果拿苹果 V(mutex2) V(mutex1); goto L3;end;process 儿子儿子begin L4: P(SO); P(mutex2);/伸手伸手 拿橘子拿橘子 V(mutex2) V(mutex1); goto L4;end;n有三

41、个进程有三个进程A1、A2、A3,它们共享两个缓冲区,它们共享两个缓冲区B1和和B2。缓冲区缓冲区B1中可以存放中可以存放n件产品,缓冲区件产品,缓冲区B2中可以存放中可以存放m件件产品。进程产品。进程A1每次生产一件产品,并把产品存入缓冲区每次生产一件产品,并把产品存入缓冲区B1。进程。进程A2每次生产一件产品,并把产品存入缓冲区每次生产一件产品,并把产品存入缓冲区B2。进程进程A3每次从缓冲区每次从缓冲区B2中取一件产品区消费。为了防止中取一件产品区消费。为了防止把产品存入已满的缓冲,或者从空缓冲中取产品,或重复把产品存入已满的缓冲,或者从空缓冲中取产品,或重复取一产品,用取一产品,用PV

42、操作实现它们的相互制约关系。操作实现它们的相互制约关系。进程进程A1缓冲区缓冲区B1n缓冲区缓冲区B2m进程进程A2进程进程A3消费消费生产生产Begin B1,B2: array0,n-1 of integer k1,k2,t1,t2: integer; k1:=0; k1:=0; t1:=0; SP,SG : semaphore; SP = n; SG =0; cobegin: process producer begin L1: produce a product P(SP); bufferk : = product; k = (k+1) mod n; V(SG); goto L1; e

43、nd; coend:End;进程通信进程通信n并发进程间可以通过并发进程间可以通过PV操作交换信息实现进程的操作交换信息实现进程的互斥和同步,因此可以把互斥和同步,因此可以把PV操作看做进程间的一操作看做进程间的一种通信方式,但这种通信只交换了少量的信息。种通信方式,但这种通信只交换了少量的信息。n如果进程间要交换大量信息,这种大量信息的传如果进程间要交换大量信息,这种大量信息的传递要有专门的通信机制来实现,通过专门的通信递要有专门的通信机制来实现,通过专门的通信机制实现进程间机制实现进程间大量信息大量信息的通信方式称为的通信方式称为进程通进程通信信。通信机制通信机制n采用高级通信方式时,进程

44、间用采用高级通信方式时,进程间用信件信件来交换信来交换信息。息。n信件:信件: 信件内容包括发送者名、信息信件内容包括发送者名、信息(信息存信息存放的地址和长度放的地址和长度)、等、等/不等回信,回信存放地不等回信,回信存放地址。址。n通信方式:信件的传递是由通信原语完成的,通信方式:信件的传递是由通信原语完成的,最基本的原语是两条:最基本的原语是两条:发送发送(send)原语原语和和接收接收(receive)原语原语。通信方式通信方式n直接通信方式直接通信方式q这种通信方式总是固定在一对进程之间进行这种通信方式总是固定在一对进程之间进行 send(B,M) 把信件把信件M发送给发送给BABr

45、eceive(A,X)接受来自进程接受来自进程A的信件存入的信件存入X中中通信方式通信方式n间接通信间接通信q这种通信方式总是这种通信方式总是信箱信箱为媒体来实现通信的,接受为媒体来实现通信的,接受进程设立一个信箱,任何要向该进程发信的进程总进程设立一个信箱,任何要向该进程发信的进程总是把信件发送到该进程的信箱里是把信件发送到该进程的信箱里AB信箱Nsend(N,M) 把信件把信件M送入信箱送入信箱N中中receive(N,X) 从信箱从信箱N中取出一封信存入中取出一封信存入X取发间接通信的实现间接通信的实现n间接通信指的是进程之间间接通信指的是进程之间利用信箱利用信箱来交换信息。来交换信息。

46、n通信时要遵循的规则:通信时要遵循的规则:q信箱满时,把发送信件的进程信箱满时,把发送信件的进程 置成置成”等信箱等信箱“,直到信箱有空,直到信箱有空 才被释放才被释放q若信箱无信,则把接收信件的若信箱无信,则把接收信件的 进程置成进程置成”等信件等信件“,直到信箱,直到信箱 有信件才释放。有信件才释放。可存信件数已有信件数可存信件的指针信件1信件2取信件信箱说明信箱的数据结构定义信箱的数据结构定义nTYPE box = record size : 0.n; 信箱大小信箱大小 count : 0.n ; 现有信件数现有信件数 letter : array1.n of message; 信件信件

47、 S1,S2 : semaphore; end;send原语过程原语过程procedure send(var B:box; M:message)var i : integer;begin if B.count = B.size then W(B.S1) 如果信箱满,等信箱如果信箱满,等信箱 else begin i:= B.count + 1; 确定可存放信件的位置确定可存放信件的位置 B.letteri = M; 信件存放到信箱指定位置信件存放到信箱指定位置 B.count := i; 信箱的信件数信箱的信件数+1 R(B.S2); 释放等信件者释放等信件者 end;end;sendrece

48、ive原语过程原语过程procedure receive(var B:box; M:message)var i : integer;begin if B.count = 0 then W(B.S2) 如果信箱无信,等信件如果信箱无信,等信件 else begin X := B.letter1; 总是取第一封信总是取第一封信 B.count := B.count - 1; 信件数信件数-1 if B.count 0 then for i=1 to B.count do B.letteri := B.letteri+1; 所有信件上移所有信件上移 R(B.S1); 释放一个等信箱的进程释放一个等信

49、箱的进程 end;end;receive进程通信示意进程通信示意组织信件组织信件Msend(B,M).receive(A,Y)receive(B,X)处理信件处理信件M组织回信组织回信Nsend(A,N)信件信件M信件信件NB进程信箱进程信箱A进程信箱进程信箱A进程进程B进程进程磁盘管理磁盘管理欲访问磁盘的进程欲访问磁盘的进程begin 组织信件组织信件M ; sendB,M; end;磁盘管理进程磁盘管理进程L1: receive(B,X) 按信件要求组织通道程序按信件要求组织通道程序 ; 通道程序首址存入通道程序首址存入CAW ; 启动磁盘启动磁盘 ; 等待磁盘传输结束等待磁盘传输结束 ;

50、 组织回信组织回信M ; sendname,M; goto L1;end;用进程通信实现进程同步用进程通信实现进程同步n用直接通信方式解决生产者用直接通信方式解决生产者/消费者问题消费者问题cobegin: process producer begin L1: 生产物品生产物品 组织信件组织信件M send(consumer,M) goto L1; end;cobegin: process consumer begin L2: receive(producer,X) 处理处理X中的信件中的信件 goto L2; end;UNIX中的进程同步中的进程同步nUNIX的进程在的进程在用户态用户态执行

51、时,使用执行时,使用wait系统系统调用让自己等待,子进程执行完毕,用系统调调用让自己等待,子进程执行完毕,用系统调用用exit来终止自己。来终止自己。nUNIX的进程在的进程在核心态核心态执行时,使用执行时,使用sleep系系统调用让进程进入睡眠态,使用统调用让进程进入睡眠态,使用wakeup来唤来唤醒进程。醒进程。UNIX中的进程通信中的进程通信管道机制管道机制nUNIX中的管道通信机制允许进程按中的管道通信机制允许进程按先进先出先进先出的方法传送的方法传送信息。信息。n无名管道无名管道pipeq无名管道无名管道pipe适用于一个用户有适用于一个用户有同一祖先的父子进程同一祖先的父子进程间

52、的通信。间的通信。q无名管道就是一个进程间的共享文件,称为无名管道就是一个进程间的共享文件,称为pipe文件文件q一个进程调用一个进程调用pipe系统调用来建立一个无名管道(系统调用来建立一个无名管道(pipe文件),其文件),其子进程可以与该进程共享该管道,对子进程可以与该进程共享该管道,对pipe文件进行读写。文件进行读写。进程P1进程P2P1 | P2无名管道无名管道int fds2;char buffer1024 = ;pipe(fds); /fds0用于读管道文件,用于读管道文件, fds1用于写管道文件用于写管道文件write(fds1,buffer,6);/从从buffer写写6

53、个字个字 节到管道文件节到管道文件read(fds0,buffer,6);/从管道文件中读从管道文件中读6个个 字节到字节到bufferUNIX中的进程通信中的进程通信管道机制管道机制n命名管道命名管道FIFOqFIFO适用于适用于不同用户的进程不同用户的进程间通信。间通信。q命名管道是一个命名管道是一个有文件名有文件名的管道文件。的管道文件。q用户可以用用户可以用shell命令命令mknod来创建一个管道文件,来创建一个管道文件,也可以在程序中使用也可以在程序中使用mknod调用来创建。调用来创建。q使用方式同普通文件使用方式同普通文件命名管道命名管道FIFOchar string = “hello”;char buffer256;mknod(“fifo”,010777,0);/已可读可写方式创建管道文件已可读可写方式创建管道文件fifoint fd = open(“fifo”,”O_WRONLY”);/已只写方式打开已只写方式打开write(fd,string,6);/从从string写写6个字节到管道文件个字节到管道文件fd = open(“fifo”,”O_RDONLY”);/已只读方式打开已只读方式打开read(fd,buffer,6);/从管道里读从管道里读6个字节到个字节到bufferUNIX中的进程通信中的进程通信消息缓冲机制消息缓冲机制n利用缓冲区来传输消息,

温馨提示

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

评论

0/150

提交评论