问答题 有三个进程P A ,P B 和P C 合作解决文件打印问题:P A 将文件记录从磁盘读入主存的缓冲区1,每执行一次读一个记录;P B 将缓冲区1的内容复制到缓冲区2,每执行一次复制一个记录;P C 将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录大小。请用P,V操作来保证文件的正确打印。
【正确答案】
【答案解析】在本题中,进程PA,PB,PC之间的关系为:PA与PB共用一个单缓冲区,而PB又与PC共用一个单缓冲区。当缓冲区1为空时,进程PA可将一个记录读入其中;若缓冲区1中有数据且缓冲区2为空,则进程PB可将记录从缓冲区1复制到缓冲区2中;若缓冲区2中有数据,则进程PC可以打印记录。在其他条件下,相应进程必须等待。事实上,这是一个生产者—消费者问题。
为遵循这一同步规则,应设置四个信号量empty1,empty2,full1,full2,信号量empty1及empty2分别表示缓冲区1及缓冲区2是否为空,其初值为1;信号量full1及full2分别表示缓冲区1及缓冲区2是否有记录可供处理,其初值为0。其同步描述如下:
int empty1=1;
int empty2=1;
int full1=0;
int full2=0;
main() {
cobegin
PA();
PB();
PC();
coend
}
PA() {
while(1) {
从磁盘读一个记录:
P(empty1);
将记录存入缓冲1;
V(full1);
}
}
PB() {
while(1) {
从缓冲区1中取出记录:
V(empty1);
P(empty1);
将记录存入缓冲2;
V(full2);
}
}
PC() {
while(1) {
P(full2);
从缓冲区2中取出记录;
V(empty2);
打印记录;
}
}
本题也是一个典型的生产者一消费者问题。其中的难点在于PB既是一个生产者又是一个消费者。