计算机网络
2014-47
系统中有多个生产者进程和多个消费者进程,共享一个能存放 1000 件产品的环形缓冲区(初始为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取出 10 件产品后,其他消费者进程才可以取产品。请使用信号量 P,V(或 wait(),signal())操作实现进程间的互斥与同步,要求写出完整的过程,并说明所用信号量的含义和初值。
答案
(1) 信号量的含义和初值
mutex1:用于控制一个消费者进程连续取出10件产品的互斥,初值为1。mutex2:用于进程单次互斥访问缓冲区,初值为1。empty:表示缓冲区中的空位数量,初值为1000。full:表示缓冲区中的产品数量,初值为0。
(2) 生产者进程的伪代码
producer() {
while (1) {
生产一个产品;
P(empty); // 等待空位
P(mutex2); // 互斥访问缓冲区
把产品放入缓冲区;
V(mutex2); // 释放缓冲区访问权
V(full); // 产品数加1
}
}(3) 消费者进程的伪代码
consumer() {
while (1) {
P(mutex1); // 确保连续取10次产品期间独占
for (int i = 0; i < 10; i++) {
P(full); // 等待产品
P(mutex2); // 互斥访问缓冲区
从缓冲区取出一件产品;
V(mutex2); // 释放缓冲区访问权
V(empty); // 空位数加1
消费这件产品;
}
V(mutex1); // 释放连续取产品的控制权
}
}