(二十二)操作系统-生产者·消费者问题
文章目录
- 一、问题描述
- 二、问题分析
- 三、PV操作题目分析步骤
- 1. 关系分析
- 2. 整理思路
- 3. 设置信号量
- 4. 编写代码
- 四、能否改变相邻P、V操作的顺序?
- 五、小结
- 1. PV操作题目的解题思路
- 2. 注
一、问题描述
系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)
生产者、消费者共享一个初始为空、大小为n的缓冲区。
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
缓冲区是临界资源,各进程必须互斥地访问。
二、问题分析
信号量机制可实现互斥、同步、对一类系统资源的申请和释放。
- 互斥:设置初值为1的互斥信号量。
- 同步:设置初值为0的同步信号量(实现“一前一后”)。
- 设置一个信号量,初始值即为资源的数量(本质上也属于“同步问题”,若无空闲资源,则申请资源的进程需要等待别的进程释放资源后才能继续往下执行)。
三、PV操作题目分析步骤
1. 关系分析
找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
- 同步关系。缓冲区满时,生产者要等待消费者取走产品。
- 同步关系。缓冲区空时(即没有产品时),消费者要等待生产者放入产品。
- 互斥的访问。
2. 整理思路
根据各进程的操作流程确定P、V操作的大致顺序。
- 生产者母次要消耗(P)一个空困缓冲区,并生产(V)一个产品。
- 消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V)。往缓冲区放入/取走产品需要互斥。
3. 设置信号量
设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
4. 编写代码
semaphore mutex = 1; //互斥信号量,实现对缓冲区的互斥访问
semaphore empty =n; //同步信号量,表示空闲缓冲区的数量
semaphore full = 0; //同步信号量,表示产品的数量,也即非空缓冲区的数量//生产者
producer (){while(1){生产一个产品;P(empty); //消耗一个空闲缓冲区
//实现互斥是在同一进程中进行一对PV操作:P(mutex);把产品放入缓冲区;v(mutex);V(full); //增加一个产品}
}//消费者
consumer (){while(1){P(full); //消耗一个产品(非空缓冲区)P (mutex); //从缓冲区取出一个产品;v(mutex);v(empty); //增加一个空闲缓冲区使用产品;}
}//实现两进程的同步关系,是在其中个进程中执行P,另一进程中执行V
四、能否改变相邻P、V操作的顺序?
producer (){while(1){生产一个产品;P (mutex); //① //mutex的P操作在前P(empty); //②把产品放入缓冲区;v (mutex);v (full);)
)consumer () {while(1){P (mutex); //③P(full); //④从缓冲区取出一个产品;v(mutex);v(empty);使用产品;}
}
若此时缓冲区内已经放满产品,则empty=o,full=n。
则生产者进程执行①使mutex变为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞。由于生产者阻塞,因此切换回消费者进程。消费者进程执行③,由于mutex为0,即生产者还没释放对临界资源的“锁”,因此消费者也被阻塞。
这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。
同样的,若缓冲区中没有产品,即full=0,empty=n。按③④①的顺序执行就会发生死锁。
因此,实现互斥的P操作一定要在实现同步的P操作之后。
V操作不会导致进程阻塞,因此两个V操作顺序可以交换。
五、小结
1. PV操作题目的解题思路
- 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
- 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
- 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
2. 注
生产者消费者问题是一个互斥、同步的综合问题。
有时候是消费者需要等待生产者生产,有时候是生产者要等待消费者消费,这是两个不同的“一前一后问题”,因此也需要设置两个同步信号量。
(二十二)操作系统-生产者·消费者问题相关推荐
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- GUI的演化和python编程——Python学习笔记之二十二
GUI的演化和python编程--Python学习笔记之二十二 写完了有关长寿的两篇博文,本该去完成哥德尔那个命题六的.对计算机图形界面的好奇,让我把注意力暂时离开那个高度抽象难读的哥德尔,给转到计算 ...
- 【C语言】二十二步了解函数栈帧(压栈、传参、返回、弹栈)
阅读本文需要掌握的知识 熟练使用--c语言函数 进入正题前 首先我们为什么要学习函数的栈帧? 简单回答就是:增加内功 学习函数调用的底层代码,了解函数如何传参.如何返回 这样对于函数的使用有很大的帮助 ...
- 读后感: 波、波、波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二)
波.波.波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二) http://blog.csdn.net/david_lv/archive/2008/06/26/2589809.aspx ...
- 2021年大数据Hadoop(二十二):MapReduce的自定义分组
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...
- 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........
4月18日,中国科学院官方微博发布消息,披露了这篇论文为<人机交互式机器翻译方法研究与实现>,作者是2017年毕业于中国科学院大学的工学博士黄国平. 这篇论文中情感真挚的<致谢> ...
- iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)
iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...
- 实验二十二 SCVMM中的SQL Server配置文件
实验二十二 SCVMM中的SQL Server配置文件 在VMM 2012中管理员可以使用 SQL Server 配置文件,在部署完成虚拟机之后,实现 SQL Server 数据库服务自动化部署并交付 ...
- 插入DLL和挂接API——Windows核心编程学习手札之二十二
插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...
- OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...
最新文章
- 基于OpenCV提取特定区域
- php和python交互-浅析PHP与Python进行数据交互
- Jar包反编译后修改源码再编译
- 用react-service做状态管理,适用于react、react native
- 怎么修改存储路径_Power Query数据位置变了?利用参数轻松解决源文件路径问题...
- 四年,如何从前端小白蜕变为前端技术专家?
- 15.10.4 捕获异常
- Android入门之基本布局
- ES6公用立体轮播组件的封装及使用
- 利用redis实现分布式锁
- linux常用命令 java,Java工程在Linux常用命令
- leetcode107. 二叉树的层次遍历 II
- amazeui学习笔记--css(基本样式2)--基础设置Base
- dir函数python_Python dir()函数
- svn在checkout数据仓库aaa时,出现如下错误:
- 使用exrex第三方模块,制作私人订制的高精度密码字典,保存至txt
- Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog
- [视频]AI 机器学习 深度学习 视频教程汇总
- PhotoShop等比缩放图片
- 磨刀不误砍柴工——实验工具准备
热门文章
- 精确实现popover效果:内容超出容器则tooltips+popover展示,反之无效果
- c语言中什么是指针初始化,C语言中的“char指针初始化”是什么意思?
- (翻译)现状偏好(Status-Quo Bias)
- 未来的你才是时间的新欢
- 基于Python中tkinter做的可视化简易计算器(代码有注释,利于理解)
- “大师兄”社区(http://www.daxixiong.com/)欢迎你!!!
- HTML5画布和kineticjs火灾事件,看到一个比较好玩的代码!
- 利用代码修改layout_marginBottom的属性
- 学会这个视频压缩技巧,实现顺利发送大视频
- 如何测试TCP端口通不通(四种方法)