【操作系统】进程-哲学家进餐问题
王道考研学习笔记
问题分析
一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学
家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时
才试图拿起左、右两根筷子(一根一 根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲
学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。
问题分析
1.关系分析。系统中有5个哲学家进程,5位哲学
家与左右邻居对其中间筷子的访问是互斥关系。
2.整理思路。这个问题中只有互斥关系,但与之前
遇到的问题不同的事,每个哲学家进程需要同时
持有两个临界资源才能开始吃饭。如何避免临界
资源分配不当造成的死锁现象,是哲学家问题的
精髓.
3.信号量设置。定义互斥信号量数组
chopstick [5]=(1,1,1,1,1}用于实现对5个筷子的互
斥访问。并对哲学家按0~4编号,哲学家i左边
的筷子编号为i,右边的筷子编号为 (i+1)%5。
代码实现
semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex=1;
pi(){
p(mutex);//实现哲学家之前互斥的拿起筷子
p(chopstick[i]);//拿起左边的筷子
p(chopstick[(i+1)%5]);//拿起右边的筷子
。。。哲学家进餐
v(chopstick[i]);//放下左边的筷子
v(chopstick[(i+1)%5]);//放下右边的筷子
v(mutex);
}
【操作系统】进程-哲学家进餐问题相关推荐
- 【操作系统】哲学家进餐问题
问题描述 一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆着一根筷子,桌子的中间是一碗米饭,哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人.只有当哲学家饥饿时,才试图拿起左.右两根 ...
- 操作系统:哲学家进餐问题
哲学家进餐问题 五个哲学家围着一张圆桌,每个哲学家面前放着食物.哲学家的生活有两种交替活动:吃饭以及思考.当一个哲学家吃饭时,需要先拿起自己左右两边的两根筷子,并且一次只能拿起一根筷子. 下面是一种错 ...
- 【操作系统】“哲学家进餐”问题
"哲学家进餐"问题 有五个哲学家,他们的生活方式是交替地进行思考和进餐.他们共用一张圆桌,分别坐在五张椅子上. 在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用 ...
- 操作系统(四) | 经典进程的同步问题(生产者--消费者问题、哲学家进餐问题、读者--写者问题)
文章目录 生产者--消费者问题 分析 实现 哲学家进餐问题 方法一:最多4人同时拿左筷子,最终保证一人能进餐 方法二:同时给左右筷子 解法1:AND信号量 解法2:信号量保护机制 方法三:让奇数先左后 ...
- 【操作系统实验】Linux环境下用进程实现哲学家进餐问题——C语言完整代码+详细实验报告
[注意]代码在文末,以下为详细实验报告 [实验目的] 以哲学家进餐问题为例,学习并熟悉Linux下进程通信.同步机制的具体实现方法,主要是了解并掌握信号量机制和避免死锁的使用方法,使得不会出现哲学 ...
- 操作系统之进程管理:15、哲学家进餐问题
15.哲学家进餐问题 问题描述 解题思路 解决死锁的策略 方案一与方案二 方案三 注 问题描述 解题思路 1.因为需要左手和右手俩只筷子,所以可以直接拿哪只就对哪只上锁 问题:这样的话当每个人都拿走左 ...
- 【操作系统】进程:哲学家进餐问题
问题描述: 有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左.右最靠近他的筷子,只 ...
- 【操作系统】-- PV原语(哲学家进餐问题)
微信搜索:编程笔记本 微信搜索:编程笔记本 微信搜索:编程笔记本 点击上方蓝字关注我,我们一起学编程 欢迎小伙伴们分享.转载.私信.赞赏 小伙伴儿们看完以后可不可以帮我点亮一下在看呀~ 信号量与进程同 ...
- 2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
目录 1.读者-写者问题 2.哲学家进餐问题 实现 3.管程 1.为什么要引入管程? 2.管程的定义和基本特征 3.扩展1:用管程解决生产者消费者问题 4.扩展2:Java中类似于管程的机制 个人 ...
最新文章
- 使用sn.exe为程序集签名
- 中国移动系统集成公司2020春招技术综合在线编程题第一题
- Android 顶部切换实现(二)
- java 虚类_java虚方法
- idea-spark-sbt 打包jar
- 常用开发环境搭建配置教程(OneStall)
- 【智能AI】准确率97%的开源肺炎检测模型
- Uncompilable source code in netbeans
- 学习笔记_vnpy实战培训day02
- 【iCore3 双核心板_ uC/OS-III】例程二:任务的建立与删除
- Qt网络编程——TCP
- python抛出异常 后如何接住,Python 异常的捕获、异常的传递与主动抛出异常操作示例...
- HDU 1166 - 敌兵布阵
- 【算法随记四】自动色阶、对比度、直方图均衡等算法的一些小改进。
- (转)“在证券行业,技术不重要,不要过分强调!”
- vue 检测ie版本_vue 兼容低版本ie浏览器
- 怎么从php文件中查找代码,php类在文件中查找类文件,但不查找类
- MFC操作Access数据库
- 超六类网线和六类网线的区别—Vecloud
- 运用nginx和阿里云解析配置二级域名 设置不同端口号