生产者-消费者问题(有例题!!!)

2023-05-16

文章目录

  • 前言
  • 问题描述
  • 如何实现
  • 思考:能否改变相邻P、V操作的顺序?
  • 知识回顾与重要考点

前言

此篇文章是我在B站学习时所做的笔记,大部分图片都是课件老师的PPT,方便复习用。此篇文章仅供学习参考。


提示:以下是本篇文章正文内容

问题描述

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

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

在这里插入图片描述
解释:
在刚开始,由于这个缓冲区全部是空的,所以生产者进程可以生产一些产品,把它放入到这个缓冲区当中。那一直到这个缓冲区被充满了之后,如果此时生产者进程,它还想继续生产产品,并且把它充入缓冲区的话,那这个行为很显然应该是被阻止的,因为此时缓冲区的这些数据已经被装满了,那只有这个缓冲区腾出别的空闲的空间之后,生产者进程才可以继续往里边放出去,所以在这个时候,只能切换为消费者进程来消费这些数据,也就是从缓冲区当中取走其中的一些产品或者说数据,只要缓冲区当中有一个或者大于一个的空闲的空间,那么此时就可以唤醒生产者进程,让他从阻塞态又重新回到就绪队列,当然这个唤醒并不意味着生产者进程就立即回处理机运行,它只是回到了就绪队列而已,所以接下来有可能是消费者进程继续执行那么每一次每一轮执行都会从缓冲区取走一轮,并且使用,那一直到这个缓冲区被取空了之后,如果此时消费者进程还继续尝试从缓冲区当中取走产品的话,那由于此时已经为空了,那么这个时候这个取产品的行为,应该是被阻止了,所以消费者进程应该被阻塞,而只有生产的进程再往里边放数据的时候,消费者进程才可以在重新被唤醒,又重新回到了就是就绪队列,这个缓冲区它属于一种临界资源,各个进程是必须互斥的访问的,假如说我们的这个系统当中有两个生产者竞争,那此时这两个生产者进程在检查了之后,发现缓冲区的这些位置,每个地方都是空的,那这个生产者进程他可能就往这个位置,充入了一个它自己的产品,也就是数据,而另一个生产者进程在之前的那个检查当中也发现这个缓冲区所有的地方都是空的,那么在并发的环境下,就有可能导致这个生产者进程,它同时也在检查了之后,也往这个地方充入了一个数据,所以这就导致了前者的数据背后的数据给覆盖的情况,因此我们是必须保障缓冲区是被互斥地访问的。
在这里插入图片描述
PV操作题目分析步骤:

  1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
  2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。

生产者每次要消耗(P)一个空闲缓冲区,并生产(V)一个产品。
消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V)。
[第一个P和第二个V是一对,第二个P和第一个V是一对]
往缓冲区放入/取走产品需要互斥。

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

如何实现

在这里插入图片描述

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

在这里插入图片描述

  • 若此时缓冲区内已经放满产品,则empty=0,full=n。
  • 则生产者进程执行①使mutex变为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞。由于生产者阻塞,因此切换回消费者进程。消费者进程执行③,由于mutex为0,即生产者还没释放对临界资源的“锁”,因此消费者也被阻塞。
  • 这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。
  • 同样的,若缓冲区中没有产品,即full=0,empty=n。按③④①的顺序执行就会发生死锁。

因此,实现互斥的P操作一定要在实现同步的P操作之后。 V操作不会导致进程阻塞,因此两个V操作顺序可以交换。

接下来我们再来考虑第三个问题:生产者生产产品和消费者使用产品。这两个操作,它们都是放在各自的这些pv操作之外的,那这些操作能不能放到pv操作之内呢?
在这里插入图片描述
答:其实逻辑上来看是没有问题的,我们可以让消费者从缓冲区取出一个产品之后,就立即紧接着使用产品。但这会导致临界区的这个代码量变大,那么消费者进程在访问临界区的过程当中,就需要耗费更长的时间。那如果此时有别的进程也想访问临界区的话,它是会被阻塞的,所以说如果把这些非必要的代码把它也放到临界区内的话,就显然会导致进程之间的并发度降低,所以对于这两部分的大码,我们最好不要放到pv操作之间。

知识回顾与重要考点

在这里插入图片描述
PV操作题目的解题思路:

  1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
  2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
  3. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
  • 生产者消费者问题是一个互斥、同步的综合问题。
  • 对于初学者来说最难的是发现题目中隐含的两对同步关系。
  • 有时候是消费者需要等待生产者生产,有时候是生产者要等待消费者消费,这是两个不同的“一前一后问题”,因此也需要设置两个同步信号量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生产者-消费者问题(有例题!!!) 的相关文章

  • Python | 从另一个列表的指定开始到结束索引创建一个列表

    Given a list start and end index we have to create a list from specified index of the list in Python 给定一个列表 xff0c 开始和结束索
  • EDA基础概念

    EDA基础概念 EDA和CADCAD工具EDA工具 EDA技术实现目标可编程逻辑器件简称PLD发展历程CPLD简介FPGA简介FPGA和CPLD区别是否需要同时学习FPGA和CPLDXilinx xff08 赛灵思 xff09 公司介绍 x
  • 半导体存储电路

    半导体存储电路 SR锁存器和触发器寄存器存储器存储器分类RAMSRAMDRAM ROMMROMPROMEPROMEEPROMFLASH原理发现者应用工作原理存储单元 磁盘硬盘机械硬盘 xff08 HDD xff09 固态硬盘 xff08 S
  • python编写简单的EXE启动器

    exe启动器 放假到现在一直憋在家里 xff0c 最近实在无聊 xff0c 就下了两个游戏玩 xff0c 玩的时候 xff0c 因为快捷方式放桌面感觉有点麻烦 xff0c path文件下图标有太多 xff0c 就想起了自己编写一个exe启动
  • mysql的left join和inner join的详细用法

    join用法 1 inner join xff0c 内连接 显示两个表中有联系的所有数据 2 left join xff0c 左链接 以左表为参照 显示所有数据 右表中没有则以null显示 3 right join xff0c 右链接 以右
  • 原来我的Ubuntu20.04桌面假死,按Alt+Ctrl+F1就可以恢复!

    配置 联想Y9000PUbuntu20 04双系统显卡驱动 NVIDIA Linux x86 64 525 89 02 xff08 下载自官网 xff09 浏览器 Edge 问题 双系统使用过一段时间之后 xff0c 偶尔会出现桌面假死的情
  • 如何查看python安装路径

    在使用python的时候 xff0c 有时候会需要找到python包的安装位置 xff0c 来找其他安装的第三方包 下面我们来看看 xff0c 在不同平台上 xff0c 怎么找到python的安装路径 很多运行的系统软件都是建立在pytho
  • ftp文件操作

    FTP中的文件操作 如何对ftp文件系统进行操作 文章目录 FTP中的文件操作前言一 ftp是什么 xff1f 二 使用步骤1 本地创建搭建ftp系统2 操作 总结 前言 公司中运用到了ftp小文件系统 xff0c 自己在本地学习了一下网上
  • 有向图的强联通分量(Tarjan算法)

    连通分量 在一个有向图G中的子图中V xff0c 对于任意两个点 u xff0c v u xff0c v u xff0c v 来说 xff0c 如果 u
  • 关于ResultMapException和SQLException: Invalid value for getInt()的解决方法

    mybatis中的Cause java sql SQLException Invalid value for getInt 39 xx 异常处理 org span class token punctuation span apache sp
  • Linux 终端美化

    Linux 终端美化 文章目录 Linux 终端美化1 安装zsh2 安装oh my zsh3 修改主题 4 配置 powerlevel10k5 插件安装 1 安装zsh span class token function apt span
  • vc++ 二进制文件的查找_在C ++中查找表示二进制数所需的总位数

    vc 43 43 二进制文件的查找 Problem statement 问题陈述 xff1a Find total Number of bits required to represent a number in binary 查找以二进制
  • 微信小程序 onLoad 和 onShow的区别

    onLoad 和 onShow的区别 onLoad 一个页面只会调用一次 接收页面参数 可以获取wx navigateTo和wx redirectTo及中的 query xff08 通俗点就是 你编辑好代码后 点击保存 这时候整个程序加载
  • Spring常用注解

    Spring 常用注解 Spring的一个核心功能是IOC xff0c 就是将Bean初始化加载到容器中 xff0c Bean是如何加载到容器的 xff0c 可以使用Spring注解方式或者Spring XML配置方式 Spring注解方式
  • Result Maps collection already contains value for com......Mapper.BaseResultMap问题的解决方法

    最近遇到了Result Maps collection already contains value for com klbc springboot springboot mapper StudentMapper BaseResultMap
  • RabbitMq同一队列多个消费者问题

    RabbitMQ只有Queue xff0c 如果多个消费者绑定同一个queue xff0c 那么一条消息 xff0c 只能被其中一个消费者取走 xff08 轮询 xff09 本质上 xff0c RabbitMq的消费者的消息确认机制 xff
  • python查看变量的数据类型

    首先需注意python并不区分short和long类型 xff0c python里面只有 在Python 3里 xff0c 只有一种整数类型 int xff0c 表示为长整型 内置的 type 函数可以用来查询变量所指的对象类型 gt gt
  • 使用Java通过Nginx反向代理服务器操作PostgreSQL数据库

    最近在做一个项目 xff0c 需要将Android App和服务器上的PostgreSQL进行连接 xff0c 但是Android Studio不能够直接通过JDBC进行连接 xff0c 所以选择通过Nginx作为中间服务器对Postgre
  • Linux下Java安装教程

    Windows下Java安装教程 Windows下Java安装教程 Windows下Java安装教程 一 Java安装步骤 步骤1 xff1a 下载Java并上传至服务器 usr local src目录下 https www oracle
  • 解决mariadb在导入sql备份文件因字符集问题导致的失败

    最近在windows7命令行 用 mariadb mysql 导入 用 mysqldump 备份的数据库sql 文件时出现了一些错误 xff0c 例如 xff1a ERROR at line 46 Unknown span class to

随机推荐

  • Docker容器中使用systemctl 的方法

    默认情况下 容器内不应该运行守护进程 xff0c 若想使用则需要一些操作 xff0c 详情如下 xff1a run 启动参数上 xff0c 加上 privileged 61 true xff0c 然后 xff0c 参数末尾 将 bin ba
  • IntelliJ IDEA开发工具安装教程(2022.2最新版)

    IntelliJ IDEA开发工具安装教程 xff08 2022 2最新版 xff09 下载官网网址 xff1a https www jetbrains com idea 一 下载安装 xff1a 1 xff0c 打开官网下载Intelli
  • 物联网系统和操作系统的差距_实时操作系统和分时操作系统之间的差异

    物联网系统和操作系统的差距 The types of operating systems are Time Sharing OS and Real Time operating system These can be differentia
  • 网页数据解析与爬取----Beautiful Soup

    目录 网页数据解析与爬取 Beautiful SoupBeautiful Soup 使用1 Beautiful Soup简介2 解析器3 准备工作4 节点选择器5 提取信息1 获取名称2 获取属性3 获取内容4 嵌套选择 6 关联选择1 子
  • FTP :身份验证、本地用户访问、虚拟用户访问实验

    ftp ftp文件共享 主要用于存储 xff0c 采用c s架构 xff0c 客户端可以通过登录server xff0c 去实现文件的上传 xff0c 删除的操作 ftp工作模式 主动传输模式 client使用N端口向ftp的server的
  • SQL server快捷键

    F5 选中文本调试或运行 Ctrl 43 K xff0c Ctrl 43 C xff1a 注释选定内容 Ctrl 43 K xff0c Ctrl 43 U xff1a 取消注释选定内容 Ctrl 43 K xff0c Ctrl 43 xff
  • 143-牛客网C++刷题9

    1 不定义第三个变量 xff0c 交换两个变量的数据 x 43 61 y y 61 x y x 61 y 2 常量可以是任何的基本数据类型 xff0c 可分为整型数字 浮点数字 字符 字符串和布尔值 3 在C 43 43 中 xff0c 可
  • GitHub|搭建个人静态页并绑定私有域名

    Ps xff1a 仅自学自用留档 xff0c 如有需要请自行找寻内容 xff01 使用Git在GitHub上搭建个人静态页并绑定域名 一 在GitHub创建特殊的个人仓库二 将仓库保存到本地并使用Git链接1 使用Git将仓库保存到本地文件
  • java Collection常用方法

    主要方法如下所述 然后我们来具体写一下这些方法 首先是add方法 span class token keyword public span span class token keyword static span span class to
  • java Collections基本概念和常用方法

    Collections是一个类 他在java的util包下 所以使用它是需要导包的 Collections是一个静态方法的集合类 他里面的方法都是静态的 Collections中的方法有很多 这里我们主要看三个 Collections的方法
  • 使用域控批量安装软件

    域自带的批量部署软件有多种方式 xff1a 1 xff0c 发布 xff0c 域服务器发布软件 xff0c 客户端到添加删除程序 添加新程序中点击安装 2 xff0c 分配指派到用户 xff0c 在客户端用户登录时自动安装 3 xff0c
  • XXL-JOB:com.fasterxml.jackson.databind.JsonMappingException: Unexpected character (‘o‘ (code 111))解决

    背景 项目中的xxl job admin版本为2 1 1 xff0c 一直运行的很好 xff0c 但是有一天被扫出安全漏洞 xff0c 然后 xff0c 我就把xxl job admin的springboot版本由1 5升级为2 2 1版本
  • Ubuntu部分图标缺失,包括部分系统图标

    ubuntu部分图标缺失 这里说的缺失不是指图标不会显示 xff0c 而是说图标虽然会显示 xff0c 但是显示不正确 比如显示为一个空白方块或者红色的 34 禁止 34 图标 简要列出部分缺失的图标 xff1a 文件夹图标wifi图标 x
  • python 添加图例_Python | 在图上添加图例

    python 添加图例 Adding legend is the best way to label data series plotted on a graph Matplotlib has an inbuilt defined func
  • java有哪些集合类型?集合类的特点

    Java属于入门容易 xff0c 天花板却极高的编程语言 java有哪些集合类型 对于java工程师来说技术的不断发展 需要不断学习java进阶知识 为了帮助大家巩固基础 xff0c 本文解答了java有哪些集合类型 集合类的特点是什么 x
  • MATLAB(一)基本操作与矩阵输入

    文章目录 前言一 Matlab视窗二 基本操作与矩阵输入1 把MATLAB当做计算机2 初等数学函数Exercise练习 2 嵌入函数3 特殊变量和常量4 MATLAB调用优先5 数字显示格式长Exercise练习 6 命令行终端7 部分函
  • MATLAB(六)图形界面_GUI_程式设计

    文章目录 前言MATLAB GUI Programs启动GUI程序对齐组件给按钮标上标签GUI脚本结构function untitled OpeningFcn对象的回调Set the axes for PlottingExercise练习P
  • Excel 精选28个技巧

    文章目录 前言1 一键求和2 一键插入柱形图3 单元格内强制换行4 快速移动资料5 快速生成下拉式功能表6 计算带单位的数据7 小写金额转大写8 快速输入 9 批量添加下划线10 文字随单元格大小变化11 图片随单元格大小变化12 快速提取
  • 调度算法——时间片轮转、优先级、多级反馈队列(例题详细!!!)

    文章目录 前言知识总览时间片轮转 xff08 RR Round Robin xff09 优先级调度算法多级反馈队列调度算法知识回顾与重要考点 前言 此篇文章是我在B站学习时所做的笔记 xff0c 大部分图片都是课件老师的PPT xff0c
  • 生产者-消费者问题(有例题!!!)

    文章目录 前言问题描述如何实现思考 xff1a 能否改变相邻P V操作的顺序 知识回顾与重要考点 前言 此篇文章是我在B站学习时所做的笔记 xff0c 大部分图片都是课件老师的PPT xff0c 方便复习用 此篇文章仅供学习参考 提示 xf