主观题:h411.设有三组进程Pi、Qj、Rk,其中Pi、Qj构成一对生产者-消费者,共享一个由M1个缓冲区构成的循环缓冲buf1。......
设有三组进程Pi、Qj、Rk,其中Pi、Qj构成一对生产者-消费者,共享一个由M1个缓冲区构成的循环缓冲buf1。Qj、Rk构成另一对生产者-消费者,共享一个由M2个缓冲区构成的循环缓冲buf2。如果Pi每次生产一个产品投入buf1,Qj每次从buf1中取两个产品组装成一个后投入buf2,Rk每次从buf2中取出三个产品包装出厂。试采用信号量和P、V操作编写他们同步工作的算法程序。
答案:解:对于Pi、Qj ,设置资源信号量empty1、full1用于它们的同步,互斥信号量mutex1用于它们对下标变量的互斥访问;对于Qj、Rk ,设置资源信号量empty2、full2用于它们的同步,互斥信号量mutex2用于它们对下标变量的互斥访问。同步算法描述如下:
semaphore empty1, full1, mutex1, empty2, full2, mutex2;
int in, out, i, j ;
empty1=M1; empty2=M2; mutex1=mutex2=1; full1=full2=0;
in=out=i=j=0;
parbegin
process Pi (i=1, 2, 3, ... )
{
while(1) {
生产一个产品x;
P(empty1);
P(mutex1);
buf1[in]=x;
in=(in+1) mod M1;
V(mutex1);
V(full1);(3分)
}
}
process Qj ( j=1, 2, 3, ... )
{
while (1) {
for (m=0; m<2; m++) {
P(full1);
P(mutex1);
y[m]=buf1[out];
out=(out+1) mod M1;
V(mutex1);
V(empty1);(3分)
}
把y[0]和y[1]组装成一个产品y;
P(empty2);
P(mutex2);
buf2[i]=y;
i=(i+1) mod M2;
V(mutex2);
V(full2);
}
}
process Rk ( k=1, 2, 3, ... )
{
while (1) {
for (n=0; n<3; n++) {
P(full2);
P(mutex2)
z[n]=buf2[j];
j=(j+1) mod M2;
V(mutex2);
V(empty2);
}
将z[0], z[1], z[2]包装准备出厂;(4分)
}
}
parend
答案:解:对于Pi、Qj ,设置资源信号量empty1、full1用于它们的同步,互斥信号量mutex1用于它们对下标变量的互斥访问;对于Qj、Rk ,设置资源信号量empty2、full2用于它们的同步,互斥信号量mutex2用于它们对下标变量的互斥访问。同步算法描述如下:
semaphore empty1, full1, mutex1, empty2, full2, mutex2;
int in, out, i, j ;
empty1=M1; empty2=M2; mutex1=mutex2=1; full1=full2=0;
in=out=i=j=0;
parbegin
process Pi (i=1, 2, 3, ... )
{
while(1) {
生产一个产品x;
P(empty1);
P(mutex1);
buf1[in]=x;
in=(in+1) mod M1;
V(mutex1);
V(full1);(3分)
}
}
process Qj ( j=1, 2, 3, ... )
{
while (1) {
for (m=0; m<2; m++) {
P(full1);
P(mutex1);
y[m]=buf1[out];
out=(out+1) mod M1;
V(mutex1);
V(empty1);(3分)
}
把y[0]和y[1]组装成一个产品y;
P(empty2);
P(mutex2);
buf2[i]=y;
i=(i+1) mod M2;
V(mutex2);
V(full2);
}
}
process Rk ( k=1, 2, 3, ... )
{
while (1) {
for (n=0; n<3; n++) {
P(full2);
P(mutex2)
z[n]=buf2[j];
j=(j+1) mod M2;
V(mutex2);
V(empty2);
}
将z[0], z[1], z[2]包装准备出厂;(4分)
}
}
parend