进程互斥经典问题(读写者问题、理发店问题)

目录

读写者问题

问题描述

问题分析

进程互斥问题三部曲

读者写者算法实现

一、找进程——确定进程关系

二、找主营业务

三、找同步约束

a.互斥

b.资源 

c.配额 

理发店问题 

问题描述

问题分析

进程互斥问题三部曲

理发店问题算法实现

一、找进程——确定进程关系

 二、找主营业务

 三、找同步约束

a.资源

b.互斥 

c.配额 

总结


读写者问题

问题描述

有一个许多进程共享的数据区。有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer)。现在要写一个程序,保证这些进程的运行是安全的。

问题分析

分析问题可以发现以下这些要点:

1、读者进程彼此可以同时访问共享数据区

2、读者和写者进程不可以同时访问共享数据区

3、写者进程彼此不可以同时访问共享数据区

进程互斥问题三部曲

任何进程互斥(PV问题)都可以按照以下三步思考(来源:山东大学高晓程老师)

一、找进程——确定进程关系

二、找主营业务——抛开互斥,确定每个进程的主要任务

三、找同步约束

  1. 互斥
  2. 资源(计数信号量、空闲空间信号量等)
  3. 限额

读者写者算法实现

接下来,我们按照上面三部曲的思路来实现这个PV经典算法

一、找进程——确定进程关系

进程有两类:1、读者进程;2、写者进程

进程关系如下:

1、读者写者是互斥的

2、写者之间是互斥的

3、读者之间不是互斥的

二、找主营业务

读者进程的主营业务就是:读取reading

写者进程的主营业务就是:写入writing

(此时不考虑任何同步约束~~)

代码如下:

//写者进程
writer(){while(1){writing;}
}//读者进程
reader(){while(1){reading;}
}

三、找同步约束

a.互斥

互斥约束:1、找到临界区;2、互斥变量紧贴临界区

在上面程序的基础上增加互斥约束,如下:

//写者进程
writer(){while(1){wait(rwmutex);writing;signal(rwmutex);}
}//读者进程
reader(){while(1){wait(mutex);if(count==0){wait(rwmutex);}count++;signal(mutex);reading;wait(mutex);count--;if(count==0)signal(rwmutex);signal(mutex);}
}

关键点:

1、读者可以一起读取文件,但是读者和写者不能一起访问资源区。这表明如果没有读者访问,此时有一个读者想要访问资源区,他需要和写者竞争这个资源。一旦这个读者开始读取后,其他读者可以直接读取,不需要互斥访问。———需要一个读者和写者之间的互斥量rwmutex。

2、 由于只有第一个读者需要去竞争rwmutex,所以需要一个格外的变量count去记录目前有几个读者。

3、又由于count变量对于多个读者进程来说又是共享的变量(临界区),所以需要另外一个互斥量mutex去约束读者进程对count变量的访问

b.资源 

资源视角主要包括有界缓存问题的计数信号量、先后执行问题的同步信号量等。本题显然没有这两个信号量的约束,所以这边资源视角没有新的代码修改。

但是资源视角是一个万能视角,我们可以从资源视角来看上面的互斥:

1、rwmutex是访问资源,第一个读者进程需要和众多写者进程去竞争。只有竞争成功才可以进一步操作

2、对count的访问也是一种读者进程间的访问资源,只有每个读者进程竞争到了这个资源,才可以访问count变量,对变量进行修改

c.配额 

配额仅仅在特殊的进程互斥问题上才需要考虑,本题中并没有对配额进行限制。后续有遇到配额约束,我们再展开说说。


理发店问题 

问题描述

理发店里有一位理发师、一把理发椅和 n 把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉;当一个顾客到来时,它必须叫醒理发师;如果理发师正在理发时又有顾客来到,那么,如果有空椅子可坐,顾客就坐下来等待,否则就离开理发店。

问题分析

1、只有n把顾客坐的等待椅子,一旦椅子满了,新顾客就离开

2、理发椅子只有一个

3、没有客人理发师就睡觉,客人来了理发师才理发

进程互斥问题三部曲

任何进程互斥(PV问题)都可以按照以下三步思考(来源:山东大学高晓程老师)

一、找进程——确定进程关系

二、找主营业务——抛开互斥,确定每个进程的主要任务

三、找同步约束

  1. 互斥
  2. 资源(计数信号量、空闲空间信号量等)
  3. 限额

理发店问题算法实现

一、找进程——确定进程关系

两个进程:1、理发师进程;2、顾客进程

1、理发师和顾客进程存在先后关系,顾客来了理发师才理发

2、顾客进程之间存在互斥关系,理发椅只有一张

3、顾客进程存在上限,一旦超过上限便不再添加

 二、找主营业务

理发师:叫号+理发

顾客:取号+被理发

//理发师进程
Server(){while(1){叫号;理发;
}//顾客进程
Customer(){while(1){取号;被理发;
}

 三、找同步约束

a.资源

顾客来了,给理发师释放一个资源;理发师理完发,给顾客们释放一种资源。所以这里需要两个资源customer、server:

//默认先对信号量操作,再进行实际操作
//理发师进程
Server(){while(1){wait(customer);叫号;  //减少一个顾客数,访问临界区signal(server);理发;
}//顾客进程
Customer(){while(1){取号;  //增加一个顾客数(可能失败,所以signal在后面),访问临界区signal(customer);wait(server)被理发;
}

只有n把顾客坐的等待椅子,一旦椅子满了,新顾客就离开。所以这里需要共享变量waiting,来记录等待的顾客数目:

//默认先对信号量操作,再进行实际操作
//理发师进程
Server(){while(1){wait(customer);叫号;  //减少一个顾客数,访问临界区waiting--;  //减少一个等待顾客数,访问临界区signal(server);理发;
}//顾客进程
Customer(){while(1){if(waiting<n){取号;  //增加一个顾客数(可能失败,所以signal在后面),访问临界区signal(customer);wait(server)被理发;}else{离店;}
}
b.互斥 

对所有临界区的变量加上互斥锁

//默认先对信号量操作,再进行实际操作
//理发师进程
Server(){while(1){wait(customer);wait(mutex);叫号;  //减少一个顾客数,访问临界区waiting--;  //减少一个等待顾客数,访问临界区signal(mutex);signal(server);理发;}
}//顾客进程
Customer(){while(1){wait(mutex);  //这个wait同样也是保护if语句,所以在后面else结束if语句时也需要signalif(waiting<n){取号;  //增加一个顾客数(可能失败,所以signal在后面),访问临界区waiting++;signal(mutex);signal(customer);wait(server)被理发;}else{signal(mutex);离店;}}
}
c.配额 

配额仅仅在特殊的进程互斥问题上才需要考虑,本题中并没有对配额进行限制。后续有遇到配额约束,我们再展开说说。


总结

本文到这里就结束啦~~有时间我们再来进入其他的经典进程互斥算法
如果觉得对你有帮助,辛苦友友点个赞哦~

知识来源:操作系统概念(黑宝书)、山东大学高晓程老师PPT及课上讲解。不要私下外传

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

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

相关文章

光伏智慧化运营解决方案的应用和价值

在社会对新能源需求的不断扩大&#xff0c;光伏已经成为了可再生能源的重要组成部分&#xff0c;随着光伏电站数量和规模的不断扩大&#xff0c;相关企业和用户都就开始关注如何能够高效精准的进行电站管理&#xff0c;对此&#xff0c;鹧鸪云提出了光伏智慧化运营解决方案&…

解读makefile中的.PHONY

在 Makefile 中&#xff0c;.PHONY 是一个特殊的目标&#xff0c;用于声明伪目标&#xff08;phony target&#xff09;。伪目标是指并不代表实际构建结果的目标&#xff0c;而是用来触发特定动作或命令的标识。通常情况下&#xff0c;.PHONY 会被用来声明一组需要执行的动作&a…

前端学习--React部分

文章目录 前端学习--React部分前言1.React简介1.1React的特点1.2引入文件1.3JSX&#x1f349;JSX简介与使用&#x1f349;JSX语法规则 1.4模块与组件&#x1f349;模块&#x1f349;组件 1.5安装开发者工具 2.React面向组件编程2.1创建组件&#x1f349;函数式组件&#x1f349…

Redis学习篇2:Redis在Spring中的应用

本文继上文开始讲述了Redis在IDEA中如何应用以及集成进入spring开发环境&#xff0c;以及如何使用Redis客户端。上一个文章&#xff1a;Redis学习篇1&#xff1a;初识Redishttps://blog.csdn.net/jialuosi/article/details/139057088 一、Redis在java中的客户端 二、SpringDat…

机器学习基础笔记

周志华老师的机器学习初步的笔记 绪论 知识分类 科学 是什么&#xff0c;为什么 技术 怎么做 工程 多快好省 应用 口诀&#xff0c;技巧&#xff0c;实际复杂环境&#xff0c;行行出状元 定义 经典定义 利用经验改善系统自身的性能 训练数据 模型 学习算法 分类 决策树…

springboot整合kkFileView部署,前端使用

前言&#xff1a; 官方文档&#xff1a;https://kkfileview.keking.cn/zh-cn/docs/production.html docker方式或加入星球获取发行包直接获取启动&#xff0c;无需以下步骤&#xff1a; 拉取镜像# 网络环境方便访问docker中央仓库 docker pull keking/kkfileview:4.1.0# 网…

监控云安全的9个方法和措施

如今&#xff0c;很多企业致力于提高云计算安全指标的可见性&#xff0c;这是由于云计算的安全性与本地部署的安全性根本不同&#xff0c;并且随着企业将应用程序、服务和数据移动到新环境&#xff0c;需要不同的实践。检测云的云检测就显得极其重要。 如今&#xff0c;很多企业…

SSL协议:网络安全通信的守护者

在网络通信迅猛发展的今天&#xff0c;数据安全和隐私保护变得尤为重要。安全套接层协议&#xff08;Secure Sockets Layer, SSL&#xff09;作为早期网络加密及身份验证的基石&#xff0c;为在线数据传输提供了安全保障。下面我们就来了解一下SSL协议。 SSL协议概述 SSL协议最…

关于Moon Player在Apple Vision Pro上无法隐藏/唤醒面板的问题

如果你无法通过手势隐藏/唤醒面板&#xff0c;请确认您是否打开了手势追踪相关权限。 检查方法&#xff1a; 前往系统设置 - Apps找到Moon Player检查权限是否开启 后续步骤&#xff1a; 设置完权限后&#xff0c;你可能需要强制重启Moon Player&#xff0c;请按照以下操作…

NSSCTF-Web题目3

目录 [BJDCTF 2020]easy_md5 1、知识点 2、题目 3、思路 [ZJCTF 2019]NiZhuanSiWei 1、知识点 2、题目 3、思路 第一层 第二层 第三层 [BJDCTF 2020]easy_md5 1、知识点 弱比较&#xff0c;强比较、数组绕过、MD5加密 2、题目 3、思路 1、首先我们跟着题目输入&a…

OSPF问题

.ospf 选路 域内 --- 1类&#xff0c;2类LSA 域间 --- 3类LSA 域外 --- 5类&#xff0c;7类LSA --- 根据开销值的计算规则不同&#xff0c;还分为类型1和类型2 ospf 防环机制 区域内防环&#xff1a;在同一OSPF区域内&#xff0c;所有路由器通过交换链路状态通告&#xff…

Nature plants|做完单细胞还可以做哪些下游验证实验

中国科学院分子植物科学中心与南方科技大学在《Nature Plants》期刊上(IF18.0)发表了关于苜蓿根瘤共生感知和早期反应的文章&#xff0c;该研究首次在单细胞水平解析了结瘤因子处理蒺藜苜蓿&#xff08;Medicago truncatula&#xff09;根系24小时内特异细胞类型的基因表达变化…

深入理解MySQL索引下推优化

在MySQL中&#xff0c;索引的使用对于查询性能至关重要。然而&#xff0c;即使有合适的索引&#xff0c;有时查询性能仍然不尽如人意。索引下推&#xff08;Index Condition Pushdown&#xff0c;ICP&#xff09;是一项能够进一步优化查询性能的技术。本文将详细讲解索引下推的…

JavaWeb_SpringBootWeb

先通过一个小练习简单了解以下SpringBootWeb。 小练习&#xff1a; 需求&#xff1a;使用SpringBoot开发一个Web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~"。 步骤&#xff1a; 1.创建SpringBoot项目&#xff0c;勾选We…

Llama 3 模型家族构建安全可信赖企业级AI应用之使用 Llama Guard 保护大模型对话 (八)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

nginx安装部署问题

记一次nginx启动报错问题处理 问题1 内网部署nginx&#xff0c;开始执行make&#xff0c;执行不了&#xff0c;后面装了依赖的环境 yum install gcc-c 和 yum install -y pcre pcre-devel 问题2&#xff0c;启动nginx报错 解决nginx: [emerg] unknown directive “stream“ in…

Stable Diffusion【写实模型】:逼真,逼真,超级逼真的国产超写实摄影大模型万享XL

今天和大家分享的是一个国产万享系列中使用量最高的大模型:万享XL_超写实摄影&#xff0c;顾名思义&#xff0c;该大模型主要是面向写实摄影&#xff0c;一方面生成的图片人物皮肤纹理细节超级逼真&#xff0c;另一方面对于光影效果的处理也非常到位。对于万享XL超写实摄影大模…

什么是JDK21虚拟线程

JDK21虚拟线程 1. 来一段小故事2. 什么是虚拟线程3. 虚拟线程的几个关键特点4.细说关键特点1.为什么轻量级的1.传统线程运行时间2.虚拟线程运行时间3.对垃圾回收的影响 2.非绑定OS线程的魅力所在3.和传统相比为何易于使用4.阻塞优化有什么好处1.什么是阻塞优化2.JDK 21虚拟线程…

【C++题解】1133. 字符串的反码

问题&#xff1a;1133. 字符串的反码 类型&#xff1a;字符串 题目描述&#xff1a; 一个二进制数&#xff0c;将其每一位取反&#xff0c;称之为这个数的反码。下面我们定义一个字符的反码。 如果这是一个小写字符&#xff0c;则它和字符 a 的距离与它的反码和字符 z 的距离…

私域如何高效管理多微信并实现聚合聊天?

在私域经营中&#xff0c;管理多个微信号是一项具有挑战性的任务。为了提高工作效率&#xff0c;辅助工具成为必不可少的一部分。而个微管理系统将为大家带来高效的多微信号管理体验&#xff0c;让大家能够更好地聚合聊天。 首先&#xff0c;个微管理系统提供了一个统一的界面…