问题描述:
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(这里的“产品”理解为某种数据)
1.整理思路
(1)生产者,消费者共享一个初始为空,大小为n的缓冲区
如图:缓冲区的大小为5
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
(2)如果缓冲区已经满了,生产者进程依然向缓冲区里写数据,此时生产者进程必须等待,当缓冲区中有空的时候才能向缓冲区里写数据。
注意:缓冲区没满—>生产者才能生产
(3)只有缓冲区不空时,消费者才能从中取出产品,否则必须等待
注意缓冲区没空—>消费者才能消费
(4)另外,缓冲区是临界资源,各进程必须互斥地访问
2.关系分析
当生产者进程向缓冲区放入一个产品后,此时信号量需要执行一个V操作;
当消费者进程在缓冲区取走一个产品前,此时信号量需要执行一个P操作;
3.代码实现
实现两对同步关系:
因为缓冲区是临界资源,各进程必须互斥地访问,所以我们还需要设置互斥信号量
4.代码分析
执行V操作的进程会唤醒对应执行P操作的进程
思考:能否改变相邻P,V操作的顺序?
5.小节概述