文章目录

  • 一、问题描述
  • 二、问题分析
  • 三、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. 注

  生产者消费者问题是一个互斥、同步的综合问题。
  有时候是消费者需要等待生产者生产,有时候是生产者要等待消费者消费,这是两个不同的“一前一后问题”,因此也需要设置两个同步信号量。

(二十二)操作系统-生产者·消费者问题相关推荐

  1. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  2. GUI的演化和python编程——Python学习笔记之二十二

    GUI的演化和python编程--Python学习笔记之二十二 写完了有关长寿的两篇博文,本该去完成哥德尔那个命题六的.对计算机图形界面的好奇,让我把注意力暂时离开那个高度抽象难读的哥德尔,给转到计算 ...

  3. 【C语言】二十二步了解函数栈帧(压栈、传参、返回、弹栈)

    阅读本文需要掌握的知识 熟练使用--c语言函数 进入正题前 首先我们为什么要学习函数的栈帧? 简单回答就是:增加内功 学习函数调用的底层代码,了解函数如何传参.如何返回 这样对于函数的使用有很大的帮助 ...

  4. 读后感: 波、波、波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二)

    波.波.波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二) http://blog.csdn.net/david_lv/archive/2008/06/26/2589809.aspx ...

  5. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  6. 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........

    4月18日,中国科学院官方微博发布消息,披露了这篇论文为<人机交互式机器翻译方法研究与实现>,作者是2017年毕业于中国科学院大学的工学博士黄国平. 这篇论文中情感真挚的<致谢> ...

  7. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)

    iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...

  8. 实验二十二 SCVMM中的SQL Server配置文件

    实验二十二 SCVMM中的SQL Server配置文件 在VMM 2012中管理员可以使用 SQL Server 配置文件,在部署完成虚拟机之后,实现 SQL Server 数据库服务自动化部署并交付 ...

  9. 插入DLL和挂接API——Windows核心编程学习手札之二十二

    插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...

  10. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

最新文章

  1. 基于OpenCV提取特定区域
  2. php和python交互-浅析PHP与Python进行数据交互
  3. Jar包反编译后修改源码再编译
  4. 用react-service做状态管理,适用于react、react native
  5. 怎么修改存储路径_Power Query数据位置变了?利用参数轻松解决源文件路径问题...
  6. 四年,如何从前端小白蜕变为前端技术专家?
  7. 15.10.4 捕获异常
  8. Android入门之基本布局
  9. ES6公用立体轮播组件的封装及使用
  10. 利用redis实现分布式锁
  11. linux常用命令 java,Java工程在Linux常用命令
  12. leetcode107. 二叉树的层次遍历 II
  13. amazeui学习笔记--css(基本样式2)--基础设置Base
  14. dir函数python_Python dir()函数
  15. svn在checkout数据仓库aaa时,出现如下错误:
  16. 使用exrex第三方模块,制作私人订制的高精度密码字典,保存至txt
  17. Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog
  18. [视频]AI 机器学习 深度学习 视频教程汇总
  19. PhotoShop等比缩放图片
  20. 磨刀不误砍柴工——实验工具准备

热门文章

  1. 精确实现popover效果:内容超出容器则tooltips+popover展示,反之无效果
  2. c语言中什么是指针初始化,C语言中的“char指针初始化”是什么意思?
  3. (翻译)现状偏好(Status-Quo Bias)
  4. 未来的你才是时间的新欢
  5. 基于Python中tkinter做的可视化简易计算器(代码有注释,利于理解)
  6. “大师兄”社区(http://www.daxixiong.com/)欢迎你!!!
  7. HTML5画布和kineticjs火灾事件,看到一个比较好玩的代码!
  8. 利用代码修改layout_marginBottom的属性
  9. 学会这个视频压缩技巧,实现顺利发送大视频
  10. 如何测试TCP端口通不通(四种方法)