多生产者-多消费者问题-第三十一天

目录

多生产者-多消费者问题

可不可以不使用互斥信号量? 

当缓冲区的大小为2呢?

结论


多生产者-多消费者问题

多个不同类别的消费者和生产者,他们生产的和要消费的产品使不一样的

1、分析关系:找出题目中描述的各个进程,分析它们之间的同步、互斥关系

互斥关系:对缓冲区(盘子)的访问要互斥地进行

同步关系:

  1. 父亲将苹果放入盘子后(前操作),女儿才能取苹果(后操作)
  2. 母亲将橘子放入盘子后(前操作),儿子才能取橘子(后操作)
  3. 只有盘子为空时(孩子们的前操作),父亲或母亲才能放入水果(父母们的后操作)
  4. ”盘子为空“事件可由儿子或女儿触发,事件发生后才允许父亲或母亲放水果

2、整理思路: 根据各进程地操作流程确定P、V操作的大致顺序

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

1、plate信号量:开始时父母进程就可以向盘子中放一个水果,所以plate的初始值可以为1

2、apple与orange信号量:开始时孩子们并未获得父母们给的水果,所以信号量初始值为0

semaphore mutex = 1;  //实现互斥访问盘子(缓冲区)
semaphore apple = 0;  //盘子中有几个苹果
semaphore orange = 0; //盘子中有几个橘子
semaphore plate = 1;  //盘子中还可以放多少个水果

4、代码实现

可不可以不使用互斥信号量? 

semaphore apple = 0;  //盘子中有几个苹果
semaphore orange = 0; //盘子中有几个橘子
semaphore plate = 1;  //盘子中还可以放多少个水果

1、刚开始,儿子、女儿进程即使上处理机运行也会被阻塞

2、刚开始,如果是父进程先上处理机运行,则:

  1. 父亲准备完苹果后,P操作后plate--变为0,可以访问盘子,然后切换至母亲
  2. 母亲准备完橘子后,P操作后plate--变为-1,需要阻塞循环等待,然后切换至父亲
  3. 父亲将苹果放入盘子后,V操作后apple++变为1,女儿进程被唤醒,并且其它进程即使运行也会被阻塞
  4. 女儿进程被唤醒后,P操作后apple--变为0,可以访问盘子,然后执行V操作plate++变为0,然后母亲进程被唤醒(父进程已经完全结束)
  5. 母进程被唤醒后,不会再执行P操作,可以直接去访问盘子,然后执行V操作orange++变为1,然后儿子进程被唤醒(母进程已经完全结束)
  6. 儿子进程被唤醒后,P操作orange--变为0,可以访问盘子,然后执行V操作plate++变为1(重新变为初始值)

当缓冲区的大小为2呢?

semaphore apple = 0;  //盘子中有几个苹果
semaphore orange = 0; //盘子中有几个橘子
semaphore plate = 2;  //盘子中还可以放多少个水果

1、刚开始,儿子、女儿进程即使上处理机运行也会被阻塞

2、刚开始,如果是父进程先上处理机运行,则:

  1. 父亲准备完苹果后,P操作后plate--变为1,可以访问盘子,然后切换至母亲
  2. 母亲准备完橘子后,P操作后plate--变为0,可以访问盘子,然后切换至父亲
  3. 父亲向盘子中放苹果后,切换至母亲
  4. 母亲向盘子中放橘子后,可能覆盖原来父亲进程放入的苹果(数据覆盖)

结论

1、进程由阻塞被唤醒后,不再执行原来导致阻塞的代码段,而是直接执行后序的代码段

2、当缓冲区大小等于1,有可能(不绝对)即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象:本题中的缓冲区大小为1,再任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1,因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区

3、当缓冲区大小1时,必须设置专门的互斥变量mutex,保证不会出现数据覆盖的问题 

4、解决”多生产者-多消费者问题“的关键在于理清复杂的同步关系,在分析同步问题(一前一后问题)的时候不能从单个进程行为的角度来分析,要把”一前一后“发生的事看作是两种”事件“的前后关系,如果从单个进程行为的角度来考虑的话,我们会有以下结论:

~over~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/316835.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-1+2课程介绍+电路系统建模、基尔霍夫定律

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 1. 课程介绍2. 电路系统建模、基尔霍夫定律 1. 课程介绍 2. 电路系统建模、基尔霍夫定律 基本元件: 电量 库伦&…

粘接PI膜除了使用PI膜专用UV胶粘接,还可以使用热固化环氧胶来解决!

热固化环氧胶也是粘接聚酰亚胺(PI)膜的一种常见方法。 热固化环氧胶是一种在加热的条件下固化成坚固状态的胶水,在涂抹或涂覆胶水后,通过加热,胶水中的化学反应被触发,导致其硬化和固化,从而形…

【linux kernel】linux的SPI框架分析

文章目录 一、linux内核中的SPI框架二、SPI核心的初始化三、SPI核心的数据结构1、struct spi_statistics2、struct spi_delay3、struct spi_device4、struct spi_driver5、struct spi_controller6、struct spi_res7、struct spi_transfer8、struct spi_message9、struct spi_bo…

【Leetcode】466. 统计重复个数

文章目录 题目思路代码 题目 466. 统计重复个数 思路 题目要求找出一个最大整数 m,使得经过 n2 个字符串 s2 组成的字符串能够被经过 n1 个字符串 s1 组成的字符串完全包含的次数。使用动态规划来记录每个位置匹配的情况,并通过循环节的分析来计算最…

kafka容灾演练的方案

背景 kafka可以通过MirrorMaker工具把集群的数据从一个集群同步到另一个集群,通过在另一个数据中心创建灾备集群的方式可以做到容灾的效果,但是如果我们不通过如此重量级的工具也想达到容灾演练的目的,可以怎么做呢 kafka简单容灾实现 当原kafka集群发…

2024最新最全【Xmind8】下载安装零基础教程【附安装包】

软件下载 软件:Xmind 版本:2023 语言:简体中文 大小:136.72M 安装环境:Win7及以上版本 ,64位操作系统 硬件要求:CPU2.0GHz ,内存4G(或更高) 下载通道①百度网…

报表生成器FastReport .Net用户指南:带图表的报告(图表编辑器)

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…

AndroidStudio导入程序、项目(教程)

目录 1. 首先解压压缩包,转为文件夹 2. 打开解压好的项目文件夹,删除.gradle和.idea这两个文件 3. 修改bulid.gradle文件,将gradle的版本型号改成自己的 (1) 传统结构 (2) 简洁结构 4. 打开android stdio软件,导入已经修改好…

Apache Commons VFS(虚拟文件系统)使用详解

第1章:Apache Commons VFS简介 大家好,我是小黑,今天我们来聊聊Apache Commons VFS(虚拟文件系统)。想必很多朋友都听说过或者用过Apache Commons的其他库,但是VFS可能还有点陌生。那么,什么是…

咖啡茶饮营销不止「9 块 9」,门店「VACS」需要全面提升

每一座城市 CBD 的写字楼下和热门商圈的街边,都是咖啡茶饮的战场。作为餐饮行业的热门赛道,咖啡茶饮近年来一直保持高速增长。据统计,截至今年 10 月 31 日,陆陆续续又有约 15 万家店铺开门营业…… 白热化竞争下,茶饮…

重读VIT:深入探索细节与影响

1. 模型架构 提起一个新模型,我想大家最关心的事就是:它到底长什么样?输入输出是什么?我要怎么用?所以,我们先来看模型架构。 1.1 Bert结构 前面说过,VIT几乎和Bert一致,我们来速扫…

通过软盘拷贝文件 - 华为OD统一考试

OD统一考试(B卷) 分值: 200分 题解: Java / Python / C 题目描述 有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究但此电脑除了有一个3.5寸软盘驱动器以外,没有任何手段可以将文件持贝出来,而且只有一张软盘可以…