生产者消费者问题

生产者消费者问题

问题描述

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。

生产者、消费者共享一个初始为空、大小为n的缓冲区。

只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。

只有缓冲区不空时,消费者才能从重取出产品。否则必须等待。

Snipaste_2020-11-04_15-07-30

问题分析

Snipaste_2020-11-04_15-10-28

如何实现

Snipaste_2020-11-04_15-11-26

思考:能否改变相邻P、V操作的顺序

Snipaste_2020-11-04_15-12-19

Snipaste_2020-11-04_14-59-45

多生产者、多消费者

问题描述

Snipaste_2020-11-04_16-26-57

问题分析

  1. 关系分析。找出题目中的各个进程,分析它们之间的同步、互斥
  2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
  3. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值

互斥关系:(mutex=1)

​ 对缓冲区(盘子)的访问要互斥地进行

同步关系:(一前一后)

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

“盘子为空”这个事件可以由儿子或女儿触发,事件发生后才允许父亲或母亲放水果

如何实现

Snipaste_2020-11-04_15-25-04

问题:可不可以用互斥信号量?

Snipaste_2020-11-04_15-26-47

结论:

​ 即使不设置专门互斥变量mutex,也不会出现多个进程同时访问盘子的现象。

原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1,因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区..

知识回顾与重要考点

解决“多生产者——多消费者问题”的关键在于理清复杂的同步关系

在分析同步问题(一前一后问题)的时候不能从单个进程行为的角度来分析,要把“一前一后”发生的事看做是两种“事件”的前后关系

比如,如果从单个进程行为的角度来考虑的话,我们会有以下结论:

​ 如果盘子里装有苹果,那么一定要女儿取走苹果后父亲或母亲才能再放入水果

​ 如果盘子里装有橘子,那么一定要儿子取走橘子后父亲或母亲才能再放入水果

​ 这么看是否就意味着要设置四个同步信号量分别实现这四个“一前一后”的关系了?

正确的分析方法就应该从“事件“的角度来考虑,我们可以把上述四对“进程行为的前后关系”抽象为一对“事件的前后关系”

盘子变空事件->放入水果事件。“盘子变空事件”既可以由儿子引发,也可由女儿引发;“放入水果事件”既可以是父亲执行,也不可以是母亲执行。这样的话,就可以用一个同步信号量解决问题了。

Snipaste_2020-11-04_16-42-05

原文地址:https://www.cnblogs.com/coderD/p/13926834.html