【操作系统】哲学家就餐问题
问题
有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。每个哲学家的行为是思考,感到饥饿,然后吃通心粉。为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。
一个简单的解法是,用一个信号量表示一支筷子,这五个信号量构成信号量数组,所有信号量初始值为1,第I个哲学家的活动课描述为:
semaphore chopstick[0…4] = {1,1,1,1,1};
Repeatthink;wait(chopstick[i]);wait(chopstick[(i+1) mod 5]);eat;signal(chopstick[i]);signal(chopstick[(i+1) mod 5]);
until false;
若五位哲学家同时饥饿而各自拿起了左边的筷子,这使五个信号量 chopstick 均为 0,当他们试图去拿起右边的筷子时,都将因无筷子而无限期地等待下去,即可能会引起死锁。为防止死锁发生,哲学家进餐问题的改进解法:
方法一:至多只允许四位哲学家同时去拿左筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用。
方法二:仅当哲学家的左右手筷子都拿起时才允许进餐。
方法三:规定奇数号哲学家先拿左筷子再拿右筷子,而偶数号哲学家相反。
请用PV操作描述上述三种方法。
解决方法
方法一
至多只允许四位哲学家同时去拿左筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用
int chopstick[5] = {1, 1, 1, 1, 1};
int man = 4; //最多4个人可以拿左筷子
Philosopher( int i ) { //第i个哲学家while( true ) {think();wait( man ); //拿左筷子的哲学家不超过4个wait( chopstick[i] );wait( chopstick[ (i+1)%5 ] );eat();signal( chopstick[i] );signal( chopstick[(i+1)%5] );signal( man );}
}
方法二
仅当哲学家的左右手筷子都拿起时才允许进餐,否则将拿起的筷子放下
(1)为便于理解(2),先使用AND型信号量int chopstick[5] = {1, 1, 1, 1, 1};
Philosopher( int i ) {while( true ) {think();Swait( chopstick[i], chopstick[(i+1)%5] );eat();Ssignal( chopstick[i], chopstick[(i+1)%5] );}
}(2) 使用PV操作// 使用加锁方式,将取左右筷子的过程绑定为原子操作
int chopstick[5] = {1, 1, 1, 1, 1};
int muitex = 1;
Philosopher( int i ) {while( true ) {think();wait( mutex );wait( chopstick[i] );wait( chopstick[(i+1)%5] );signal( mutex );eat();signal( chopstick[i] );signal( chopstick[(i+1)%5] );}
}
方法三
规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家则相反
int chopstick[5] = {1, 1, 1, 1, 1};
Philosopher( int i ) {while( true ) {think();if( i % 2 ) { //奇数号哲学家wait( chopstick[i] );wait( chopstick[(i+1)%5] );} else { //偶数号哲学家wait( chopstick[(i+1)%5] );wait( chopstick[i] );}eat();signal( chopstick[i] );signal( chopstick[(i+1)%5] );}
}
【操作系统】哲学家就餐问题相关推荐
- 操作系统 -- 哲学家就餐问题
转载自:https://blog.csdn.net/qq_28602957/article/details/53538329 有五个哲学家,他们的生活方式是交替地进行思考和进餐.他们共用一张圆桌,分别 ...
- 【操作系统/OS笔记14】经典同步问题:读者-写者问题、哲学家就餐问题
本次笔记内容: 10.6 经典同步问题-1 10.7 经典同步问题-2 10.8 经典同步问题-3 10.9 经典同步问题-4 10.10 经典同步问题-5 10.11 经典同步问题-6 文章目录 读 ...
- 操作系统原理:哲学家就餐经典问题
哲学家就相当于线程,叉子就相当于资源.每个线程需要获取特定的两个资源才可以执行"吃"操作.每个叉子只能被特定的两个线程访问,且访问叉子时是互斥的.假设数据结构设计一个信号量数组,5 ...
- 哲学家就餐 linux实现_Linux哲学的9个主要原则如何影响您
哲学家就餐 linux实现 上一次,我在Linux哲学的影响中讨论了Linux哲学的较高层次的观点. 关于它有一些非常好的讨论,许多博客联合了Opensource.com. 我从上一篇文章中收到的评论 ...
- python解决哲学家就餐问题(and型信号量)
最近操作系统刚学完这部分内容,老师要求下去自己实践一下,在网上看了看发现用python解决该问题的博文很少,而且好多都是错的,于是就自己写了一段代码 # and型信号量解决哲学家就餐问题 import ...
- 进程同步与互斥——哲学家就餐问题源码实现(dining philosopher’s problem)
传送门: 进程同步与互斥--信号量(实现锁.条件变量) 进程同步与互斥--哲学家就餐问题源码实现(dining philosopher's problem) 进程同步与互斥--读者/写者问题源码实现( ...
- php 哲学家进餐,IPC问题-哲学家就餐(示例代码)
如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃.哲学家在桌上只有思考(等待)和吃面(执行).看起来最多是只有2个人能同时吃. 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样都没法吃了 ...
- 哲学家就餐问题c语言_哲学家就餐问题的一种Python解决方案
哲学家就餐问题一直是多线程同步问题的经典案例,本文中展示了多线程竞争共享资源带来的死锁问题,并介绍了一种简单的解决方案. 哲学家就餐问题 哲学家最擅长的就是思考和吃饭 ,当他们感觉累的时候,就会拿起一 ...
- 哲学家就餐问题--信号量和互斥量预防死锁
哲学家就餐问题可以采取预防死锁的方案,就是使用互斥量和信号量锁定资源. 互斥量: 对资源进行锁定的意思就是说,当一个哲学家使用叉子的时候,他首先要先把叉子锁定,然后,拿起来.这个时候如果别的哲学家也来 ...
- 哲学家就餐与死锁问题,死锁产生的条件以及解决方案
请结合经典案例-哲学家就餐,来谈谈你对死锁的理解,以及怎么预防和解除死锁? 哲学家就餐 描述:在一张圆桌上,有n个哲学家,n支筷子,他们的生活方式只是交替地进行思考和进餐,饥饿时便试图取其左.右最靠近 ...
最新文章
- mysql filde_备份一个约250G的mysql实例【xtrabackup备份方案对比】
- '*','*args','**','**kwargs'
- Nginx中浏览器缓存的执行流程
- python调用cmd命令释放端口_Python——cmd调用(os.system阻塞处理)(多条命令执行)...
- 异常处理关于数组java_关于java异常处理的自我学习
- linux mv时间,简介Linux中cp和mv搭配{,}在shel_l当中的用法
- 中国DCS品牌知名度调查
- window7下visio 2013 64位激活工具
- 实例化方式的比较 Activator和new
- SAP vf11发票冲销
- Android漂浮碰壁动画
- python pandas合并多个excel,三行Python代码,合并多个Excel文件
- 网络安全实验室-基础关 WP
- 个人收藏之 - 一些网站
- 王道考研论坛--算法基础
- 目标检测mAP计算详解
- ubunto16.04 安装配置
- Swoft入门及技术指南
- 快应用,就是站长们的恶梦。加了百度必K站
- Keysight公司B2961A型电源直流电压输出测试