“进入”进程 信号量: S1的初值=100 S2的初值=0 “注销”进程 P(S1) (申请一个座位) P(S2) (等待“进入”进程消息) 办理阅读手续 办理注销手续 V(S2) (向“注销”进程发消息) V(S1) (向“进入”进程发消息) 图6-11 “进入”与“注销”两个进程
在读者进入时,调用“进入”进程,通过P(S1)来申请座位。如果申请到,就可以办理阅览手续。如果100个座位都申请完毕,那么第101个读者就只有在关于S1的队列上等待,等到有人调用“注销”进程执行V(S1)。在有读者离去时,就调用“注销”进程。
3.今有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-12给出了它们的工作流程示意。
37
进程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-12 R、S、T之间的相互制约关系
4.假定有3个进程R、W1、W2共享一个缓冲区B,B中每次只能存放一个数。进程R从输入设备读入一个数,把它存放到缓冲区B里。如果存入的是奇数,则由进程W1取出打印;如果存入的是偶数,则由进程W2取出打印。规定进程R只有在缓冲区B为空或内容已经被打印后才能进行存放;进程W1和W2不能从空缓冲区里取数,也不能重复打印。试用信号量及其P、V操作管理这3个进程,让它们能够协调地正确工作。 解:这实际上也是最简单“生产者—消费者”问种:进程R是产生者,进程W1、W2是两个消费是W1只消费奇数,W2只消费偶数。图6-13所3个进程的工作示意。
进程R 缓冲区B 偶数 进程W2 奇数 进程W1 题的变者。只示的是
图6-13 奇数、偶数问题
分析一下题目,知道3个进程间有如下的制约关系存在:
(1)进程R申请使用缓冲区B,释放缓冲区B的权利是由进程W1或W2掌握的;
(2)进程W1要等待R往缓冲区B里放入奇数后,才能工作(要与R取得同步),然后释放缓冲区;
(3)进程W2要等待R往缓冲区B里放入偶数后,才能工作(要与R取得同步),然后释放缓冲区。
因此,应该设置3个信号量:
S——初值为1,控制缓冲区B的分配; SO——初值为0,控制W1与R取得同步; SE——初值为0,控制W2与R取得同步。 3个进程的工作流程如图6-14所示。
38
进程R 进程W1 得到一个数 P(S) (申请缓冲区B) 将数存入缓冲区B P(SO) (等待R发消息) P(SE) (等待R发消息) 进程W2 从B中取出奇数 从B中取出偶数 Y B里是奇数? N V(S) (释放缓冲区B) V(S) (释放缓冲区B) V(SO) (向W1发消息) V(SE) (向W2发消息) 图6-14 W、R1、R2的相互制约关系
这里有3个问题需要解释。
(1)在进程R中,把数存入B之后,应该根据数的奇、偶性,来决定是向进程W1发消息,还是向进程W2发消息。这样,才能给予W1或W2从B里取数的机会。
(2)由于在进程R里已经对数的奇、偶性做了判断,所以进程W1或W2到缓冲区B里取数时,不必对它再行判断,取出的内容肯定是所需要的,不会弄错。
(3)假定在进程R没有执行之前,进程W1和W2都先于它执行了。那么这时由于信号量SO和SE的值都是0,所以它们都无法执行下去,分别在SO和SE的有关队列上等待。当进程R被调度到、判定放入B的数是奇数还是偶数,并向W1或W2发消息后,它们两个中的一个才会被唤醒,才会到B里去取数。
还可以从别的角度出发,去理解本题目中R、W1、W2之间的制约关系,从而得到它的另一种解决办法。图6-15给出了流程图,只需设置两个信号量: S——初值为1; G——初值为0。
这里有3个问题需要解释。
(1)信号量S用于资源分配。进程R通过P(S)申请使用缓冲区B。申请到后,才向里面存放数,然后就在信号量G上执行一个V操作,笼统地告诉进程W1或W2:缓冲区B里有数可取了。由于并不知道这个数的奇、偶性,所以,它们两个谁去取都是可以的。
(2)这时判断缓冲区B里数的奇、偶性,是在进程W1或W2里进行的。运行W1时,如果判定B里的是奇数,那么进程W1就可以将其取出,然后释放缓冲区B(通过V(S)实现)。如果判定B里的是偶数,那么进程W2就可以将其取出,然后释放缓冲区B(通过V(S)实现)。
39
进程R 进程W1 进程W2 得到一个数 P(G) (等待R发消息) P(G) (等待R发消息) P(S) (申请缓冲区B) N B里是 奇数? Y N B里是 奇数? Y 将数存入缓冲区B V(G) (恢复原样) 从B中取出奇数 从B中取出偶数 V(G) (恢复原样) V(G) (向W1或W2发消息) V(G) (释放缓冲区B) V(S) (释放缓冲区B) 图6-15 W、R1、R2的另一种相互制约关系
(3)要注意的是,如果在进程W1里判定B中的数不是奇数,那么它就不应该取出此数。同样地,如果在进程W2里判定B中的数不是偶数,那么它就不应该取出此数。既然它没有取,表明数还在缓冲区B里。所以要通过V(G),使信号量G恢复原来的取值(含义是告诉要去取数的进程:B里有数要取),以便给另一个进程去取的机会。如果不做这一步,那么信号量G的当前值是0,无论进程W1还是W2在它的上面再执行P(G)时,就都无法通过,两个进程就会全被阻塞,进入死锁。所以,进程W1和W2里的V(G)是非第j售票处要订 第i航班的飞机票 常重要的。
5.在飞机订票系统中,假定公共数据区的单(i=1,2,3…)里存放着某月某日第i次航班数。在第j个售票处,利用变量Rj暂存Ai里容。现在为第j个售票处编写代码如图6-16材中的图6-30)所示。试问它的安排对吗?如确,试说明理由;如果不对,指出错误,并做改。
解:从图6-16可以知道,公共数据区的单元(i=1,2,3…)里存放的某月某日第i次航班票数,是j(j=1,2,3…)个售票处共享的数此,这些售票处对公共数据区的单元Ai
2,3…)的操作不能同时进行。正因为如此,对Ai的这些操作,用名为S的信号量上的P、保证它们互斥进行。这样处理都是正确的。
按旅客要求找到Ai P(S) (进入公共数据监界区) Rj=Ai; (取出该航班现有票数) N 元Ai现有票的内(即教果正出修
Rj≥1? (还有这个班次的飞机票?) Y Rj=Rj–1; Ai=Rj; (进行数据修改) 打印“票已售完!” Ai
V(S) (退出公共数据监界区) 售出一张飞机票 的现有据。因(i=1,图中把V操作,
图6-16 第j售票处的售票程序 关键是当判定没有第i次航班的机票时,图6-28里仅
安排了打印“票已售完!”的动作。这样,第j售票处只有进入临界区的P(S),而没有执行退出临界区的V(S)。它没有退出临界区,别的售票窗口也就无法再进入这个临界区。所以,这种安排是不对的。应该把图6-16改成为图6-17,这样就完全正确了。
40
相关推荐: