进程同步互斥之吸烟者问题,读者写者问题,哲学家进餐问题

news2024/12/29 8:45:22

1.吸烟者问题

1.问题描述

假设一个系统有三个抽烟者进程和一个供应者进程。
每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。
三个抽烟者中,第一个拥有烟草、第二个拥有纸、第三个拥有胶水。
供应者进程无限地提供三种材料,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一直重复(让三个抽烟者轮流地抽烟)

在这里插入图片描述

2.互斥关系

桌子可以抽象为容量为1的缓冲区,要互斥访问。
组合一:纸+胶水
组合二:烟草+胶水
组合三:烟草+纸

3.同步关系

(从事件的角度来分析):
桌上有组合一 → → 第一个抽烟者取走东西
桌上有组合二 → → 第二个抽烟者取走东西
桌上有组合三 → → 第三个抽烟者取走东西
发出完成信号 → → 供应者将下一个组合放到桌上

在这里插入图片描述

4.代码实现(轮流让各个吸烟者吸烟)

定义同步信号量和缓冲区:
在这里插入图片描述
提供者函数:
在这里插入图片描述
吸烟者函数:
在这里插入图片描述

在这个问题中,不需要设置专门的互斥信号量。
原因是缓冲区大小为1,同一时刻,四个同步信号量中至多有一个的值为1。

若一个生产者要生产多种产品(或者说会引发多种前驱事件),那么各个V操作应该放在各自对应的“事件”发生之后的位置。

2.读者写者问题

1.问题描述

有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。
因此要求:
①允许多个读者可以同时对文件执行读操作;
②只允许一个写者往文件中写信息;
③任一写者在完成写操作之前不允许其他读者或写者工作;
④写者执行写操作前,应让已有的读者和写者全部退出。

2.互斥关系

两类进程:写进程、读进程。
互斥关系:写进程―写进程、写进程―读进程。
读进程与读进程不存在互斥问题。

3.代码实现

定义信号量
在这里插入图片描述
读者函数:
在这里插入图片描述
写者函数:
在这里插入图片描述

结论:
在这种算法中,连续进入的多个读者可以同时读文件;
写者和其他进程不能同时访问文件;
写者不会饥饿,但也并不是真正的“写优先”,而是相对公平的先来先服务原则。
有的书上把这种算法称为“读写公平法”。

  1. 读者-写者问题为我们解决复杂的互斥问题提供了一个参考思路。
  2. 其核心思想在于设置了一个计数器count用来记录当前正在访问共享文件的读进程数。
  3. 我们可以用count的值来判断当前进入的进程是否是第一个/最后一个读进程,从而做出不同的处理。
  4. 另外,对count变量的检查和赋值不能一气呵成导致了一些错误,如果需要实现“一气呵成”,自如果需要实现“一气呵成”,自然应该想到用互斥信号量。

3.哲学家进餐问题

1.问题描述

一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。
哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。
只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根地拿起)。
如果筷子己在他人手上,则需等待。
饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。

在这里插入图片描述

2. 互斥关系

  1. 系统中有5个哲学家进程,5位哲学家与左右邻居对其中间筷子的访问是互斥关系。
  2. 这个问题中只有互斥关系,但与之前遇到的问题不同的事,每个哲学家进程需要同时持有两个临界资源才能开始吃饭。如何避免临界资源分配不当造成的死锁现象,是哲学家问题的精髓。
  3. 信号量设置:定义互斥信号量数组 c h o p s t i c k [ 5 ] = 1 , 1 , 1 , 1 , 1 chopstick[5]={1,1,1,1,1} chopstick[5]=1,1,1,1,1用于实现对5个筷子的互斥访问。并对哲学家按0~4编号,哲学家i左边的筷子编号为i,右边的筷子编号为(i+1)%5。

3.防止死锁的发生的三种思路

  1. 可以对哲学家进程施加一些限制条件,比如最多允许四个哲学家同时进餐。这样可以保证至少有一个哲学家是可以拿到左右两只筷子的
  2. 要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有中一个可以拿起第一只筷子,另一个会直接阻塞。这避免了占有一支后再等待另一只的情况。
  3. 仅当一个哲学家左右两支筷子都可用时才允许他抓起筷子。更准确的说法应该是:各哲学家拿筷子这件事必须互斥的执行。这就保证了即使一个哲学家在拿筷子拿到一半时被阻塞,也不会有别的哲学家会继续尝试拿筷子。这样的话,当前正在吃饭的哲学家放下筷子后,被阻塞的哲学家就可以获得等待的筷子了。

哲学家进餐问题的关键在于解决进程死锁。

这些进程之间只存在互斥关系,但是与之前接触到的互斥关系不同的是,每个进程都需要同时持有两个临界资源,因此就有“死锁”问题的隐患。

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

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

相关文章

【MyBatis】MyBatis 详解

MyBatis 详解 一. MyBatis 是什么二. MyBatis 在整个框架中的定位三. MyBatis 的操作1. 先创建好数据库和表2. 添加MyBatis框架⽀持3. 修改配置文件4. 添加业务代码5. 增、删、改操作① 增加⽤户② 修改用户操作③ 删除操作 6. 查询操作① 单表查询② 多表查询 一. MyBatis 是什…

Ubuntu16.04apt更新失败

先设置网络设置 换成nat、桥接,如果发现都不行,那么就继续下面操作 1.如果出现一开始就e,检查源,先换源 2.换完源成功之后,ping网络,如果ping不通就是网络问题 如果ping baidu.com ping不通但是ping 112…

2023年中国非晶带材产量、竞争现状及行业市场规模前景分析[图]

非晶带材指生产工艺采用急速冷却技术将含铁、硅、硼等元素的合金熔液以每秒百万度的速度快速冷却后得到的带材,其物理状态表现为金属原子呈长程无序的非晶体排列。非晶带材及其制品非晶铁心主要用于电力领域,是非晶配电变压器的主要用材及核心部件。 我国…

Git入门详解

Git入门详解 本文承接上文 Git入门简介 并做了内容扩充。本文讲述Git工具的安装、配置及使用友情参考链接:https://gitee.com/all-about-git 1. Git安装 安装官网:https://git-scm.com/安装过程如下: 双击.exe默认安装即可 2. Git配置 …

基于DBC Signal Group生成Autosar SR接口(1)

文章目录 前言实现方法结构体在Simulink中的定义SignalGroup提取 总结 前言 在开发Autosar CAN通信模块时,对于Signal Group需要建立对应的Interface,其中的数据类型实际是一个结构体,包含Group中的Signal的数据类型定义。手动建立比较费时间&#xff0…

2023年中国人防服务需求现状及行业市场规模前景分析[图]

人防服务指利用人发现风险事件,并延迟或阻止风险事件的发生,在自身力量不足的情况下发出应急救援信号,以待做出进一步的反应,制止风险事件的发生或处理已发生的风险事件。人防服务是保安服务公司最基本的业务内容。2022年国内保安…

日常学习收获之----react的ref和wrappedComponentRef的区别

react获取子组件的方式,有ref和wrappedComponentRef。那这两者有什么区别呢? 区别在于是否用了高阶组件!!!!!!!!!!!&#…

中国鞋业品牌步力宝:传统制造业蜕变为资本上市公司的光辉征程

​中国鞋业,作为典型的劳动密集型产业,一直在不断演进。从最初的皮鞋、布鞋、胶鞋、塑料鞋(化学鞋)四大类鞋,到今天的复杂多样,中国鞋业一直在追求更高的品质和创新。随着社会的进步和科学技术的发展&#…

第二证券:临时停牌一般多久?

随着股票买卖市场的日益开展,股票买卖的监管也越来越严格。而前段时刻,上市公司中多家公司被暂时停牌,此举引起了公众对于暂时停牌时刻的重视。那么,暂时停牌一般多久?本篇文章将从多个视点出发,对这一问题…

迅为RK3568开发板Scharr滤波器算子边缘检测

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程\04_OpenCV 开发配套资料\33”目录下,如下图所示: 在 Sobel 算子算法函数中,如果设置 ksize-1 就会使用 3x3 的 Scharr 滤波器。Scharr 算子是 Soble 算子在 ksize…

基于Python和Tkinter的双目相机驱动界面

文章目录 前言准备工作代码分析初始化创建按钮创建图像显示区域创建信息标签启动摄像头捕捉主函数结论效果展示 前言 本文将介绍如何使用Python和Tkinter库来创建一个简单的摄像头应用程序。这个应用程序可以打开摄像头,显示摄像头捕捉的图像,并允许用户…

Nosql redis高可用和持久化

Nosql redis高可用和持久化 1、redis高可用2、redis持久化2.1redis持久化2.2Redis 持久化方法2.3RDB 持久化2.3.1RDB持久化工作原理2.3.2触发条件2.3.3其他自动触发机制2.3.4执行流程2.3.5启动时加载 2.4AOF 持久化2.4.1AOF持久化原理2.4.2开启AOF2.4.3执行流程2.4.4文件重写的…

8+结合10种机器学习算法构建模型,可复现。

今天给同学们分享一篇机器学习的生信文章“Comprehensive machine-learning survival framework develops a consensus model in large-scale multicenter cohorts for pancreatic cancer”,这篇文章于2022年10月25日发表在eLife期刊上,影响因子为8.713。…

小游戏开发者应该如何入局赛道

一、微信小游戏赛道发展史 第一阶段:轻度试水期,2017~2019年 微信小游戏于2017年底上线,初期以轻度休闲为主,例如棋牌、合成消除以及益智相关游戏类型。一是开发门槛不高,产品可以快速上线; 二是大部分厂…

功率信号源在电子测试中的应用有哪些方面

功率信号源在电子测试中有着广泛的应用,可以提供稳定、可调的功率信号,用于各种测量和验证工作。下面西安安泰将介绍功率信号源在电子测试中的几个主要应用方面。 图:ATG-2000系列功率信号源 无线通信测试:功率信号源在无线通信测…

【three.js】结合vue进行开发第一个3d页面

一、创建vue项目 新建一个项目目录,在集成终端打开,输入 npm init vitelatest 回车后,依次输入项目名,选择vue和js开发 然后安装依赖并运行项目 二、安装three 接下来我们开始安装three npm install three 三、Three.js 的…

【Unity3D赛车游戏制作】开始场景搭建——UGUI复合控件Button

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

leetcode 每日一题复盘(10.9~10.15)

leetcode 101 对称二叉树 这道题一开始想是用层序遍历,看每一层是否都对称,遇到一个问题就是空指针(子树为空)无法记录下来,同时会导致操作空指针的问题,因此需要修改入队条件,并用一个标志去表示空指针 vector<int>numv;for(int i0;i<size;i){TreeNode*frontque.fro…

JavaScript ES5实现继承

一、对象和函数的原型 1.认识对象的原型 JavaScript当中每个对象都有一个特殊的内置属性 [[prototype]]&#xff0c;这个特殊的对象可以指向另外一个对象。 那么这个对象有什么用呢&#xff1f; 当我们通过引用对象的属性key来获取一个value时&#xff0c;它会触发 **[[Get…