什么是生产者消费者问题?

系统中有一组生产者进程和一组消费者进程。生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个进程并使用,那么他们之间具有这样一层关系
生产者、消费者共享一个初始为空、大小为n的缓冲区。
只有缓冲区没满时,生产者才能把产品放入缓冲区。否则必须等待 (缓冲区没满->生产者生产)
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待 (缓冲区不空->消费者消费)
缓冲区是临界资源,各进程访问时要求互斥 (互斥访问)

对生产者消费者问题进行分析

由上面的描述可知:要执行生产者生产操作的前提条件是缓冲区没满,而执行消费者消费的前提条件是缓冲区不空。上一篇文章我们说过如何用信息量机制来实现进程的同步,还不熟悉的小伙伴可以参考一下这篇文章如何用信息量机制实现进程互斥、进程同步和前驱关系
在前操作之后对相应的同步信息量执行V操作
在后操作之前对相应的同步信息量执行P操作
所以他们之间是这样的关系

代码可以这么来写

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

生产者生产

producer (){while(1){生产一个产品;
P(empty);
P(mutex);
把产品放入缓冲区;
V(mutex);
V(full);
} }

P(mutex)V(mutex)实现进程的互斥访问,P(empty)实现让缓冲区没满作为生产者生产的前操作,即当empty==0时即无空闲缓冲区数量时,让消费者消费作为生产者生产的前操作
V(full)实现让缓冲区不空作为消费者消费的前操作,即当full==0时即缓冲区全为空时,让生产者生产作为消费者消费的前操作
消费者消费

consumer (){while(1){P(full);
P(mutex);
从缓冲区取出一个产品;
V(mutex);
V(empty);
使用产品; }

P(mutex)V(mutex)实现进程的互斥访问,V(empty)实现让缓冲区没满作为生产者生产的前操作,即当empty==0时即无空闲缓冲区数量时,让消费者消费作为生产者生产的前操作
P(full)实现让缓冲区不空作为消费者消费的前操作,即当full==0时即缓冲区全为空时,让生产者生产作为消费者消费的前操作

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

如果将上述的代码改为这样会产生怎样的影响呢?

producer (){while(1){生产一个产品;
P(mutex);// ①
P(empty);// ② 把产品放入缓冲区;
V(mutex);
V(full);
} }
consumer (){while(1){P(mutex);// ③
P(full);// ④ 从缓冲区取出一个产品;
V(mutex);
V(empty);
使用产品; } }

若此时缓冲区内已经放满产品,则empty=0,full=n。
则生产者在执行①操作时使mutex变为0,再执行②,由于已经没有空闲缓冲区了所以生产者会被堵塞,并且在消费者进程执行时,执行到③操作时,由于mutex为0,也会被堵塞。
这就导致了生产者在等待消费者是否空闲缓冲区,而消费者等待生产者释放临界资源的情况,生产者和消费者就这样循环等待被对方唤醒,出现了“死锁”的情况。
同样的,在缓冲区全为空的情况下,即empty=n,full=0时,按③④①的顺序执行也会发生“死锁”。
因此,统一一下:实现进程互斥的P操作要在实现进程同步的P操作之后
V操作不会导致进程堵塞,因此V操作的顺序可以调换

总结
对于生产者消费者问题的要求做一下总结
1、生产者、消费者共享一个初始值为空,大小为n的缓冲区 刚开始空闲缓冲区的数量为n,非空闲缓冲区的数量为0
2、只有缓冲区没满时,生产者才能把产品放入缓冲区。否则必须等待 同步关系,缓冲区满时,生产者要等待消费者取走产品
3、只有缓冲区不空时,消费者才能从中取出产品,否则必须等待 同步关系,缓冲区为空时,消费者要等待生产者生产
4、缓冲区是临界资源,各进程访问时要求互斥 互斥

多生产者-多消费者问题

举个例子来说明多生产者-多消费者问题
桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。

对于解决这种问题,我们需要进行以下步骤:
1、关系分析,找出题目中描述的各个进程,分析他们之间的同步、互斥关系
2、整理思路。根据各进程的操作流程确定P、V操作的大致顺序
3、设置信号量,设置所需要的信号量并且根据题目要求设置信号量的初值

对于上述题目我们所确立的关系为:
互斥关系:(mutex = 1)
对缓冲区(盘子)的访问要互斥地进行
同步关系:(一前一后)
1、父亲将

《操作系统》-生产者消费者问题相关推荐

  1. 操作系统生产者消费者问题实验报告

    操作系统实验报告 进程通信 1. 问题描述及需求分析: 问题描述 本次实验实现生产者和消费者之间的通信,即生产者-消费者问题.生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素. ...

  2. 操作系统 —— 生产者消费者模型

    文章目录 1. 生产者消费者模型的理解 1.1 串行的概念 1.2 并行的概念 1.3 简单总结: 2. 基于阻塞队列(block queue)实现此模型 2.1 阻塞队列的实现 2.2 使用阻塞队列 ...

  3. 三、操作系统——生产者-消费者问题(两个同步一个互斥)

    一.问题描述 信号量机制实现进程互斥的步骤: 设置初值为1的互斥信号量 在访问临界区之间进行P操作 在访问完临界区之后进行V操作 信号量机制实现进程同步的步骤: 设置初值为0的同步信号量 在前操作之后 ...

  4. 操作系统——生产者-消费者问题

    一.简单生产者-消费者问题 问题描述:一组生产者进程和一组消费者进程共享一个初始为空.大小为 n 的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待:只有缓冲区不为空时,消费者才能 ...

  5. 操作系统 - - 生产者—消费者问题(PV操作)代码显示

    生产者 - 消费者问题 假设在生产者和消费者之间的公用缓冲池具有n个缓冲区,可利用互斥信号量mutex实现诸进程的互斥使用:利用信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量. 又 ...

  6. 操作系统——生产者消费者模型以及信号量

    生产者--消费者问题是 多个进程因共享一个缓存区而产生的相互依赖问题 .具体来说,生产者进程往往要往共享缓存区中放内容.消费者进程从共享缓存中取内容, 当缓存区满的时候 ,生产者进程需要等待消费者进程 ...

  7. 操作系统 — 生产者消费者模型

    生产者消费者模型 所谓的生产者消费者模型就是一个类似于队列一样的东西串起来,这个队列可以想像成一个存放产品的"仓库",生产者只需要关心这个 "仓库",并不需要关 ...

  8. [操作系统]生产者/消费者问题

    生产者/消费者问题也叫缓存绑定问题(bounded- buffer),是一个经典的.多进程同步问题. 单生产者和单消费者 仓库容量为一的情况 问题分析: 仓库有空位时,生产者才能生产产品,并放入仓库中 ...

  9. (二十二)操作系统-生产者·消费者问题

    文章目录 一.问题描述 二.问题分析 三.PV操作题目分析步骤 1. 关系分析 2. 整理思路 3. 设置信号量 4. 编写代码 四.能否改变相邻P.V操作的顺序? 五.小结 1. PV操作题目的解题 ...

  10. 操作系统—生产者消费者

    问题描述及需求分析 实现生产者和消费者之间的通信,即生产者-消费者问题.生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素.要求实现生产者与消费者之间的同步,即当缓冲池为空时,消 ...

最新文章

  1. “九头虫”病毒技术分析报告
  2. 超效率dea模型_【探索】基于超效率DEA模型的我国公立医院排行榜研究
  3. Session——servlet
  4. java ee 分页_【JavaEE】JavaEE分页实践
  5. Go 单元测试--Mock接口实现和对接口打桩
  6. ado.net mysql 下载_ADO.Net连接Mysql
  7. ONE-ReactNative
  8. iis html执行脚本,HTML_IIS管理脚本之adsutil.vbs的使用说明,Adsutil.vbs是什么?它是Windows 200 - phpStudy...
  9. 数据结构与算法python—10.二叉树题目leetcode总结
  10. 计算流体动力学软件和服务市场现状研究分析-
  11. FLASH连连看算法分析及源代码
  12. 自助装机配置专家点评
  13. VC、PE和天使投资的解释与区别?
  14. iphone8进入恢复模式或DFU模式
  15. Logstash:日志解析的 Grok 模式示例
  16. ftp、sftp利用bat脚本自动下载以及上传文件
  17. Docker镜像瘦身与优化
  18. java MP4 解析 第一步 解析ftyp box
  19. 如何恢复 Linux 上删除的文件
  20. 山东大学数字图像处理实验(六)

热门文章

  1. 手写图片缓存框架 ImageLoader
  2. 搞模具的想转行学计算机,为什么很少人去做模具设计学徒,看看这里你就明白了!...
  3. Kronecker克罗内克 R代码实现
  4. 2012意大利之行3:罗马的路和车
  5. 攻防世界 upload1 解题思路
  6. 计算机用word做海报,用Word设计制作广告海报实验.doc
  7. 神经网络:训练模型+转化为k210上跑的kmodel
  8. 新闻字幕条制作,一款不错的ae字幕模板
  9. 华为g9青春版连接计算机,华为G9青春版 移动4G(VNS-TL00)一键救砖教程,轻松刷回官方系统...
  10. Android与GNU体系