经典进程同步与互斥问题(5)

news2024/9/27 17:28:52

经典进程同步与互斥问题

1 生产者-消费者问题

1.1 问题描述

  • 生产者-消费者问题是指有两组进程共享一个环形的缓冲池。一组进程被称为生产者,另一组进程被称为消费者。
  • 缓冲池是由若干个大小相等的缓冲区组成的,每个缓冲区可以容纳一个产品。
  • 生产者进程不断地将生产的产品放入缓冲池,消费者进程不断地将产品从缓冲池中取出。
    在这里插入图片描述

在生产者-消费者问题中

  • 存在着进程同步问题:当缓冲区满时,表示供大于求,生产者必须停止生产,进入等待状态,同时唤醒消费者;当所有的缓冲区都空时,表示供不应求,消费者必须停止消费,唤醒生产者。
  • 存在着临界区的互斥问题:缓冲池是一个临界资源,必须要等缓冲池里满了,消费者才能取,缓冲池空了,生产者才能生产。所以对于缓冲池的操作是互斥的。

1.2 利用信号量与P,V操作解决生产者-消费者问题。

必须保证先装满再取,取空再装的原则
semaphore mutex =1;
semaphore empty = n;    //缓冲池还剩的空闲位,初始值为n
semaphore full = 0;      //缓冲池的资源数目,因此empty+full=n
int i,j;
ITEM  buffer[n];
ITEM  data_p, data_c;

voidproducer()      //生产者进程
{while(true)
	{produce an item in data_p;
	P(empty);                  //p,v操作实现进程的互斥,必须是成对出现的
	P(mutex);
	buffer[i] = data_p;
	i = (i + 1) % n;
	V(mutex);
	V(full);}
}

voidconsumer()  //消费者进程
{while(true)
	{P(full);
	P(mutex);
	data_c=buffer[j];
	j=(j+1)%n;
	V(mutex);
	V(empty);
	consumetheitemindata_c;}
}

2 读者-写者问题

2.1 问题描述

一个数据对象若被多个并发进程所共享,且其中一些进程只要求读该数据对象的内容,而另一些进程则要求写操作,对此,我们把只想读的进程称为“读者”,而把要求写的进程称为“写者”。
问题描述:

  • 读者可同时读;
  • 读者读时,写者不可写;
  • 写者写时,其他的读者、写者均不可进入。

为了解决该问题,只需要解决“写者与写者”和“写者与第一个读者”的互斥问题。

2.2 用信号量解决读者-写者问题

semaphore Wmutex=1;
读者进程:
while(true)
{
	‘有人要读’P(Wmutex);;
	‘无人读了’V(Wmutex);
}

写者进程:
while(true)
{
	P(Wmutex);;
	V(Wmutex);
}
Semaphore Wmutex,Rmutex=1,1; 
int Rcount;
void reader()/*读者进程*/
{while(true)
	{P(Rmutex);
	if(Rcount==0)P(Wmutex);
	Rcount=Rcount+1;
	V(Rmutex);
	read;/*执行读操作*/
	P(Rmutex);
	Rcount=Rcount-1;
	if(Rcount==0)V(Wmutex);
	V(Rmutex);}
}

voidwriter()  /*写者进程*/
{
while(true){ 
	P(Wmutex);
	write;      
/* 执行写操作*/
	V(Wmutex);
	}
}

3 哲学家进餐问题

3.1 问题描述

五个哲学家,他们的生活方式是交替地思考和进餐。

  • 哲学家们共用一张圆桌,围绕着圆桌而坐,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时拿起其左、右的两支筷子,试图进餐,进餐完毕又进行思考。
  • 这里的问题是哲学家只有拿到靠近他的两支筷子才能进餐,而拿到两支筷子的条件是他的左、右邻居此时都没有进餐。
    -在这里插入图片描述

3.2 用信号量解决哲学家进餐问题

由分析可知,筷子是临界资源,一次只允许一个哲学家使用,因此可以用互斥信号量来实现。

semaphore chopstick[5]={1,1,1,1,1};
void philosopher(inti)/*哲学家进程*/
{while(true){
	P(chopstick[i]);
	P(chopstick[(i+1)%5]);
	eating;     /*进餐*/
	V(chopstick[i]);
	V(chopstick[(i+1)%5]);
	thinking;  /*思考*/}
	}

以上算法虽然解决了相邻两个哲学家不会同时进餐的问题,但如果所有的哲学家总是先拿起左边的筷子,再拿起右边的筷子,那么就会导致死锁

4 打磕睡的理发师问题

4.1 问题描述

理发店有一名理发师,一把理发椅,还有N把供等候理发的顾客坐的普通椅子。如果没有顾客到来,理发师就坐在理发椅上打磕睡。当顾客到来时,就唤醒理发师。如果顾客到来时理发师正在理发,顾客就坐下来等待。如果N把椅子都坐满了,顾客就离开该理发店去别处理发。
在这里插入图片描述

4.2 用信号量解决打磕睡的理发师问题

#define CHAIRS 5//为等候的顾客准备的座椅数
semaphore customers = 0;
semaphore barners = 0;
semaphore mutex = 1;
int waiting;
void barber()//理发师进程
{
	while(true){
	P(customers);//如果没有顾客,理发师就打磕睡
	P(mutex);//互斥进入临界区
	waiting--;
	V(barners);//理发师准备理发了
	V(mutex);
	cut_hair();//理发
	}
}

void customer ()//顾客进程
{P(mutex);
if(waiting < CHAIRS)//如果有空位,顾客等待
	{waiting++; 
	V(customers);//如果有必要,唤醒理发师
	V(mutex);
	P(barners);  //如果理发师正在理发,则顾客等待
	get_haircut();}
else//如果没有空位,则顾客离开
V(mutex);
}

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

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

相关文章

学习802.11之MAC帧格式(一篇就够!)

802.11规范的关键在于MAC&#xff08;媒介访问控制层&#xff09;&#xff0c;MAC位于各式物理层之上&#xff0c;控制数据传输。负责核心成帧操作以及与有线骨干网络之间的交互。 802.11 MAC采用载波监听多路访问&#xff08;CSMA&#xff09;机制来控制对传输媒介的访问&…

操作系统闲谈05——内存管理

操作系统闲谈05——内存管理 一、 内存管理的基本方式 01 段式内存管理 将程序按照逻辑关系划分为段&#xff0c;每个段的大小不等&#xff0c;比如从下到上&#xff08;代码段、数据段、bss段、栈、文件映射、堆等等&#xff09;&#xff0c;然后通过地址映射机制转换为实际…

阻抗匹配之反射波形测量

稍微接触过高速信号的朋友&#xff0c;一定对阻抗匹配和信号反射都有所了解&#xff0c;甚至可以按照公式&#xff0c;把反射波形一路推导出来。但是&#xff0c;纸上得来终绝浅&#xff0c;绝知此事要躬行。 今天&#xff0c;我们就来实测一下信号反射波形&#xff0c;测试环…

【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于知名金融公…

2023年美国大学生数学建模时间、分析及算法代码

美国大学生数学建模——干货2023年美赛比赛日期和时间赛题类型算法代码美赛常见数模问题分类问题判别分析&#xff1a;聚类分析&#xff1a;神经网络分类&#xff1a;优化问题线性规划&#xff1a;非线性规划&#xff1a;整数规划&#xff1a;动态规划&#xff1a;多目标规划&a…

超详细讲解字符串查找函数(保姆级教程!!!)

超详细讲解字符串查找函数&#xff08;保姆级教程&#xff01;&#xff01;&#xff01;&#xff09;字符串查找函数strstr函数strstr函数的使用strstr函数的模拟实现strtok函数strtok函数的使用strtok函数的模拟实现strpbrk函数strpbrk函数的使用strpbrk函数的模拟实现strcspn…

地级市用电、用水、用气数据指标

用电用水量和煤气及液化石油气供应及利用情况可以反映出城市基础设施的建设情况&#xff01;之前我们基于历年的《中国城市统计年鉴》整理了1999—2020年的人口数量数据指标、人口变动数据指标、用地相关数据指标、污染物排放和环境治理相关数据指标、地区生产总值及一二三产构…

【MyBatis】| MyBatis的逆向⼯程

目录 一&#xff1a;MyBatis的逆向⼯程 1. 逆向⼯程配置与⽣成 2. 测试生成的逆向⼯程 一&#xff1a;MyBatis的逆向⼯程 &#xff08;1&#xff09;所谓的逆向⼯程是&#xff1a;根据数据库表逆向⽣成Java的pojo类&#xff0c;SqlMapper.xml⽂件&#xff0c;以及Mapper接⼝…

redis高可用之主从复制

一、前置知识 分布式系统理论基石CAP&#xff1a;consistent-一致性&#xff0c;availability-可用性&#xff0c;partition tolerance-分区容忍性。网络分区&#xff1a;网络断开也叫网络分区&#xff0c;当网络分区发生时&#xff0c;一致性会被破坏&#xff0c;除非牺牲可用…

磁盘管理(8)

磁盘管理 0 引言 速度是影响文件系统性能的主要因素&#xff0c;因此提高磁盘I/O速度的主要途径&#xff1a;选择性能好的磁盘、采用好的磁盘调度算法和设置磁盘高速缓冲区。 1 磁盘的性能 影响磁盘性能的因素&#xff1a; 数据的结构磁盘的类型磁盘访问时间 2 磁盘的结构…

Vscode使用ChatGPT插件

文章目录1.下载vscode插件2.登录ChatGPT&#xff0c;生成APIKeys3.测试4.使用5.其他功能1.下载vscode插件 2.登录ChatGPT&#xff0c;生成APIKeys 地址&#xff1a;https://beta.openai.com/account/api-keys 3.测试 4.使用 &#xff08;1&#xff09;请求简单的模版代码 …

Pycharm 2020 社区版常用快捷键

版本确实有点旧不过快捷键应该不会怎么 变记录一下。 Ctrl Space 基本的代码完成&#xff08;类、方法、属性&#xff09; Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息&#xff08;在方法中调用参数&#xff09; Ctrl Q 快速查看文档…

Golang 结构体笔记

结构体是一个自定义的数据类型&#xff0c;是值类型声明结构体type 结构体名称 struct {field_1 typefield_2 type}注意事项字段声明语法同变量&#xff0c;示例&#xff1a;字段名 字段类型字段的类型可以为&#xff1a;基本类型、数组或引用类型创建一个结构体变量后&#xf…

谷粒商城--品牌管理详情

目录 1.简单上传测试 2.Aliyun Spring Boot OSS 3.模块mall-third-service 4.前端 5.数据校验 6.JSR303数据校验 7.分组校验功能 8.自定义校验功能 9.完善代码 1.简单上传测试 OSS是对象存储服务&#xff0c;有什么用呢&#xff1f;把图片存储到云服务器上能让所有人…

杨校老师课堂之JavaScript定时器案例的红绿灯设计--原始写法

主要介绍了JavaScript定时器设置、使用与倒计时案例,详细分析了javascript定时器的设置、取消、循环调用并附带一个倒计时功能应用案例,需要的朋友可以参考下&#xff1a; 运行效果图&#xff1a; 配套视频课程 基于JavaScript的红绿灯设计演示代码如下: <!DOCTYPE html>…

《Keras深度学习:入门、实战与进阶》之印第安人糖尿病诊断

本文摘自《Keras深度学习&#xff1a;入门、实战与进阶》。 1、数据理解 本节使用Pima Indians糖尿病发病情况数据集。该数据集最初来自国家糖尿病/消化/肾脏疾病研究所。数据集的目标是基于数据集中包含的某些诊断测量来诊断性的预测患者是否患有糖尿病。数据集由多个医学预…

python+django大学生成绩综合考评系统pycharm项目

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm 通常 一个Django model 对应一张数据表&#xff0c;model是以类的形式表现的 实现了ORM 对象…

Unity SRP自定义渲染管线学习2.2: 合批(Batching) SRP Batcher

接下来我们要来学习下自定义渲染管线中的合批&#xff0c;这一节主要学习SRP Batcher 每一次的Draw Call都需要CPU和GPU之间的通信&#xff0c;如果有大量的数据需要从CPU发送到GPU中&#xff0c;那GPU就可能因为等待数据而浪费时间&#xff0c;而CPU会因为忙于发送数据导致无…

第五章:Windows server加域

加入AD域&#xff1a;教学视频&#xff1a;https://www.bilibili.com/video/BV1xM4y1D7oL/?spm_id_from333.999.0.0首先我们选择一个干净的&#xff0c;也就是新建的没动过的Windows server虚拟机。我们将DNS改成域的ip地址&#xff0c;还要保证它们之间能ping的通&#xff0c…

详细解读ChatGPT:如何调用ChatGPT的API接口到官方例子的说明以及GitHub上的源码应用

文章目录1. 解读ChatGPT1.1 词语解释1.2 功能解读2. GitHub上ChatGPT的应用源码3. 调用ChatGPT的API4. 官方例子说明5. 集成ChatGPT自ChatGPT出来到如今&#xff0c;始终走在火热的道路上&#xff0c;如今日活用户破亿&#xff0c;他为何有如此大的魅力&#xff0c;深受广大用户…