问题描述:
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(这里的“产品”理解为某种数据)

1.整理思路
(1)生产者,消费者共享一个初始为空,大小为n的缓冲区
如图:缓冲区的大小为5
操作系统——生产者消费者问题
操作系统——生产者消费者问题
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。

(2)如果缓冲区已经满了,生产者进程依然向缓冲区里写数据,此时生产者进程必须等待,当缓冲区中有空的时候才能向缓冲区里写数据。
操作系统——生产者消费者问题
注意:缓冲区没满—>生产者才能生产

(3)只有缓冲区不空时,消费者才能从中取出产品,否则必须等待
操作系统——生产者消费者问题
注意缓冲区没空—>消费者才能消费
操作系统——生产者消费者问题
(4)另外,缓冲区是临界资源,各进程必须互斥地访问
操作系统——生产者消费者问题
2.关系分析
操作系统——生产者消费者问题
操作系统——生产者消费者问题

当生产者进程向缓冲区放入一个产品后,此时信号量需要执行一个V操作;
当消费者进程在缓冲区取走一个产品前,此时信号量需要执行一个P操作;

3.代码实现
操作系统——生产者消费者问题
实现两对同步关系:
操作系统——生产者消费者问题
因为缓冲区是临界资源,各进程必须互斥地访问,所以我们还需要设置互斥信号量
操作系统——生产者消费者问题
4.代码分析
执行V操作的进程会唤醒对应执行P操作的进程
操作系统——生产者消费者问题
思考:能否改变相邻P,V操作的顺序?
操作系统——生产者消费者问题
5.小节概述
操作系统——生产者消费者问题

相关文章: