2.15多生产者多消费者问题

2023-05-16

视频链接:

https://www.bilibili.com/video/BV1YE411D7nH?p=24

一,问题描述:

桌上有一只盘子,每次只能向其中放入一个水果。

爸爸向盘子中只放苹果,妈妈向盘子中只放橘子,儿子只吃橘子,女儿只吃苹果。

只有盘子为空时,爸爸妈妈才可以向盘子中放入 一个水果。

仅当盘子中有自己需要的水果时,儿子或者女儿才可以从盘子中取出水果。用PV操作实现以上过程

二,问题分析

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

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

2)同步关系(一前一后)

父亲将苹果放入盘中,女儿才能取苹果

母亲将橘子放入盘中,儿子才能取橘子

只有盘子为空时,父亲母亲才能放水果——盘子为空的事件可以是儿子触发,也可以是女儿

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

互斥:需要在临界区前后分别执行P操作,和V操作。

同步:前一个进程执行后执行V操作,后一个进程进入临界区之前执行P操作

 

3,设置信号量:设置需要的信号量,并根据题目条件确定信号量的初值。

互斥信号量一般初值为1

同步信号量的初值要看对应资源的初始值

 

三,具体实现:

刚开始,儿子,女儿即使上处理机运行也会被堵塞。如果刚开始是父亲进程上处理机运行,则:父亲P(plate),可以访问盘子——》如果这是突然切换到母亲进程,到P(plate),就会被堵塞——》返回父亲进程继续执行,父亲放入苹果V(apple)——》唤醒女儿进程,如果此时运行的是其他进程则会被堵塞,暂时不能访问盘子,等待女儿进程执行完毕V(plate),触发盘子为空——》唤醒在等待队列中的母亲进程P(orange)——》唤醒儿子进程执行。

 


semaphore mutex=1;  //互斥实现访问盘子
semaphore apple=1;  //盘子中有几个苹果
semaphore orange=1;  //互盘子中有几个橘子
semaphore plate=1;  //盘子中还可以放入几个水果

//父亲进程
dad(){
    while(1){
        准备一个苹果;
        p(plate);//对盘子进行P操作(plate--),plate=0,表示盘子中有水果
        P(mutex);//互斥访问盘子
        把苹果放入盘子;
        V(mutex);
        v(apple);//对盘子进行V操作(apple++),apple=1,唤醒需要苹果的进程
    }
}
//目前进程
mom(){
    while(1){
        准备一个橘子;
        P(plate);
        P(mutex);
        把橘子放入盘子;
        v(mutex);
        v(orange);
    }
}
//女儿进程
daughter(){
    while(1){
        P(apple);//如果apple=1,即盘子中有苹果,满足要求继续执行
        P(mutex);//对盘子进行互斥访问
        把苹果从盘子取出;
        v(mutex);
        v(apple);
        吃的苹果;
    }
}
//儿子进程
son(){
    while(1){
        P(orange);
        P(mutex);
        从盘中取出橘子;
        V(mutex);
        V(plate);
        吃掉橘子;
    }
}





三,重要考点:

解决"多生产者-多消费者”问题的关键在于理清复杂的同步关系。

在分析同步问题(一前一后问题)的时候不能从单个进程行为的角度来分析,要把一前一后发生的事看做两种事件的前后关系。

比如,如果从单个进程行为的角度考虑的话,我们会有以下结论:

如果盘子里有苹果,那么一定要女儿进程取出苹果后,父亲或母亲进程才能放入水果

如果盘子里有橘子,那么一定要儿子进程取出橘子后,父亲或母亲进程才能放入水果

这么看是否就意味着要设置四个同步信号量分别来实现这四个一前一后的关系?

正确的分析方法是:

从事件的角度考虑,我们可以把上述四对一前一后的进程关系,抽象成一对事件的前后关系:盘子为空事件——》放入水果事件。盘子为空事件可以由儿子引发也可以是女儿引发;放入水果事件既可以是父亲执行,也可以是母亲执行。这样的话用一对信号量就可以解决问题了

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2.15多生产者多消费者问题 的相关文章

  • Linux中的软件管理

    Linux中的软件管理 yum源头 定义 xff1a yum源是一个软件集合地 xff0c 只需要搜索并安装你想要的软件 yum的全称是Yellowdog Updater Modified xff0c 是一个shell前端软件包管理器 xf
  • Spring拦截器HandlerInterceptor和HandlerInterceptorAdapter

    参考 https blog csdn net zhibo lv article details 81699360 https www cnblogs com jing99 p 11147152 html HandlerInterceptor
  • Java多线程超详解

    引言 随着计算机的配置越来越高 xff0c 我们需要将进程进一步优化 xff0c 细分为线程 xff0c 充分提高图形化界面的多线程的开发 这就要求对线程的掌握很彻底 那么话不多说 xff0c 今天本帅将记录自己线程的学习 程序 xff0c
  • 如何在Ubuntu 20.04上使用UFW设置防火墙

    介绍 Introduction UFW or Uncomplicated Firewall is a simplified firewall management interface that hides the complexity of
  • 人工智能主要分支

    人工智能主要分支 1 主要分支介绍 通讯 感知与行动是现代人工智能的三个关键能力 xff0c 在这里我们将根据这些能力 应用对这三个技术领域进行介绍 xff1a 计算机视觉 CV 人脸识别 自然语言处理 NLP 语音识别 语义识别 在 NL
  • 解决文件上传过大报错The field file exceeds its maximum permitted size of 1048576 bytes.问题

    报错内容如下 只需要在相应的yml配置文件spring下增加相关配置即可
  • 我有一个IT梦

    介绍 作为一名大二的学生 xff0c 接触计算机基础技术近乎俩年 xff0c 俩年来我愈加发觉计算机是一门发展力很强的学科 它多式多样 xff0c 更像是一种挑战 xff0c 对于好强的我来说 xff0c 越来越着迷计算机的世界 纵然未知的
  • Nginx安装教程

    前言 xff1a 同步文章图片有问题想看带有图片版的请移步 xff1a https www yuque com docs share 3fbd7d5a 639c 4ca8 8500 00071b7cb23d BvpWF 本篇文章涉及ngin
  • Kali-Linux-2020.1 设置中文,汉化。

    Kali Linux 2020 1 设置中文 xff0c 汉化 Kali Linux团队在Twitter上宣布 xff1a 新的一年是进行重大改变的好时机 xff0c 因此 xff0c 我们宣布在 即将发布的2020 1版本中 xff0c
  • PowerShell压缩和解压ZIP文件

    压缩 Compress Archive Path D File DestinationPath E File zip 解压 Expand Archive Path E File zip DestinationPath D File
  • python实现基本算法之归并排序(Merge sort)

    基本算法之归并排序 Merge sort 基本算法 04 归并排序 Merge sort 算法 往期请看选择排序 xff0c 插入排序 xff0c 归并排序 xff0c 快速排序等等都发布的 xff01 欢迎大家批评指正 xff01 文章目
  • mysql 异步复制VS半同步复制

    MySQL数据复制原理 异步复制 xff1a 默认情况下 xff0c MySQL的复制是异步复制 xff0c 主服务器及其从服务器是独立的 异步复制可以提供最佳的性能 xff0c 主服务器将更新的数据写入二进制日志 xff08 Binlog
  • mysql读写分离

    读写分离 master xff1a 192 span class token punctuation span 168 span class token punctuation span 2 span class token punctua
  • 在linux中关闭防火墙

    在linux中关闭防火墙 selinux xff08 secure linux 安全的linux xff09 selinux 是linux下的安全措施机制 xff0c 用来保护linux系统的安全 相当于另外一个安全工具 span clas
  • Google Payments?

    The news broke late last week by way of the Wall Street Journal with rumors of a payments service akin to PayPal forthco
  • 数据库中某个表中的某个字段的值是用逗号隔开的多个值,根据逗号拆分并从另一个表中查出数据返回

    两个表的结构如下 a表 b 表 关系说明 b teacherid 61 a user id 查询思路 xff1a FIND IN SET str strlist xff0c 该函数用于判断 str 是否在 strlist 中 xff0c 如
  • 一个玩游戏的失足青年,转行做游戏开发到教育的挣扎过程

    14年的IT从业经历 xff0c 中专毕业后在小镇上开过网吧 在网吧一年多的时间里 xff0c 天天陪人玩游戏 xff0c 后来去读了一个三流计算机专业 xff0c 毕业后转做软件开发 xff0c 最近五年转入游戏开发行业 xff01 从网
  • minikube的部署和安装,排错

    minikube的部署和安装 安装minikube的步骤 环境准备 xff1a 虚拟机至少2个cpu核心 xff0c 2G内存 xff0c 磁盘20G 推荐使用2个cpu核心 xff0c 4G的内存 xff0c 100G的磁盘空间 前期 x
  • lvm逻辑卷

    lvm示例应用 案例描述 xff1a 增加四块scsi硬盘 xff0c 每块100G xff0c 并构建lvm逻辑卷 xff0c 挂载到相应目录下 传统的分区方式 常用命令 临时添加IP地址 xff1a ip add add 192 168
  • VMware虚拟机开机显示you are in emergency mode 解决办法

    问题描述 xff1a 虚拟机开机出错 xff1a you are in emergency mode 出错原因 xff1a 前不久学习lvm逻辑卷时 xff0c 添加磁盘后 xff0c 修改了 etc fstab文件实现开机自动挂载 因为弄

随机推荐