系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初始为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取出10件产品后,其他消费者进程才可以取产品。请使用信号量P、V(wait(),signal())操作实现进程间的互斥与同步,要求写出完整的过程,并说明所用信号量的含义和初值。
该生产者消费者问题只生产一种产品,...
用户登录可进行刷题及查看答案
该生产者消费者问题只生产一种产品,消费者只消费一种产品,只有一个缓冲区,为单生产者单消费者单缓冲区问题。
题目要求缓冲区为环形缓冲区,可类比循环队列,循环队列中区分队空和队满,有三种处理方式:
下面用P、V操作结合生产者消费者模型来和这三种方法进行对比:
P、V操作结合生产者消费者模型融合了标记法和计数法的优点,具有防止越界和缓冲队列的功能且更加简洁。
此外,题目要求消费者一次从缓冲区连续取出10件产品,由于该批量操作需要互斥进行,因此需要增加一个批量操作互斥信号量。仿C语言伪代码如下:
# define MAXSIZE 1000 semaphore empty = MAXSIZE; // 缓冲区空闲位置数量 semaphore full = 0; // 缓冲区产品数量 semaphore mutex = 1; // 缓冲区互斥信号量 semaphore batch_mutex = 1; // 批量操作互斥信号量 ElemType buffer[MAXSIZE]; // 环形缓冲区,ElemType表示产品类型 int front = 0; int rear = 0; cobegin Process Producer_i() { while(true) { 生产一件产品; P(empty); P(mutex); 将一件产品放入 buffer[rear]; rear = (rear + 1) % MAXSIZE; V(mutex); V(full); } } Process Consumer_i() { while(true) { P(batch_mutex); for (int i = 0; i < 10; i++) { P(full); P(mutex); 从 buffer[front] 取出一件产品; front = (front + 1) % MAXSIZE; V(mutex); V(empty); } V(batch_mutex); 消费一件产品; } } coend
由于生产者只访问rear指针,消费者只访问front指针,所以不需要保证生产者和消费者之间对缓冲区进行互斥访问,只需要保证生产者和生产者之间对缓冲区进行互斥访问,消费者和消费者之间对缓冲区进行互斥访问。简化后伪代码如下:
# define MAXSIZE 1000 semaphore empty = MAXSIZE; // 缓冲区空闲位置数量 semaphore full = 0; // 缓冲区产品数量 semaphore mutex1 = 1; // 用于实现生产者之间的互斥 semaphore mutex2 = 1; // 用于实现消费者之间的互斥 ElemType buffer[MAXSIZE]; // 环形缓冲区,ElemType表示产品类型 int front = 0; int rear = 0; cobegin Process Producer_i() { while(true) { 生产一件产品; P(empty); P(mutex1); 将一件产品放入 buffer[rear]; rear = (rear + 1) % MAXSIZE; V(mutex1); V(full); } } Process Consumer_i() { while(true) { P(mutex2); for (int i = 0; i < 10; i++) { P(full); 从 buffer[front] 取出一件产品; front = (front + 1) % MAXSIZE; V(empty); } V(mutex2); 消费一件产品; } } coend
登录后提交答案
暂无评论,来抢沙发