父亲 P1 While(true) { 洗桔子; P(m3); 放桔子; V(m1) } 母亲 P2 While(true) { 洗苹果; P(m3); 放苹果; V(m2); } 儿子 P3 While(true) { P(m2); 取苹果; V(m3); 吃苹果; } 女儿 P4 While(true) { P(m1); 取桔子; V(m3); 吃桔子; }
3.打印文件,试用PV操作来实现进程通信。
P1 While(true) { 从磁盘取文件; 放入缓冲1; } P2 While(true) { 从缓冲1取文件; 放入缓冲2; } P3 While(true) { 从缓冲2取文件; 打印文件; }
分析:P1做完,P2才能做,P3才能做。这三个进程是一个同步关系。 解法1:设信号量m1表示P1能否把文件放进缓冲1,m2表示P2能否从缓冲1取文件,m3表示P2能否把文件放入缓冲2,m4表示p3能否从缓冲2取文件。
M1=n, m2=0, m3=m, m4=0
P1 While(true) { 从磁盘取文件; P(m1); 放入缓冲1; V(m2); } P2 While(true) { P(m2); P(m3); 从缓冲1取文件; 放入缓冲2; V(m1); V(m4); } P3 While(true) { P(m4); 从缓冲2取文件; V(m3); 打印文件;
解法2:设信号量m1表示P1能否把文件放入缓冲1,m2表示P2能否从缓冲1取完文
件,m3表示P2能否把文件放入缓冲2,m4表示p3能否从缓冲2取完文件。
P1 While(true) { 从磁盘取文件; P(m2); 放入缓冲1; V(m1); } P2 While(true) { P(m1); 从缓冲1取文件; V(m2); P(m4); 放入缓冲2; V(m3); } P3 While(true) { P(m3); 从缓冲2取文件; V(m4); 打印文件; }
4.过独木桥,试用PV操作来实现进程通信。
P1 {
由西向东过独木桥; } P2 {
由东向西过独木桥;
}
解答:进程P1、P2因竞争独木桥这个资源而成为互斥关系。设:信号量m表示独木桥资源,初值为1表示资源可用。
P1 {
P(m);
通过独木桥; V(m); } P2 {
P(m);
通过独木桥; V(m);
}
5.过十字路口,试用PV操作来实现进程通信。
P1 {
通过路口; } P2 {
通过路口; } P3 {
通过路口; } P4 {
通过路口; }
解决:P1 {
P(m);
通过路口; V(m); } P2 {
P(m);
通过路口; V(m); } P3 {
P(m);
通过路口; V(m); }
P4 {
P(m);
通过路口; V(m); }
6.今有3个并发进程R、S、T,它们共享一个缓冲区B。进程R负责从输入设备读入信息,每读出一个记录后就把它存入缓冲区B中;进程S利用缓冲区B加工进程R存入的记录;进程T把加工完毕的记录打印输出。缓冲区B一次只能存放一个记录。只有在进程T把缓冲区里的记录输出后,才能再往里存放新的记录。试用信号量及其P、V操作控制这3个进程间的的正确工作关系。
解:3个并发进程R、S、T之间有如下的制约关系:
(1)R必须先做,在往缓冲区B里面存入数据后,应该向S发消息,然后等待T打印输出后释放缓冲区B;
(2)S应该与R取得同步,在等到R发来的消息(表明B里面有数据)后,取出加工、回存,然后向T发消息;
(3)T应该与S取得同步,在等到S发来的消息(表明B里的数据已经加工完毕)后,才取出打印,然后向R发消息,表示缓冲区B又可以使用了。
从这些关系可以看出,这里是3个同步问题:R要与T取得同步;S要与R取得同步;T要与S取得同步。所以,设置3个同步信号量:
S1——控制S要与R取得同步; S2——控制T要与S取得同步; S3——控制R要与T取得同步。 图6-24给出了它们的工作流程示意。
进程R 信号量: S1=0 S2=0 S3=0 进程S 进程T 从设备读入数据 P(S1) (等待R的消息) P(S2) (等待S的消息) 将数据存入B 对B中数据 加工、回存 数据打印 V(S1) (向S发消息) P(S3) (等待P的消息) V(S2) (向T发消息) V(S3) (向R发消息)
图6-24 R、S、T之间的相互制约关系
7.在飞机订票系统中,假定公共数据区的单元Ai(i=1,2,3…)里存放着某月某日第i次航班现有票数。在第j个售票处,利用变量Rj暂存Ai里的内容。现在为第j个售票处编写代码如图6-28所示。试问它的安排对吗?如果正确,试说明理由;如果不对,指出错误,并做出修改。

