1、分析 本题是用来检查考生对使用P、V操作实现进程间同步的掌握情况。一般地,若要求进程B在进程A之后方可执行时,只需在进程B执行前进行P操作,而在进程A执行完时对同一信号量进行V操作即可。本题要求列出8个进程(程序)的控制关系,使题目显得较为复杂。但当对进程间的同步理解透彻后,应不难写出对应的程序。解这一类问题还应注意的一点是,要看清图示的制约关系,不要漏掉或多出制约条件。解 图并发程序间的同步如下所示:设置信号量初值:s1:=s2:=s3:=s4:= s5:=0PARBEGINprog1:BEGINdo all work;V(s1);ENDprog2:V(s2);prog3:P(s1);P(s
2、2);V(s3);prog4:V(s5);Prog5:V(s4);prog6:P(s3);prog7:P(s4);prog8:P(s5);PAREND例3.4有个寺庙,庙中有小和尚和老和尚若干人,有一只水缸,由小和尚提水入缸给老和尚饮用。水缸可容10桶水,水取自同一口水井中。水井径窄,每次仅能容一只水桶取水,水桶总数为3个。若每次只能入缸1桶水和取缸中1桶水,而且还不可以同时进行。试用一种同步工具写出小和尚和老和尚入水、取水的活动过程。解 本题为两个进程共享两个缓冲区的问题。首先考虑本题有几个进程:从井中取水后向缸中倒水此为连续动作,为一个进程;从缸中取水为另一个进程。其次,考虑信号量。有关互
3、斥的资源有:水井和水缸。水井依次仅能一个水桶进出,水缸一次入水为一桶。分别设互斥信号量为:mutex1和mutex2控制互斥。有关同步问题为:三个水桶无论从井中取水还是入处水缸都是一次一个,应为它设信号量count,抢不到水桶的进程只好等待。水缸满时不可入水,设信号量empty,控制水量,水缸空时不可出水,设信号量full,控制水量。mutex1:=mutex2:=1; count:=3; empty:=10; full:=0;parbegin小和尚打水进程: begin L1:P(empty); /*水缸满否? P(count); /*取得水桶 P(mutex1); /*互斥从井中取水 从井
4、中取水; V(mutex1); P(mutex2); /*互斥使用水缸 倒水入缸; V(mutex2); V(count); /*归还水桶 V(full); /*多了一桶水 Goto L1; End老和尚取水进程: L2: P(full); /*有水吗? /*申请水桶 /*互斥取水 从缸中取水; V(empty); /*水缸中少了一桶水 Goto L2; endparend.例3.5 有三个并发进程、共享一个缓冲区,进程负责从输入设备读入一条记录,每读一条记录后把它存放在缓冲区中;进程在缓冲区中加工进程存入的记录;进程把加工后的记录打印输出。缓冲区中每次只能存放一条记录,当记录被加工输出后,缓
5、冲区中才可存放另一条新记录。请用、操作为同步机制来描述它们并发执行时能正确工作的程序。分析 本题是三个进程共享一个缓冲区的问题。从题中看出,R、M、P这三个进程严格按照先做进程R,然后做进程M,最后做进程P。只有进程P执行完后,才可以做下一次的R,M,P。因此,要合理设计P、V操作的顺序与设置信号量的初值。解 R:=;M:=P:=0;进程 L1:从输入设备中读取一条记录;P(R);将读入记录存入缓冲区;V(M);goto L1进程M L2:P(M);从缓冲区中取出数据信息进行加工,并将其存入缓冲区;V(P)goto L2进程P:L3:P(P)输出缓冲区的信息;V(R)goto L3parend
6、;例3.6 若有三个进程A、B和C协作解决文件打印问题;A将文件记录从磁盘读入主存的缓冲区buffer1,每执行一次读一个记录;B将缓冲区buffer1的内容复制到缓冲区buffer2,每执行一次复制一个记录;C打印缓冲区buffer2的内容,每执行一次打印一个记录。缓冲区的大小和一个记录大小一样。请用P、V操作来保证文件的正确打印。分析 本题是三个进程共享二个缓冲区的问题。它是一个典型的生产者消费者问题,其中的难点在于进程B既是生产者又是消费者,处理不好可能造成同步错误或死锁。解 A、B、C三个进程协作解决文件打印问题的流程为: mutex1:avail1:=avail2:full1:=fu
7、ll2:进程Aread from disk;P(avail1);P(mutex1);put to buffer 1;V(full1);V(mutex1);goto L1;进程BP(full1);get form buffer 1;V(avail1);P(avail2);P(mutex2);put to buffer 2;V(full2);V(mutex2);goto L2;进程CP(full2)get form buffer 2;V(avail2);print record;goto L3;程序中mutex1和mutex2是两个公用信号量,用于控制进程对缓冲区buffer1和缓冲区buffer
8、2这两个临界资源访问的互斥。avail1、full1、avail2和full2分别对应两个缓冲区,其中avail1、avail2初值为1,表示可以利用的缓冲区数目为1;full1、full2的初值为0,表示存在于缓冲区内的数据的个数为0。通过对这两组私用信号量P、V操作,就实现了进程的同步。例3.7 进程P1使用缓冲区buffer向进程P2,P3,P4发送消息,要求每当P1向buffer中发消息时,只有当P2,P3,P4进程都读取这条消息后才可再向buffer中发送新的消息。利用P、V原语描述如图所示进程的动作序列。图 进程的动作序列分析 本题是一个生产者三个消费者共享一个缓冲区问题。它是生产
9、者和消费者问题的一个变形,在生产者和消费者问题中是共用一组缓冲区,每一个缓冲区只需要写一次,读一次。而在这个问题中,每个缓冲区只需写一次,但需读三次。本题在解题的过程中,我们可以把这一组缓冲区看做三组缓冲区。这样一来,每一个生产者需要同时写缓冲区组中相应的三个缓冲区,而每一个消费者只需读它自己所对应的那组缓冲区中对应的单元即可。生产者须在三个缓冲区都为空时才可写入。解 设信号量初值为:S1=S2=S3=0,S =3 进程P1 进程P2 进程 P3 进程P4 P(S ) P(S1) P(S2) P(S3) P(S ) 读取消息 读取消息 读取消息 P(S ) V(S) V(S) V(S) 发送消
10、息到缓冲区BufferV(S1) V(S2) V(S3)例3.8桌上有一个空盘,允许存放一个水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次放一个水果供吃者取用,请用P,V原语实现爸爸、儿子、女儿三个并发进程的同步。分析 本题是一个生产者两个消费者共享一个缓冲区问题,生产者一次可生产一个不同种类的产品本题的题意是: 爸爸、儿子、女儿共用一个盘子,且盘中一次只能放一个水果。 当盘空时,爸爸可将一个水果放入果盘中。 若放入盘中的是橘子,允许儿子吃,女儿必须等待。 若放入盘中的是苹果,允许女儿吃,儿子必须等待。因此,上述问题实际上是生产者消费者
11、问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。解 设置三个信号量:S, 初值为1,用于爸爸、儿子、女儿三个进程间的互斥,表示盘中是否为空。SO, 初值为0,用于爸爸、儿子儿两个进程间的同步,表示盘中是否有橘子。SA, 初值为0,用于爸爸、女子两个进程间的同步,表示盘中是否有苹果。三个进程之间的同步描述如下: father进程 son进程 daughter进程 L2: L3: P(S) P(SO) P(SA)将水果放入盘中 从盘中取出橘子 从盘中取出苹果if (放入是橘子) V(SO) V(S) V(S)else V(SA) 吃橘子 吃苹果 goto L1 goto L2 goto L3例3.9 某高校计算机开设一系列网络课程并安排学生上机实习,假设机房共有2m台机器,有2n名学生选该课,规定:(1) 每两个学生组成一组,但占有一台机器,协同完成上机实习;(2) 只有一组的两个学生都到齐,并且此时机房有空闲机器时,该组学生才能进入机房;(3) 上机实习完成后,由一名教师检查,检查完毕,这一组学生同时离开机房。试用P,V操作模拟上机实习过程。解 上机实习过程如下:设置信号量:student=0; computer=2m,; enter=finish=check=0设置变量:rc=0学生进程:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1