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

news2024/11/25 19:27:05

目录

读写者问题

问题描述

问题分析

进程互斥问题三部曲

读者写者算法实现

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

二、找主营业务

三、找同步约束

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语句时也需要signal
        if(waiting<n){
            取号;  //增加一个顾客数(可能失败,所以signal在后面),访问临界区
            waiting++;
            signal(mutex);
            signal(customer);
            wait(server)
            被理发;
        }
        else{
            signal(mutex);
            离店;
        }
    }
}
c.配额 

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


总结

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

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

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

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

相关文章

微信小程序毕业设计-校车购票系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

高中生是否需要上电子阅览室

高中生是否需要上电子阅览室&#xff0c;取决于学生的学习需求和个人喜好。以下是一些考虑因素&#xff1a; 1. 便利性&#xff1a;电子阅览室通常提供电脑设备和网络连接&#xff0c;方便学生在线获取学习资源。对于家中没有电脑或者网络不稳定的学生&#xff0c;上电子阅览室…

“一带一路”六国国际拳王冠军赛特克斯站新闻发布会顺利举行

实习记者&#xff1a;喀兰姆罕 5月24日&#xff0c;“一带一路”六国国际拳王冠军赛特克斯站新闻发布会在特克斯县阿克塔斯姑娘峰景区举行。这次拳王冠军赛事由新疆广播电视台、特克斯镇人民政府&#xff0c;特克斯县文化体育广播电视和旅游局主办&#xff0c;将于6月15日在特…

mysql 01 linux 上安装mysql服务端

01.linux安装 MySQL的大部分安装包都包含了服务器程序和客户端程序&#xff0c;不过在Linux下使用RPM包时会有单独的服 务器RPM包和客户端RPM包&#xff0c;需要分别安装。 1.查看是否已经安装了MySQL rpm -qa | grep mysql如果什么都没有&#xff0c;就是还没有装过MySQL …

分支机构多,如何确保文件跨域传输安全可控?

随着企业全球化发展&#xff0c;分支机构的分布越来越广泛&#xff0c;跨域文件传输需求也随之增加。然而&#xff0c;跨域文件传输面临的数据安全和传输效率问题&#xff0c;使得构建一个安全、可控的文件交换系统成为迫切需求。FileLink跨网文件交换系统通过综合的技术手段和…

Jenkins常用插件与应用详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jenkins是一个平台我们通过安装插件来解决我们想要完成的任务 1、Jenkins常用插件 Allure&#…

香橙派 AIpro初体验

香橙派&#xff08;Orange Pi&#xff09;AI Pro开发板是一款高性能的AI开发板&#xff0c;由香橙派联合华为精心打造。香橙派&#xff08;Orange Pi&#xff09;&#xff0c;作为深圳市迅龙软件有限公司倾力打造的开源产品品牌&#xff0c;致力于向全球个人及企业用户提供卓越…

QT学习(20):QStyle和自定义样式

QStyle 样式&#xff08;继承自QStyle类&#xff09;代表控件的绘制并封装GUI的外观。QStyle是一个封装了GUI外观的抽象基类。Qt使用QStyle去执行几乎所有的内置控件的绘制&#xff0c;确保控件外观和原生控件风格风格相同。 class Q_WIDGETS_EXPORT QStyle : public QObject{…

HBase分布式数据库入门到精通

文章目录 HBase分布式数据库入门到精通 一、简单介绍 二、HBase数据模型 三、HBase的架构 四、HBase写操作流程 五、HBase读操作流程 六、HBase minor小合并和major大合并 七、HBase目标表meta表 八、HBase特点 九、HBase的使用场景 HBase分布式数据库入门到精通 一、…

stream-流的效率

背景 使用流批量处理数据的时候&#xff0c;我们最关注的肯定是效率问题数据批量处理分为4类 原始的for循环处理基本类型基本类型包装流原始的for循环处理包装类型原始的依稀那个流Stream.of(1,2,3,4) 对比&#xff08;单线程&#xff09; 任何是时候&#xff0c;原始的for循环…

go select

select 是与 switch 相似的控制结构&#xff0c;与 switch 不同的是&#xff0c;select 中虽然也有多个 case&#xff0c;但是这些 case 中的表达式必须都是 channel 的收发操作。 select 能够让 goroutine 同时等待多个 channel 可读或者可写&#xff0c;在多个 channel 状态改…

Swift 属性

属性 一、存储属性1、常量结构体实例的存储属性2、延时加载存储属性3、存储属性和实例变量 二、计算属性1、简化 Setter 声明2、简化 Getter 声明3、只读计算属性 三、属性观察器四、属性包装器1、设置被包装属性的初始值2、从属性包装器中呈现一个值 五、全局变量和局部变量六…

离大模型落地应用最近的工程化技术(RAG)

虽然大规模语言模型&#xff08;LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;方面表现出了其强大的文本生成和理解能力&#xff0c;但是它们在实际应用中仍然面临一些挑战&#xff0c;如处理大规模知识库和实时获取最新信息的能力&#xff0c;并且会产生幻觉。为…

新书速览|Golang+Vue.js商城项目实战

架构师一步一步教你做项目&#xff0c;从架构设计到技术实现完整解析 本书内容 《GolangVue.js商城项目实战》以Gin和Vue.js为核心框架&#xff0c;以全栈商城项目开发为主线&#xff0c;详尽介绍前后端分离架构开发Web网站项目的关键阶段和技术细节。全书共9章&#xff0c;第…

四川景源畅信:新人做抖店的成本很高吗?

随着社交媒体的兴起&#xff0c;抖音成为了一个新兴的电商平台——抖店。不少创业者和商家看中了其庞大的用户基础&#xff0c;想要通过开设抖店来拓展销路。然而&#xff0c;对于刚入行的新手来说&#xff0c;成本问题总是让人犹豫不决。究竟新人做抖店的成本高不高?本文将围…

Qt项目使用pato mqtt C

一,下载pato mqtt C 源码 git 地址:https://github.com/eclipse/paho.mqtt.c.git git 地址可能下载不下来,提供我的gitee地址 gitee地址:https://gitee.com/chaojidahuaidan2021/paho.mqtt.c.git 二,编译共享库 clone下来后,将项目导入到Qt工程中,此时这是一个cmke工程…

java.lang.NumberFormatException: For input string:

创建SpringBoot&#xff0c;Mybatis的项目时候&#xff0c;Service层调用Mapper层时候爆出了一个错误 发现报错是一个类型转换错误&#xff0c;经过排查后发现是因为mapper接收的实体类中没有写空参构造

Debug-011-ES6中的链判断运算符(?.)

这个问题的来源是&#xff1a; 前端在请求后端接口&#xff0c;拿到的数据&#xff0c;有可能是这样的&#xff1a; data:{a:{b:{c:{d:""}}} } 我们前端小伙伴联调时需要取到d的值&#xff0c;我以前是这样写的&#xff1a; // 错误的写法 const value data.a.b.c…

抖音小程序如何生成二维码

1.页面结构 <image src{{imgUrl}}></image>2.代码结构 onLoad(options) {if (options.param) {var qrCode 13246897451257 //传入生成二维码的字符串this.generateQRCode(qrCode);}},//调起第三方库qrCodegenerateQRCode(text) {//调用了qrCode里面的apiconst api…

达梦数据库查看字符集、页大小

1.查看字符集select UNICODE (); 0 表示 GB18030&#xff0c;1 表示 UTF-8&#xff0c;2 表示 EUC-KR 2.查看页大小select SF_GET_PAGE_SIZE(); 也可以通过管理工具去查看