问题 问答题

三个进程P1,P2,P3互斥使用一个包含N(N>0)个单元缓冲区,P1每次用prodLice()生成一个正整数,并用put()送入缓冲区某一空单元中,P2每次用getoodd()从该缓冲区中取出一个奇数,并用countodd()统计奇数个数,P3每次用geteven()从该缓冲区中取出一个偶数,并用Counteven()统计偶数个数,请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义,要求用伪代码描述。

答案

参考答案:(1)缓冲区是一互斥资源,因此设互斥信号量mutex。
(2)同步问题:P1、P2因为奇数的放置与取用而同步,设同步信号量odd;P1、P3因为偶数的放置与取用而同步,设同步信号量even;P1、P2、P3因为共享缓冲区,设同步信号量empty。
Semaphore mutex=1;
Semaphore odd=0,even=0:
Semaphore empty=N;
Main()
Cobegin{
Process P1
While(True)
{
Number=produce();
P(empty); ∥检查缓冲区是否为空
P(mutex);
Put(); ∥是空则放数据
V(mutex);
If number%2==0 ∥如果是偶数则唤醒P3,否则P2
V(even);
else
V(odd):
}
Process P2
While(True)
{
P(odd); ∥检查有没有奇数放入
P(mutex);
getodd(); ∥有则取出
V(mutex);
V(empty); ∥使缓冲区为空
Countodd();
}
Proeess P3
While(True)
{
P(even); ∥检查有没有偶数放入
P(mutex);
geteven(); ∥有则取出
V(mutex);
V(empty); ∥使缓冲区为空
Counteven();
}
}coend

解析: 真题答案还是传承了老的写法P,V,在汤一书中是wait,signal,其意义完全相同,写哪一种应该都可以,其它语法如是用while还是用repeat还有定义信号量的方法也不是重点,按自己习惯来写就可。
同步与互斥的解题思路
①分清哪些是互斥问题(互斥访问临界资源的),哪些是同步问题(具有前后执行顺序要求的)。
②对互斥问题要设置互斥信号量,不管有互斥关系的进程有几个或几类,通常只设置一个互斥信号量,且初值为1,代表一次只允许一个进程对临界资源访问。


上图中进程A和进程B访问相同的临界资源,都有各自的临界区,实现互斥访问就是在每个进程的临界区之前加P操作,之后加V操作,信号量初值为1。
③对同步问题要设置同步信号量,通常同步信号量的个数与参与同步的进程种类有关,即同步关系涉及几类进程,就有几个同步信号量。同步信号量表示该进程是否可以开始或该进程是否已经结束。找出进程之间的同步关系,并为每种同步关系设置一信号量,然后再在需要等待某种动作的地方插入P操作,在被等待的动作完成之后插入V操作。


上图左边表示,进程A和进程B的同步信息,进程A在X点处需要进程B的数据。则X点为需要等待的地方插入P操作如右图;进程B为进程A准备的信息的Y点完成,即Y点为被等待的动作完成的地方插入V操作,此同步完成。单纯的同步初值为0,当然不同情况中初值也不一样。
④在每个进程中用于实现互斥的PV操作必须成对出现;用于实现同步的PV操作也必须成对出现,但可以分别出现在不同的进程中;在某个进程中如果同时存在互斥与同步的P操作,则其顺序不能颠倒,必须先执行对同步信号量的P操作,再执行对互斥信号量的P操作,但V操作的顺序没有严格要求。

单项选择题
填空题