本文是对网上答复做的补充和修改,变动很大,对很多内容是持有相反观点的,并对一些内容进行了解释,这样使整个过更加清晰些,不为奖励,只为和我一样在理解很浅时的同学解惑。字可能很多,但我希望你读完,尤其是你一头雾水时。

生产者

While(true){

​生产一件产品;

​P(full);

​P(mutex);

​放入一件产品;

​V(mutex);

​V(empty);

}

消费者

While(true){

​P(empty);

​P(mutex);

​取出一件产品;

​消费一件产品;

​V(mutex);

​V(full);

}

假设一种情况(缓冲区满的情况),则:full=5,empty=0,mutex=1

在生产者—消费者问题中,如果将两个P操作,即P(full)和P(mutex)互换位置,或者P(empty)和P(mutex)互换位置,都可能引起死锁。

考虑系统中缓冲区全满时,若一生产者进程先执行了P(mutex)操作并获得成功,当消费者执行完P(empty)操作接着执行P(mutex)时,它(消费者)将因失败而进入阻塞状态

(虽然empty本身初值就为0,但是在缓冲区满时,empty就应该变为满但是对缓冲区的操作就是对临界资源的操作,是互斥的,这时生产者还在因为缓冲区满生产东西了东西而放不入缓冲区 ,阻塞在p(full)操作。导致无法V(mutex)这是一个消费者跟生产者互斥操作临界资源阶段,有些同学可能会理解错  “这里说的跟那位答题者不太一样,我认为他把缓冲区满的条件加上了,但没改消费客可同步消费的数量”)

,它(消费者)期待生产者执行V(mutex)来唤醒自己。但是在此之前,(生产者)它不可能执行V(mutex)操作,从而使企图通过P(mutex)进入自己的临界区的其他生产者和所有的消费者进程全部进入阻塞状态

消费者一直在等待V(mutex)的唤醒/释放,生产者因为缓冲区满而一直等待消费者取走物品),从而引起系统死锁。

通俗的话来讲:生产者卡在放不进去东西,消费者因为生产者放不进去东西,也就是对临界资源的操作一直无法完成而互斥,导致所有消费者,和其他生产者卡在P(mutex)无法对临界资源操作。

类似地,消费者两个P操作互换。在缓冲区为空时,消费者进程先执行P(mutex),然后会卡在P(empty),生产者后执行P(mutex)时会因为对临界资源操作的互斥而卡住。也成了死锁。

V(full)和V(mutex)互换位置,或者V(empty)和V(mutcx)互换位置,则不会引起死锁,其影响只是使临界资源的释放略为推迟一些。

有关网上关于(在生产者和消费者问题中,如果将P操作位置互换,会产生什么结果)问题的答题者的答复网址如下(可以和本文对比来看)

https://zhidao.baidu.com/question/277301144.html?qbl=relate_question_1&word=%B2%D9%D7%F7%CF%B5%CD%B3%B6%E0%C9%FA%B2%FA%D5%DF%B6%E0%CF%FB%B7%D1%D5%DFP%28S1%29%2C%20P%28M%29%20%C4%DC%BB%A5%BB%BB%C2%F0%3F&hideOtherAnswer=true&newAnswer=1

(侵删)

操作系统中多生产者多消费者问题中,关于生产者或消费者中的两个P操作是否可以互换问题相关推荐

  1. 2.3.6 操作系统之进程同步与互斥经典问题(生产者-消费者问题、多生产者-多消费者问题、吸烟者问题、读者-写者问题、哲学家进餐问题)

    文章目录 0.前言 1.生产者-消费者问题 (1)问题描述 (2)问题分析 (3)如何实现? (4)实现互斥的P操作一定要在实现同步的P操作之后 (5)知识回顾与重要考点 2.多生产者-多消费者问题 ...

  2. 操作系统自学(十三)生产者消费者问题以及多生产者多消费者问题

    生产者消费者问题 系统中有一组生产者进程和消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品使用 (产品为某种数据) 生产者消费者共享一个初始为空 大小为n的缓冲区 ...

  3. 操作系统之进程管理:12、生产者消费者问题和多级生产者多级消费者问题

    12.生产者消费者问题和多级生产者多级消费者问题 生产者消费者问题 1.问题描述 2.解题思路 3.解题过程 4.问题 多级生产者多级消费者问题 1.问题描述 2.解题思路 3.解题过程: 4.问题 ...

  4. java多线程 生产者消费者_java多线程之-生产者与消费者

    java多线程之-并发协作[生产者与消费者]模型 对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的.也就是可以说多线程的并发协作 对于此模型 ...

  5. java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例

    /**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者.消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里 ...

  6. kafka消费者如何读同一生产者消息_Kafka入门之生产者消费者

    一.Kafka安装与使用 ( kafka介绍     ) 1. 下载Kafka 2. 安装 Kafka是使用scala编写的运行与jvm虚拟机上的程序,虽然也可以在windows上使用,但是kafka ...

  7. kafka消费者如何读同一生产者消息_Kafka系列3:深入理解Kafka消费者

    上面两篇聊了Kafka概况和Kafka生产者,包含了Kafka的基本概念.设计原理.设计核心以及生产者的核心原理.本篇单独聊聊Kafka的消费者,包括如下内容:消费者和消费者组 如何创建消费者 如何消 ...

  8. 【SpringCloudAlibaba学习 04】整合Dubbo(实现数据消费者服务调用数据生产者服务)

    文章目录 引言 1.[数据生产者工程]创建service-api子工程 1.1.[数据生产者服务]创建user-service-api服务 目录结构 UserService服务接口 UserServi ...

  9. RabbitMQ:消费者ACK机制、生产者消息确认

    文章目录 基础案例环境搭建: 环境: 1. 生产者发送消息确认 1.1 confirm 确认模式 1.2 return 退回模式 源代码 1.1.3 小结 2. 消费者签收消息(ACK) 2.1 代码 ...

最新文章

  1. pytorch笔记:09)Attention机制
  2. 职工信息管理软件c语言大一,职工信息管理(C语言
  3. 成功解决pandas\core\frame.py:2754: SettingWithCopyWarning: A value is trying to be set on a copy of a s
  4. Hibernate的常用API
  5. Java 中判断连接Oracle数据库连接成功
  6. 浅谈Spring IOC
  7. 【BZOJ3110】【codevs1616】K大数查询,权值线段树套普通线段树
  8. 如何将 png 图片转换为 eps ?
  9. wordpress and theme
  10. python连续写入数据之间用什么隔开_elasticsearch之使用Python批量写入数据
  11. 计算机基础知识2019题库,2019年计算机基础考试题库(含答案)全
  12. QQ连连看外挂源代码
  13. numpy结构化数组
  14. 杀猪盘、仙人跳…手法过于大开眼界!“反欺诈AI大赛来了
  15. 高仿闪电报销app查看图片效果的实现
  16. 无线传感器实验-低功率无线信道建模
  17. 教你用html和css仿制小米官网页面!
  18. 好记性不如烂笔头——C++篇
  19. kettle mysql连接超时_kettle 数据库连接中断重置
  20. scatter_matrixdf.plotsns.boxplot

热门文章

  1. 网络工程师的python之路pdf_网络工程师的Python之路:网络运维自动化实战
  2. 娶老婆的15条金科玉律
  3. Spring学习(二)—— 对象创建方式及依赖注入
  4. for循环的auto用法
  5. azure java sdk_使用 Azure SDK for Java
  6. mysql cmd全屏,不能全屏这个问题 ,看完了下面所有解决方法 一个一个试了怎么我是不能全屏呢...
  7. selenium模拟鼠标键盘(一)
  8. 服务器的备份文件在哪里找,云服务器系统如何备份文件在哪里看
  9. Class not found: “xxx.xxx.xxx“报错
  10. (SWAT-4)SWAT中水文响应单元划分(HRU)分析