生产者/消费者问题也叫缓存绑定问题(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. 记第一次线下AWD感受及复现
  2. .NET6之MiniAPI(十七):缓存
  3. kali linux 2.0 ssh,Kali 2.0使用SSH进行远程登录(示例代码)
  4. Leetcode--123. 买卖股票的最佳时间Ⅲ
  5. 如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(3)
  6. 观星(【CCF】NOI Online能力测试3 入门组)
  7. 仅需10道题轻松掌握Python字符串方法 | Python技能树征题
  8. 《西河大鼓——调寇》(艳桂荣音配像)
  9. ununtu16.04+python3+selenium+firefox环境搭建
  10. windows域环境搭建上
  11. 图论,回路,旅行商、邮递员问题。
  12. [影评]《大话西游》之:你看,那人好像一只狗耶(外一篇:我们都是那只流泪的猴子。)
  13. 查看Eclipse的工作路径
  14. 算法题目打卡:Ques20201004
  15. 进制怎么用计算机算,Win10计算器怎么算二进制,win10计算器二进制使用教程
  16. 【国际禁毒日】和TcaplusDB一起向毒品say NO!
  17. MySQL(六)——存储过程和存储函数
  18. 输入每月本金,年利率,月份求复利值
  19. pdf怎么拆分成一页一页的?办公常备工具说明
  20. leetcode系列-121. 买卖股票的最佳时机

热门文章

  1. 手把手教你用C++ 写ACM自动刷题神器(冲入HDU首页)
  2. Genymotion 超详细安装教程图解
  3. 亚马逊CTO:2022技术预测
  4. php数组批量赋值_PHP数组赋值方法详解
  5. 主板、中小板、创业板、新三板的区别是什么?企业选择上市板块时的参考依据是什么?...
  6. java reverse 怎么实现,java实现reverse字符串
  7. oracle18c服务启动,Oracle数据库之oracle 18c centos7 设置开机自动启动Oracle
  8. openwrt无线配置文件字段解析
  9. jmeter UDV
  10. 百度云会员免费领取,2T超大空间!