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

news2024/9/26 3:19:58

文章目录

  • 一、问题描述
  • 二、问题分析
  • 三、PV操作题目分析步骤
    • 1. 关系分析
    • 2. 整理思路
    • 3. 设置信号量
    • 4. 编写代码
  • 四、能否改变相邻P、V操作的顺序?
  • 五、小结
    • 1. PV操作题目的解题思路
    • 2. 注

一、问题描述

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

  • 生产者、消费者共享一个初始为空、大小为n的缓冲区
    请添加图片描述

  • 只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
    请添加图片描述

  • 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
    请添加图片描述

  • 缓冲区是临界资源,各进程必须互斥地访问

二、问题分析

  信号量机制可实现互斥同步、对一类系统资源的申请和释放

  • 互斥:设置初值为1的互斥信号量。
  • 同步:设置初值为0的同步信号量(实现“一前一后”)。
  • 设置一个信号量,初始值即为资源的数量(本质上也属于“同步问题”,若无空闲资源,则申请资源的进程需要等待别的进程释放资源后才能继续往下执行)。

三、PV操作题目分析步骤

1. 关系分析

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

  • 同步关系。缓冲区满时,生产者要等待消费者取走产品。
  • 同步关系。缓冲区空时(即没有产品时),消费者要等待生产者放入产品。
  • 互斥的访问。

2. 整理思路

  根据各进程的操作流程确定P、V操作的大致顺序。

  • 生产者母次要消耗(P)一个空困缓冲区,并生产(V)一个产品。
  • 消费者每次要消耗(P)一个产品,并释放一个空闲缓冲区(V)。往缓冲区放入/取走产品需要互斥。

3. 设置信号量

  设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)
请添加图片描述

4. 编写代码

semaphore mutex = 1;  //互斥信号量,实现对缓冲区的互斥访问
semaphore empty =n;  //同步信号量,表示空闲缓冲区的数量
semaphore full = 0;  //同步信号量,表示产品的数量,也即非空缓冲区的数量

//生产者
producer (){
	while(1){
		生产一个产品;
		P(empty);  //消耗一个空闲缓冲区
//实现互斥是在同一进程中进行一对PV操作:
		P(mutex);
		把产品放入缓冲区;
		v(mutex);
		V(full);  //增加一个产品
	}
}

//消费者
consumer (){
	while(1){
		P(full);  //消耗一个产品(非空缓冲区)
		P (mutex);  //从缓冲区取出一个产品;
		v(mutex);
		v(empty);   //增加一个空闲缓冲区
		使用产品;
	}
}

//实现两进程的同步关系,是在其中个进程中执行P,另一进程中执行V

四、能否改变相邻P、V操作的顺序?

producer (){
	while(1){
		生产一个产品;
		P (mutex);  //①  //mutex的P操作在前
		P(empty);   //②
		把产品放入缓冲区;
		v (mutex);
		v (full);
	)
)

consumer () {
	while(1){
		P (mutex);  //③
		P(full);    //④
		从缓冲区取出一个产品;
		v(mutex);
		v(empty);
		使用产品;
	}
}

  若此时缓冲区内已经放满产品,则empty=o,full=n。
  则生产者进程执行①使mutex变为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞。由于生产者阻塞,因此切换回消费者进程。消费者进程执行③,由于mutex为0,即生产者还没释放对临界资源的“锁”,因此消费者也被阻塞。
  这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。
  同样的,若缓冲区中没有产品,即full=0,empty=n。按③④①的顺序执行就会发生死锁。
  因此,实现互斥的P操作一定要在实现同步的P操作之后
  V操作不会导致进程阻塞,因此两个V操作顺序可以交换

五、小结

1. PV操作题目的解题思路

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

2. 注

  生产者消费者问题是一个互斥、同步的综合问题。
  有时候是消费者需要等待生产者生产,有时候是生产者要等待消费者消费,这是两个不同的“一前一后问题”,因此也需要设置两个同步信号量。
请添加图片描述

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

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

相关文章

什么是文件传输中台?

企业文件传输的场景有哪些? 企业日常办公中无时无刻不在产生数据文件。多样化的数据已成为企业的重要资产,更被称为是“新石油”。数据并不是单单存储起来就行了,而是需要高效又安全的让数据流转起来,释放其自身的价值&#xff0…

XGBoost和LightGBM时间序列预测对比

XGBoost和LightGBM都是目前非常流行的基于决策树的机器学习模型,它们都有着高效的性能表现,但是在某些情况下,它们也有着不同的特点。 XGBoost和LightGBM简单对比 训练速度 LightGBM相较于xgboost在训练速度方面有明显的优势。这是因为Ligh…

发票自动OCR识别并录入模板 3分钟免费配置

要问整个公司里和数据打交道最多的职能,非财务莫属了吧。除了每天要处理大量财务数据外,还有发票录入的工作让财务陷入“易燃易爆炸”的工作状态。发票报销看似简单,但发票的类型有很多种,每种发票需要录入的信息也有差别。再加上…

SimpleITK 获取CT spacing 底层原理

SimpleITK 获取CT spacing 底层原理 一、层厚、层间距概念 层厚: CT扫描机扫描出来的断层的层的厚度, 通常用Slice thickness表示, 比如 5mm 层间隔:一般用 Slice interval 或 Slice increment来表示,比如 5mm。在 …

最新!蔚来2022年第四季度被理想汽车超越,或将在2023年全面落后

3月1日,蔚来汽车(NYSE: NIO; HKEX: 9866; SGX: NIO,下称“蔚来”)发布了截至2022年12月31日的第四季度及全年财报。财报显示,蔚来2022年第四季度实现营收160.64亿元(约23.29亿美元),…

SpringBoot实现静态资源映射,登录功能以及访问拦截验证——以黑马瑞吉外卖为例

目录 一、项目简介 二、设置静态资源访问路径 三、实现登录功能 四、拦截访问请求 本篇文章以黑马瑞吉外卖为例 一、项目简介 瑞吉外卖项目分为后台和前台系统,后台提供给管理人员使用,前台则是用户订餐使用 资源我们放在resources下 二、设置静态…

Postman的下载和安装

文章目录一 下载二 安装一 下载 官网下载地址:https://www.postman.com/ 进入官网页面,选择对应的操作系统和版本,然后进入Postman下载页面,然后点击 Windows 64-bit 即可下载,如下 二 安装 Postman的安装很简单&am…

Python每日一练(20230302)

目录 1. 字符串统计 2. 合并两个有序链表 3. 下一个排列 附录 Python字典内置方法 增 删 改 查 其它 1. 字符串统计 从键盘输入一个包含有英文字母、数字、空格和其它字符的字符串,并分别实现下面的功能:统计字符串中出现2次的英文字母&#…

C++---最长上升子序列模型---友好城市(每日一道算法2023.3.2)

注意事项: 本题为"线性dp—最长上升子序列的长度"的扩展题,所以dp思路这里就不再赘述。 题目: Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。 北岸的每个城市有且仅有…

python自学之《21天学通Python》(18)——第21章 案例2 Python搞定大数据

“大数据(Big Data)”这个术语最早期的引用可追溯到apache org的开源项目Nutch。当时,大数据用来描述为更新网络搜索索引需要同时进行批量处理或分析的大量数据集。随着谷歌MapReduce和GoogleFileSystem (GFS)的发布&a…

第十三节 继承

什么是继承? java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立父子关系。 public class Student extends People{} student为子类(派生类),people为父类(基类或者超类…

激光雷达迈向规模量产期:如何看待3类玩家的竞争格局?

激光雷达正进入规模量产周期。 高工智能汽车研究院监测数据显示,2022年中国市场(不含进出口)乘用车前装标配激光雷达交付12.99万颗,配套新车11.18万辆,同比分别增长1544.30%和2626.82%;预计2023年标配交付将…

第四回:文字图例尽眉目

import matplotlib import matplotlib.pyplot as plt import numpy as np import matplotlib.dates as mdates import datetime一、Figure和Axes上的文本 Matplotlib具有广泛的文本支持,包括对数学表达式的支持、对栅格和矢量输出的TrueType支持、具有任意旋转的换…

Python进阶-----面向对象2.0(特有属性和方法与私有属性和方法)

目录 前言: 1.添加特有属性/方法 示例1:添加特有属性 示例2:添加特有方法 2.私有属性/方法 (1)私有化示例 (2) 私有化属性/方法可以在类的内部使用 (3)强制访问私…

一:BT、BLE版本说明及对比

蓝牙版本说明1.常见名词说明2.BT&BLE特性对比3.BT各版本对比4.BLE各版对比1.常见名词说明 名称说明BR(Basic Rate)基本码率EDR(Enhanced Data Rate)增强码率BLE(Bluetooth Low Energy)低功耗蓝牙HS(High Speed)高速蓝牙BT(BlueTooth)蓝牙技术LE(Low Energy)低能耗AFH(Adap…

态路小课堂丨光模块使用可能遇到的4大问题以及注意事项!

光模块作为光通信系统的核心器件,其内部集成了精密的光学元件和电路元件。在日常使用过程中如果不按规定操作,很容易导致光模块损坏。本文态路通信为您介绍光模块在使用时可能遇到的问题,以及我们应该注意的事项。以此来减少光模块使用寿命&a…

Spring 事务(编程式事务、声明式事务@Transactional、事务隔离级别、事务传播机制)

文章目录1. 事务的定义2. Spring 中事务的实现2.1 MySQL 中使用事务2.2 Spring 中编程式事务的实现2.3 Spring 中声明式事务2.3.1 声明式事务的实现 Transactional2.3.2 Transactional 作用域2.3.3Transactional 参数设置2.3.4 Transactional 异常情况2.3.5 Transactional 工作…

桑基图绘制

绘制桑基图 但是关于数据流上的数据标签可能还得用ps… 注意 1、节点(nodes)要包括各层的,且不能重复,需要自己在后边append几个数据 2、数据流的数据要是整数,不能时numpy 3、注意表格加入时要再由array转为list&a…

大数据技术之Maxwell入门案例学习

大数据技术之Maxwell入门案例学习 文章目录大数据技术之Maxwell入门案例学习1、写在前面2. Maxwell 使用2.1 Maxwell 安装部署2.2 Maxwell 入门案例2.2.1 监控 Mysql 数据并在控制台打印2.2.2 监控 Mysql 数据输出到 kafka2.2.3 监控 Mysql 指定表数据输出控制台2.2.4 监控 Mys…

分布式监控系统——Zabbix(4)可视化、模板和用户参数

文章目录分布式监控系统——Zabbix(4)可视化、模板和用户参数一、zabbix可视化1.简介2.自定义图形(Graphs)3.聚合图形(Screens)4.幻灯片演示(Slide shows)5.定义拓扑图(M…