-->
当前位置:首页 > 题库

主观题:h403.有n个输入进程、m个计算进程和p个输出进程......

Luz4年前 (2022-09-13)题库470
有n个输入进程、m个计算进程和p个输出进程,通过循环缓冲区A和循环缓冲区B进行数据传送,如下图2-2所示。

已知缓冲区A有N个缓冲块,缓冲区B有M个缓冲块。输入进程每次输入1个数据块存入缓冲区A的1个缓冲块中;计算进程每次从缓冲区A取出1个数据块,处理后的数据块存入缓冲区B的1个缓冲块中;输出进程每次从缓冲区B中取出1个数据块进行输出操作。试用P、V操作实现进程间的同步与互斥。
【说明】n个输入进程和m个计算进程构成一对生产者-消费者问题;m个计算进程和p个输出进程构成另一对生产者-消费者问题。计算进程担当双重较色,即既是消费者,又是生产者。



![image.png](~/cc15c6e1-b965-4967-9719-9f987028963f.png)
【图2-2】





答案:解:
semaphore mutex1, mutex2, empty1, full1, empty2, full2;
int in1, out1, in2, out2;
mutex1=1; //互斥信号量,用于互斥访问共享变量in1和out1
mutex2=1; //互斥信号量,用于互斥访问共享变量in2和out2
empty1=N; //同步信号量,表示缓冲区A的空缓冲区个数
empty2=M; //同步信号量,表示缓冲区B的空缓冲区个数
full1=0; //同步信号量,表示缓冲区A的满缓冲区个数
full2=0; //同步信号量,表示缓冲区B的满缓冲区个数
in1=out1=in2=out2=0; //共享变量,表示缓冲区的下标变量
parbegin
process inputi ( ) //n个输入进程,i=1, 2, ... , n
{
while (1) {
读入一个数据块X;
P(empty1); //判断缓冲区A是否有空闲位置放数据块,若无则等待
P(mutex1); //互斥访问共享变量in1和缓冲区A
bufferA[in1]=X;
in1=(in1+1)%M;
V(mutex1);
V(full1); //通知计算进程,缓冲区A中已有数据(可能唤醒计算进程)
}
}
process computej ( ) //m个计算进程,j=1, 2, ... , m(3分)

{
while (1) {
P(full1); //判断缓冲区A中是否有可取的数据块,若无则等待
P(mutex1); //互斥访问out1和缓冲区A
Y=bufferA[out1];
out1=(out1+1)%M;
V(mutex1);
V(empty1); //通知输入进程,缓冲区A中已被取走一个数据块
处理数据块Y;
P(empty2); //判断缓冲区B是否有空位置存放数据块,若无则等待
P(mutex2); //互斥访问共享变量in2和缓冲区B
bufferB[in2]=处理后的数据块Y;
in2=(in2+1)%N;
V(mutex2);
V(full2); //通知输出进程,缓冲区B中已有数据(可能唤醒输出进程)(3分)
}
}
process outputk ( ) //p个输出进程,k=1, 2, ... , p
{
while (1) {
P(full2); //判断缓冲区B中是否有可取的数据块,若无则等
P(mutex2); //互斥访问共享变量out2和缓冲区B
Z=bufferB[out2];
out2=(out2+1)%N;
V(mutex2);
V(empty2); //通知计算进程,缓冲区B中已被取走一个数据块(4分)
}
}
parend