(二十三)操作系统-多生产者·多消费者问题

news2025/7/30 5:09:30

文章目录

  • 一、问题描述
  • 二、问题分析
    • 1. 关系分析
    • 2. 整理思路
  • 三、实现
    • 1. 代码
    • 2.如果不要互斥信号量
    • 3. 将盘子(缓冲区)容量设为2
  • 四、总结

一、问题描述

  桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。(如未接触过,可以先了解生产者-消费者问题(二十二)操作系统-生产者· 消费者问题。
请添加图片描述


二、问题分析

1. 关系分析

  找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
互斥关系:
  对缓冲区(盘子)的访问要互斥地进行
同步关系(一前一后):
  父亲将苹果放入盘子后,女儿才能取苹果
  母亲将橘子放入盘子后,儿子才能取橘子
  只有盘子为空时,父亲或母亲才能放入水果;“盘子为空”这个事件可以由儿子或女儿触发,事件发生后才允许父亲或母亲放水果

2. 整理思路

  根据各进程的操作流程确定P、V操作的大致顺序。
互斥:
  在临界区前后分别PV
同步:
  前V后P
在这里插入图片描述


三、实现

1. 代码

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

dad (){
	while(1){
		准备一个苹果;
		P(plate) ;
		P(mutex);
		把苹果放入盘子;
		V(mutex);
		v(apple);
	}
}

mom (){
	while(1){
		准备一个橘子;
		P(plate) ;
		P(mutex);
		把橘子放入盘子;
		V(mutex);
		V(orange);
	}
}

daughter (){
	while(1){
		P(apple) ;
		P(mutex);
		从盘中取出苹果;
		V(mutex);
		V(plate);
		吃掉苹果;
	}
}

son (){
	while(1){
		P(orange) ;
		P(mutex);
		从盘中取出橘子;
		V(mutex);
		V(plate);
		吃掉橘子;
	}
}

2.如果不要互斥信号量

在这里插入图片描述
在这里插入图片描述

分析
  刚开始,儿子、女儿进程即使上处理机运行也会被阻塞。如果刚开始是父亲进程先上处理机运行,则:
  阻塞等待盘子→父亲放入苹果V(apple),女儿进程被唤醒,其他进程即使运行也都会阻塞,暂时不可能访问临界资源(盘子)→女儿P(apple),访问盘子,V(plate),等待盘子的母亲进程被唤醒→母亲进程访问盘子(其他进程暂时都无法进入临界区)→…

结论
  即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象。

原因在于
  本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信t号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区…

3. 将盘子(缓冲区)容量设为2

在这里插入图片描述
在这里插入图片描述
分析
  父亲P(plate),可以访问盘子→母亲P(plate),可以访问盘子→父亲在往盘子里放苹果,同时母亲也可以往盘子里放橘子。于是就出现了两个进程同时访问缓冲区的情况,有可能导致两个进程写入缓冲区的数据相互覆盖的情况。因此,如果缓冲区大小大于1,就必须专门设置一个互斥信号量mutex来保证互斥访问缓冲区。

总结
  在生产者-消费者问题中,如果缓冲区大小为1,那么有可能不需要设置互斥信号量就可以实现互斥访问缓冲区的功能。当然,这不是绝对的,要具体闯题具体分析。

建议
  在考试中如果来不及仔细分析,可以加上互斥信号量,保证各进程一定会互斥地访问缓冲区。但需要注意的是,实现互斥的P操作一定要在实现同步的P操作之后,否则可能引起“死锁”。

PV操作题目的解题思路:

  • 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
  • 整理思路。根据各进程的操作流程确定P、V操作的大致顺序。
  • 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)

四、总结

  解决“多生产者-多消费者问题”的关键在于理清复杂的同步关系。
  在分析同步问题(一前一后问题)的时候不能从单个进程行为的角度来分析,要把“一前一后”发生的事看做是两种“事件”的前后关系。
  比如,如果从单个进程行为的角度来考虑的话,我们会有以下结论:
  如果盘子里装有苹果,那么一定要女儿取走苹果后父亲或母亲才能再放入水果。
  如果盘子里装有橘子,那么一定要儿子取走橘子后父亲或母亲才能再放入水果。
  正确的分析方法应该从“事件”的角度来考虑,我们可以把上述四对“进程行为的前后关系”抽象为一对“事件的前后关系”。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用强化学习神包trl轻松实现GPT2可控文本生成

来源:投稿 作者:Sally can wait 编辑:学姐 模型github: lvwerra/trl: Train transformer language models with reinforcement learning. (github.com)https://github.com/lvwerra/trl 这个项目是复现 ”Fine-Tuning Language Models from H…

C++vector 简单实现

一。概述 vector是我们经常用的一个容器,其本质是一个线性数组。通过对动态内存的管理,增删改查数据,达到方便使用的目的。 作为一个线性表,控制元素个数,容量,开始位置的指针分别是: start …

Hive---拉链表

拉链表 文章目录拉链表定义用途案例全量流程增量流程合并过程第一步第二步第三步案例二(含分区)创建外部表orders增量分区表历史记录表定义 拉链表是一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的,顾名思义&am…

从零开始学GeoServer源码十一(如何处理多个文件解析器Multipart Resolver引起的冲突问题)

目录前言1.现象2.排查问题3.找到问题4.解决问题5.总结前言 本文起源于我们遇到的一个问题,本来 GeoServer 使用的好好的,但是有天突然发现,无法在 GeoServer 中上传样式的 sld 文件了,报错 “No Multipart-config for Servlet” …

java.lang.IllegalArgumentException: itemView may not be null

报错截图:场景介绍:在使用recycleView 自动递增数据,且自动滚动到最新行; 当数据达到273条 时出现ANR;项目中 全部的列表适配器使用的三方库:BaseRecyclerViewAdapterHelper (很早之前的项目&am…

《SQL基础》16. 锁

锁锁全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁临键锁锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并…

uniapp在线升级关联云空间

升级中心 uni-upgrade-center - App: https://ext.dcloud.net.cn/plugin?id4542 App升级中心 uni-upgrade-center文档: https://uniapp.dcloud.net.cn/uniCloud/upgrade-center.html#uni-upgrade-center-app 升级中心 uni-upgrade-center - Admin&#…

Ka频段需要更多带宽?

随着全球连接需求的增长,许多卫星通信(satcom)系统日益采用Ka频段,对数据速率的要求也水涨船高。目前,高性能信号链已经能支持数千兆瞬时带宽,一个系统中可能有成百上千个收发器,超高吞吐量数据速率已经成为现实。 另…

JavaWeb—HTML

目录 1、B/S 软件的结构 2、前端的开发流程 3、网页的组成部分 4、HTML 简介 5、创建 HTML 文件 6、HTML 文件的书写规范 7、HTML 标签介绍 8、常用标签介绍 8.1、font 字体标签 8.2、特殊字符 8.3、标题标签 8.4、超链接 ( **** 重 点 ,必 …

如何实现jwt鉴权机制之详解

jwt鉴权一是什么headerpayloadSignature二、如何实现生成 token校验token三、优缺点优点:缺点:一是什么 JWT(JSON Web Token),本质就是一个字符串书写规范,如下图,作用是用来在用户和服务器之间…

Wannacrypt蠕虫老树开花?又见Wannacrypt

Wannacrypt蠕虫是一个在2017年就出现的远古毒株,其利用永恒之蓝漏洞降维打击用户服务器,而后进行扩散勒索,曾经一度风靡全球,可谓是闻者伤心,听着落泪,因为这玩意解密是不可能 解密的。 而2023年的今天&am…

MCM 箱模型建模方法及大气 O3 来源解析实用干货

OBM 箱模型可用于模拟光化学污染的发生、演变过程,研究臭氧的生成机制和进行敏感性分析,探讨前体物的排放对光化学污染的影响。箱模型通常由化学机理、物理过程、初始条件、输入和输出模块构成,化学机理是其核心部分。MCM (Master Chemical M…

【每天学习一点新知识】JNDI注入

什么是JNDIJNDI是Java的一种API,为我们提供了查找和访问各种命名和目录服务的通用统一的接口。通过JNDI统一接口我们可以来访问各种不同类型的服务,例如远程方法调用(RMI),通用对象请求代理体系结构(CORBA&…

Qt QTreeView简单使用

QT-QTreeView使用方法 QTreeView: 用于显示树状结构数据,适用于树状结构数据的操作。 一、初始化 ​ 利用QStandardlternModel来初始化数据,标准的基于项数据的数据模型类, 每个项数据可以是任何数据类型。 // 初始化model QStandardItem…

工作实战之拦截器模式

目录 前言 一、结构中包含的角色 二、拦截器使用 1.拦截器角色 a.自定义拦截器UserValidateInterceptor,UserUpdateInterceptor,UserEditNameInterceptor b.拦截器配置者UserInterceptorChainConfigure,任意组装拦截器顺序 c.拦截器管理者…

VM安装FydeOS16.0

准备工作 1、已安装VMware Workstation虚拟机; 2、下载好系统文件; 3、打开VM、新建虚拟机; 一、下载 https://fydeos.com/download/vm 我选择的镜像1。等下载完成,我这感觉下载速度不快,通过onedrive下载要快。 …

Jfrog 搭建本地maven仓库以及上传Android库

Jfrog 下载 安装包下载地址:Download Artifactory OSS | JFrog 如果是想下载之前的版本,可以点击上面的Get code source ,如果是最新版本,直接点下面的下载就好。下面以Linux安装为例。 Jfrog安装 对于Linux而言,其实…

Java泛型深入

一. 泛型的概述和优势 泛型概述 泛型&#xff1a;是JDK5中引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。泛型的格式&#xff1a;<数据类型>&#xff0c;注意&#xff1a;泛型只能支持引用数据类型。集合体系的全部接口和实现类都是…

Java刷题-----蓝桥杯省赛JavaC组第十二届(第二场)4-------------6

4、格点题目本题总分&#xff1a;10 分问题描述如果一个点 ( x , y ) 的两维坐标都是整数&#xff0c;即 x ∈ Z 且 y ∈ Z &#xff0c;则称这个点为一个格点。如果一个点 ( x , y ) 的两维坐标都是正数&#xff0c;即 x > 0 且 y > 0 &#xff0c;则称这个点在第一象限…

浅谈 Nodejs原型链污染

一直在做php的题目&#xff0c;对其它语言做的很少。刚好在西湖论剑2022复现时&#xff0c;遇到了一道原型链污染的题目&#xff0c;借此机会开始简单学习一下 Nodejs的洞 p&#x1f402;讲解的十分清楚&#xff0c;因此下面举例子就直接用p&#x1f402;的例子进行解释了 目…