校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > 专业课 > 进程同步
题目

系统中有多个生产者进程和消费者进程,共享用一个可以存 1000 个产品的缓冲区(初始为空),当缓冲区为未满时,生产者进程可以放入一件其生产的产品,否则等待;当缓冲区为未空时, 消费者进程可以取走一件产品, 否则等待。 要求一个消费者进程从缓冲区连续取出 10件产品后,其他消费者进程才可以取产品,请用信号量 P, V( wait , signed )操作实现进程间的互斥和同步,要求写出完整的过程;并指出所用信号量的含义和初值。

解答

本题是一个生产者-消费者的变型,本题是多个生产者-多个消费者类型,生产者和消费者之间并不互斥访问缓冲区,但生产者和生产者之间, 消费者和消费者之间要互斥访问缓冲区,并且本题的消费者一次需要取走 10 件产品,如果没有它会等待,而不是等到有了 10件产品后, 才进行取走操作。

本题的缓冲区B 可描述为

buffer aray [1000];

(1)生产者之间设互斥信号量 mutex1, 消费者之间设互斥信号量 metex2。

(2)上述进程的同步问题,需设置 3 个信号量,其中 empty 对应空闲的缓冲单元,初值为1000; full 对应缓冲区中待取走的产品数,初值为 0;另外,还需定义 2 个整型变量 in、 out,分别用来指示下一个可存放产品的缓冲单元、下一个取走的缓冲单元,它们的初值均为 0。

过程如下:

buffer array [1000]; //存放产品的缓冲区 
buffer nextp; //用于临时存放生产者生产的产品
buffer nextc [10]; //用于临时存放消费者取出的产品
semaphore empty = 1000; //空缓冲区的数目
semaphore full = 0; //满缓冲区的数目
semaphore mutex1 = 1; //用于生产者之间的互斥
semaphore mutex2 = 1; //用于消费者之间的互斥
int in = 0; //指示生产者的存位置
int out = 0; //指示消费者的取位置
Producer() //生产者进程
{
Produce an item put in nextp; //生产一个产品,存在临时缓冲区
P(empty); //申请一个空缓冲区
P(mutex1); //生产者申请使用缓冲区
array[in]=nextp; //将产品存入缓冲区
in = (in+1)%1000; //指针后移
V(mutex1); //生产者缓冲区使用完毕,释放互斥信号量
V(full);} //增加一个满缓冲区
}
Consumer() //消费者进程
{
P(mutex2); //消费者申请使用缓冲区
for(int i = 0;i<10;i++) //一个消费者进程需从缓冲区连续取走 10 件产品
{
P(full); //申请一个满缓冲区
nextc[i] = array[out]; //将产品取出,存于临时缓冲区
out = (out+1)%1000; //指针后移
V(empty); //增加一个空缓冲区
}
V(mutex2); //消费者缓冲区使用完毕,释放互斥信号量
Consume the items in nextc; //消费掉这 10 个产品
}


C 0条回复 评论

帖子还没人回复快来抢沙发