生产者消费者问题

生产者消费者问题

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

生产者、消费者共享一个初始为空、大小为n的缓冲区。
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待(同步问题)。
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待(同步问题)。
缓冲区是临界资源,各进程必须互斥地访问(同步问题)。

PV操作题目分析步骤:
1.关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。

2.整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
生产者每次要消耗(P)一个空闲缓冲区,并生产(V)一个产品。
消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V)。
往缓冲区放入/取走产品需要互斥。

3.设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)

semaphore mutex=1//互斥信号量,实现对缓冲区的互斥访问
semaphore empty=n;//同步信号量,表示空闲缓冲区的数量
semaphore full=0//同步信号量,表示产品的数量,也即非空缓冲区的数量

实现
生产者消费者问题

多生产者-多消费者

生产者生产的不是一类东西,消费者要消费的也不是一类东西。

桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。

1.关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。

互斥关系:
对缓冲区(盘子)的访问要互斥地进行同步关系(一前一后):

  • 父亲将苹果放入盘子后,女儿才能取苹果
  • 母亲将橘子放入盘子后,儿子才能取橘子
  • 只有盘子为空时,父亲或母亲才能放入水果

2.整理思路。根据各进程的操作流程确定P、V操作的大致顺序。

生产者消费者问题

生产者消费者问题

分析:
刚开始,儿子、女儿进程即使上处理机运行也会被阻塞。如果刚开始是父亲进程先上处理机运行,则:
父亲P(plate),可以访问盘子>母亲P(plate),阻塞等待盘子>父亲放入苹果V(apple),女儿进程被唤醒,其他进程即使运行也都会阻塞,暂时不可能访问临界资源(盘子)>女儿P(apple),访问盘子,V(plate),等待盘子的母亲进程被唤醒〉母亲进程访问盘子(其他进程暂时都无法进入临界区)>……

没有设置mutex变量,因为缓冲区为1,。若盘子的容量为2时,需要使用互斥信号量mutex。

正确的分析方法应该从“事件”的角度来考虑,我们可以把上述四对“进程行为的前后关系”抽象为一对“事件的前后关系”
盘子变空事件〉放入水果事件。“盘子变空事件”既可由儿子引发,也可由女儿引发;“放水果事件”
既可能是父亲执行,也可能是母亲执行。这样的话,就可以用一个同步信号量解决问题了