主观题:h401.有三个进程R、W1、W2共享一个缓冲器B,而B中每次只能存放一个数。当B中无数时,进程R可将从输入设备上读入的数存放到缓冲器B中;.......
有三个进程R、W1、W2共享一个缓冲器B,而B中每次只能存放一个数。当B中无数时,进程R可将从输入设备上读入的数存放到缓冲器B中;若存放到B中的是奇数,则允许进程W1将其取出打印;若存放到B中的是偶数,则允许进程W2将其取出打印;同时规定:进程R必须等缓冲器中的数被取出后才能再存放下一个数;进程W1或W2对每次存入缓冲器的数只能打印一次;W1和W2都不能从空的缓冲器中取数。用P、V操作作为同步机制写出三个并发进程的同步算法。(动作部分可用文字描述)
答案:
解:
semaphore S,S1,S2;
S=1; S1=S2=0;
parbegin
Process R
{
while (1) {
从输入设备上读入的数x;
P(S);
B=x;
if (x%2==1) V(S1); //若是奇数,则通知W1
else V(S2); //若是偶数,则通知W2
}
}(3分)
Process W1
{
while (1) {
P(S1); //看看缓冲器B中是否有奇数
y=B; //从缓冲器B中取奇数存于y
V(S); //通知R,缓冲器已空,可以在往里存数了
Print(y); //打印
}
}(4分)
Process W2
{
while (1) {
P(S2); //看看缓冲器B中是否有偶数
y=B; //从缓冲器B中取偶数存于y
V(S); //通知R,缓冲器已空,可以在往里存数了
Print(y);
}
}(3分)
parend
答案:
解:
semaphore S,S1,S2;
S=1; S1=S2=0;
parbegin
Process R
{
while (1) {
从输入设备上读入的数x;
P(S);
B=x;
if (x%2==1) V(S1); //若是奇数,则通知W1
else V(S2); //若是偶数,则通知W2
}
}(3分)
Process W1
{
while (1) {
P(S1); //看看缓冲器B中是否有奇数
y=B; //从缓冲器B中取奇数存于y
V(S); //通知R,缓冲器已空,可以在往里存数了
Print(y); //打印
}
}(4分)
Process W2
{
while (1) {
P(S2); //看看缓冲器B中是否有偶数
y=B; //从缓冲器B中取偶数存于y
V(S); //通知R,缓冲器已空,可以在往里存数了
Print(y);
}
}(3分)
parend