第 47 题
(8分)系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初 始为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费 者进程可以从缓冲区取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取出10件产品后,其
他消费者进程才可以取产品。请使用信号量P 、V(wait(),signal() 操作实现进程间的互斥与同步,要求 写出完整的过程,并说明所用信号量的含义和初值。
[tag_link]
这是典型的生产者和消费者问题,只对典型问题加了一个条件,只需在标准模型上新加一个信号量,即可完成指定要求。
设置四个变量 consumer_mutex、buffer_mutex、empty 和 full:consumer_mutex 用于控制一个消费者进程一个周期(10 次)内对于缓冲区的控制,初值为 1;buffer_mutex 用于进程单次互斥的访问缓冲区,初值为 1;empty 代表缓冲区的空位数,初值为 0;full 代表缓冲区的产品数,初值为 1000。
semaphore consumer_mutex = 1;
semaphore buffer_mutex = 1;
semaphore full = 0;
semaphore empty = 1000;
Consumer() {
while (1) {
P(consumer_mutex);
for (int i = 0; i < 10; i++) {
P(full);
P(buffer_mutex);
// 从缓冲区取出产品
V(buffer_mutex);
V(empty);
// 消费产品
}
V(consumer_mutex);
}
}
Producer() {
while (1) {
P(empty);
// 生产产品
P(buffer_mutex);
// 将产品放入缓冲区
V(buffer_mutex);
V(full);
}
}
【评分说明】 ①信号量的初值和含义都正确给 2 分。 ②生产者之间的互斥操作正确给 1 分;生产者与消费者之间的同步操作正确给 2 分;消费者之间互斥操作正确给 1 分。 ③控制消费者连续取产品数量正确给 2 分。 ④仅给出经典生产者 - 消费者问题的信号量定义和伪代码描述最多给 3 分。 ⑤若考生将题意理解成缓冲区至少有 10 件产品,消费者才能开始取,其他均正确,得 6 分。 ⑥部分完全正确,酌情给分。