生产者/消费者问题也叫缓存绑定问题(bounded- buffer),是一个经典的、多进程同步问题。

单生产者和单消费者

仓库容量为一的情况

问题分析:

  • 仓库有空位时,生产者才能生产产品,并放入仓库中;
  • 仓库中存在产品时,消费者才能将产品从仓库中拿出来消费。

解决方法:

这是一个典型的同步问题,定义两个信号量:
- 信号量S1:(代表仓库中空位的数量)保证生产者不向满仓库中放入产品;
- 信号量S2:(代表仓库中产品的数量)保证消费者不从空仓库中取出产品。

伪代码

S1=1
S2=0
//P进程(生产者进程)
while(true){//生产一个产品P(S1)//把产品放入缓冲区V(S2)
}
//Q进程(消费者进程)
while(true){P(S2)//从缓冲区中取出一个产品V(S1)//消费该产品
}

仓库容量为N的情况

问题分析:

  • 仓库有空位时,生产者才能生产产品,并放入仓库中;
  • 仓库中存在产品时,消费者才能将产品从仓库中拿出来消费。

解决方法:

这是一个典型的同步问题,定义两个信号量:
- 信号量S1:(代表仓库中空位的数量)保证生产者不向满仓库中放入产品;
- 信号量S2:(代表仓库中产品的数量)保证消费者不从空仓库中取出产品。

伪代码

S1=N
S2=0
//P进程(生产者进程)
i=0
while(true){//生产一个产品P(S1)//把产品放入缓冲区Buffer[i]V(S2)i=(i+1)%N
}
//Q进程(消费者进程)
j=0
while(true){P(S2)//从缓冲区Buffer[j]中取出一个产品V(S1)//消费该产品i=(i+1)%N
}

仓库容量为无穷大的情况

信号量S1:(代表仓库中空位的数量无穷大)在任何时候都有空位,因此不需要S1。

伪代码

S2=0
//P进程(生产者进程)
i=0
while(true){//生产一个产品//把产品放入缓冲区Buffer[i]V(S2)i=(i+1)
}
//Q进程(消费者进程)
j=0
while(true){P(S2)//从缓冲区Buffer[j]中取出一个产品//消费该产品j=(j+1)
}

多生产者和多消费者

设有N个缓冲区、M个生产者、K个消费者。

问题分析:

  • 仓库有空位时,生产者才能生产产品,并放入仓库中;
  • 仓库中存在产品时,消费者才能将产品从仓库中拿出来消费;
  • 在同一时间,只能有一个生产者操作缓冲区,只能有一个消费者操作缓冲区。
    生产者和消费者所操作的缓冲区数组的下标不一致,因此可以并行操作。

解决方法:

这是一个典型的同步问题,定义两个信号量:
- 信号量S1:(代表仓库中空位的数量)保证生产者不向满仓库中放入产品;
- 信号量S2:(代表仓库中产品的数量)保证消费者不从空仓库中取出产品;
- 互斥量M1:保证生产者串行地访问缓冲区;
- 互斥量M2:保证消费者串行地访问缓冲区。

伪代码

S1=N
S2=0
//P进程(生产者进程)
i=0
while(true){//生产一个产品P(S1)P(M1)//把产品放入缓冲区Buffer[i]i=(i+1)%NV(M1)V(S2)i=(i+1)
}
//Q进程(消费者进程)
j=0
while(true){P(S2)P(M1)//从缓冲区Buffer[j]中取出一个产品j=(j+1)%NV(M1)V(S1)//消费该产品
}

[操作系统]生产者/消费者问题相关推荐

  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. (二十二)操作系统-生产者·消费者问题

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

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

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

最新文章

  1. 深入浅出统计学(十)抽取样本
  2. 两位智源青年科学家榜上有名!2020青橙奖公布
  3. 网络营销专员浅析网络营销优化对企业来说意味着什么?
  4. python类型-python语言中的数据类型有哪些
  5. Java黑皮书课后题第8章:*8.10(最大的行和列)编写一个程序,在一个4*4的矩阵中随机填入0和1,打印该矩阵,分别找到第一个具有最多1的行和列
  6. 数据挖掘算法_算法篇(01) 数据挖掘算法初探
  7. java.io.StreamCorruptedException: invalid type code: AC解决办法
  8. maven aspectj_使用Spring AspectJ和Maven进行面向方面的编程
  9. springboot全局常量_Spring-Boot配置属性和环境变量的加载顺序
  10. Nginx开启stub_status模块配置方法_nginx
  11. **Dijkstra算法**
  12. Mysql权限控制 - 允许用户远程连接
  13. useState用法指南
  14. 算法:回溯和动态规划解决每次移动一步最终回到原地1269. Number of Ways to Stay in the Same Place After Some Steps
  15. 9N90-ASEMI的MOS管9N90
  16. 世纪三部曲(全9册) 读后感
  17. Tree Traversal(二叉树的遍历)
  18. 北航数理统计大作业_数学146分上岸复旦大学大数据学院统计学,备考经验分享!...
  19. MOGRT视频制作库 Premiere遮罩/转场/特效视频剪辑效果模板库预设
  20. 全新的Lync 2013为我们带来了什么?

热门文章

  1. SurfaceView 基础用法
  2. 计算机网络多媒体图像矢量图,基于矢量图的协同编著环境与协同机制的研究
  3. 域用户计算机可以访问域控制器吗,组策略设置:使普通用户登陆域控制器的电脑...
  4. selenium使用多种浏览器运行踩坑(谷歌,IE,360)
  5. 线程池详解(通俗易懂超级好)
  6. Spring cloud alibaba(二)nacos服务发现docker相同ip冲突
  7. 图解TensorFlow op:tf.strided_slice
  8. 我是如何学习PHP的
  9. 牛客网 字符串通配符
  10. rtx3080ti参数 RTX 3080Ti 评测