问题:

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

条件:生产者、消费者共享一个初始化为空的、大小为n的缓冲区。

提示:

做这一题之前一定要熟练的掌握进程的互斥和进程的同步,一定要会!!一定要会!!一定要会!

        不会的话可以   点击这里!!!

题目分析:

        1.首先读题之后就容易知道,咱们现在有一个缓冲区,生产者负责生产产品,然后把产品放到缓冲区里面,生产产品的前提条件是缓冲区未满,缓冲区的大小为n。消费者负责使用产品,但是使用产品的前提条件缓冲区里面有产品。

2.下面分析一下互斥和同步的问题,因为只有一个缓冲区(生产者放产品,消费者取产品),所以这里可以把缓冲区看成临界资源(类似多个打印机进程打印那样),而且多个生产者之间不能同时往缓冲区中放产品(可能会造成覆盖),多个消费者也不可以同时在缓冲区中取产品,也不可以生产者放产品的同时,消费者取产品。

经过上面的分析,可以得出进程的互斥和进程同步的结论

 结论:

  互斥------------因为缓冲区是临界资源,各种进程必须互斥的访问(即不能同时访问)。

        同步1-----------只有缓冲区不空时,消费者才可以从缓冲区中取产品,即  “ 先生产后消费 ”。

        同步2-----------只有缓冲区不满时,生产者才可以往缓冲区中放产品,即  “ 先消费后生产”。

具体解法:

semaphore mutex=1;//互斥信号量 ,实现对缓冲区的互斥访问
semaphore full =0;//同步1信号量,表示产品的数量
semaphore empty=n;//同步2信号量,表示空闲区的数量 producer()
{while(1){生产一个产品;P(empty); P(mutex);将产品放入缓冲区;V(mutex);V(full); }
} consumer()
{while(1){P(full); P(mutex);从缓冲区取出一个产品;V(mutex);V(empty); 使用一个产品;}
}

讨论:

      1.生产者和消费者进程都有两个P操作在一块,可以把生产者的两个P操作或者消费者的两个P操作调换顺序吗?

     答案:无论是生产的的两个P操作,还是消费者的两个P操作都不可以调换顺序。假如生产的的两个P操作调换了顺序(包含了消费者换或者不换两种情况),现在有一种情况是empy=0,full=n,在这种情况下,假设消费者进程先执行,

生产一个产品------>P(mutex)占用缓冲区,这时候除非等消费者释放缓冲区,不然谁也无法使用缓冲区了

-------->P(empty)因为empty=0,所以执行block原语,将生产的进程从运行态转到阻塞态,经过这一步之后消费者进程阻塞,只能等切换进程,假如切换到消费者进程,无论P(mutex)在P(full)前还是在P(full)后,总归要执行P(mutex),但是生产者正在占用缓冲区,因此就产生了死锁。

       调换消费的的两个P操作顺序也是类似,在empty=n,full=0的情况下也不满足,如果不懂得话,自己可以按照上面的进行推导。 

2.生产者和消费者进程都有两个V操作在一块,可以把生产者的两个V操作或者消费者的两个V操作调换顺序吗?

      答案:可以

注意:如果看完分析还是不懂,再去把进程的互斥和进程的同步看一遍,一点要把这两个弄清楚。

操作系统-------用P,V操作解决生产者和消费者问题(详解!!!)相关推荐

  1. 生产者和消费者问题详解

    定义 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了 ...

  2. 图解操作系统之p,v操作

    操作系统之p,v操作 计算机的核心是CPU,它承担了所有的计算任务:而操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件. 一.操作系统的相关定义 1.操作系统的定义: ...

  3. blockingdeque java_Java BlockingDeque解决生产者与消费者问题

    BlockingDeque解决生产者与消费者问题的代码如下: import java.util.concurrent.BlockingDeque; import java.util.concurren ...

  4. 青铜10:千锤百炼-如何解决生产者与消费者经典问题

    欢迎来到<并发王者课>,本文是该系列文章中的第10篇. 在本篇文章中,我将为你介绍并发中的经典问题-生产者与消费者问题,并基于前面系列文章的知识点,通过wait.notify实现这一问题的 ...

  5. 并发王者课-青铜10:千锤百炼-如何解决生产者与消费者经典问题

    欢迎来到<并发王者课>,本文是该系列文章中的第10篇. 在本篇文章中,我将为你介绍并发中的经典问题-生产者与消费者问题,并基于前面系列文章的知识点,通过wait.notify实现这一问题的 ...

  6. 生产者消费者模型详解

    生产者消费者模型 文章目录 生产者消费者模型 什么是生产者消费者模型 基于BlockingQueue的生产者消费者模型 单生产者单消费者模型 多生产者多消费者模型 什么是生产者消费者模型 生产者消费者 ...

  7. 生产者消费者模型---详解及代码实现

    概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者 ...

  8. 生产者/消费者模型详解(基于Java)

    title: 生产者消费者模型 tags: 多线程 synchronized 锁 wait() notify() 生产者/消费者模型原理以及代码实现 一.生产者/消费者模型原理 所谓的生产者消费者模型 ...

  9. Java操作数据库方式二DBCP使用详解

    ##概述 DBCP的全称是:DataBase connection pool,翻译是:数据库连接池. 在Java操作数据库方式一JDBC使用详解中说到直接使用JDBC非常消耗资源.为了避免频繁关闭链接 ...

最新文章

  1. compser可以检查php扩展吗,composer扩展
  2. mysql的配置文件几个_mysql多实例(多个配置文件方式)
  3. python opencv 归一化
  4. node+ejs模板引擎的应用
  5. python 计时器 timeit 报错:ValueError: stmt is neither a string nor callable
  6. [MATLAB粒子模拟笔记]初始化半个时间步的位置
  7. 自动瘦脸与眼睛放大美颜算法
  8. 深度学习 - MPII Human Pose Database数据集下载
  9. 说说Java 7中的模块系统基本概念
  10. 3月27日外电头条:Windows的开源野心
  11. 2.跳转到指定的位置
  12. 忽略字母大小写情况下统计字符出现的次数
  13. java excel 2007兼容包_Office 2007兼容包官方下载_2007 Office system 兼容包免费版下载-华军软件园...
  14. python抓取豆瓣妹子图片并上传到七牛
  15. mmd动作:Fukayomi
  16. 反欺诈概念库-物联卡/物联网卡/流量卡
  17. 静态网页,动态网页,伪静态网页区别以及优缺点
  18. opc服务器不显示目录,opc客户端搜不到opc服务器
  19. Windows Sockets错误码方案
  20. android sqlite 分词,sqlite3自定义分词器

热门文章

  1. python爬取豆瓣电影并分析_Python实战之如何爬取豆瓣电影?本文教你
  2. 【嵌入式Linux】学习路径
  3. 百度地图地图及定位实现
  4. $Loj10155$ 数字转换(求树的最长链) 树形$DP$
  5. win10下启动.bat文件闪退问题
  6. UOJ#198 [CTSC2016]时空旅行
  7. 华为手机刷微博体验更好?技术角度的分析和思考,Android基础72问
  8. Acm1——拉里今年毕业了,终于找到了一份工作。
  9. 看片会员php源码,会员碎片 · THINKPHP插件 · 看云
  10. 计算机词汇店名,电脑店名字200例