1.系统中有多个生产者进程和多个消费者进程,共享一个能存放500件产品的环形缓冲区(开始时为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待。当一个消费者进程获得取出产品的机会时,必须连续取出5件产品后,其他消费者才可以取产品。请回答以下问题:
(1)说明问题中进程间的同步与互斥关系。
(2)说明信号量的设置、初值及含义。
(3)写出该问题的同步算法。
解:
(1)多个生产者之间访问环形缓冲区是互斥关系,多个消费者之间访问缓冲器也是互斥关系;生产者生产产品放入缓冲区后供消费者取走构成同步关系 。
(2)见问题三解答
(3)
//定义信号量,其中full表示当前缓冲区中产品数量,empty表示当前缓冲区空单元的数量,buffer_mutex表示用于实现对于缓冲区的互斥访问,consumer_mutex用于实现消费者之间的互斥
semaphore full = 0, empty = 500, buffer_mutex = 1, consumer_mutex = 1;
//定义两个用来计数的变量,信号量不能用来做加减运算操作
int in = 0, out = 0;
//定义缓冲区
item buffer[500];
void consumer_i(){
while(true){
//利用consumer_mutex实现必须一次取走5个后才能切换消费者
wait(consumer_mutex);
//进行取5个产品操作
for(int i = 0; i < 5; i++){
wait(full);
wait(buffer_mutex);//取产品和放产品互斥,用buffer_mutex
nextc = buffer[out];//得到产品nextc
out = (out + 1) % 500;//注意这里的模运算
signal(buffer_mutex);
signal(empty);
}
signal(consumer_mutex);
}
}
void producer_i(){
while(true){
wait(empty);
wait(buffer_mutex);
//生产一个产品nextp;
buffer[in] = nextp;//把产品放入缓冲区
in = (in + 1) % 500;
signal(buffer_mutex);
signal(full);
}
}
void main(){
cobegin
consumer_i();
producer_i();
coend
}