问题

有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。每个哲学家的行为是思考,感到饥饿,然后吃通心粉。为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。
一个简单的解法是,用一个信号量表示一支筷子,这五个信号量构成信号量数组,所有信号量初始值为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] );}
}

【操作系统】哲学家就餐问题相关推荐

  1. 操作系统 -- 哲学家就餐问题

    转载自:https://blog.csdn.net/qq_28602957/article/details/53538329 有五个哲学家,他们的生活方式是交替地进行思考和进餐.他们共用一张圆桌,分别 ...

  2. 【操作系统/OS笔记14】经典同步问题:读者-写者问题、哲学家就餐问题

    本次笔记内容: 10.6 经典同步问题-1 10.7 经典同步问题-2 10.8 经典同步问题-3 10.9 经典同步问题-4 10.10 经典同步问题-5 10.11 经典同步问题-6 文章目录 读 ...

  3. 操作系统原理:哲学家就餐经典问题

    哲学家就相当于线程,叉子就相当于资源.每个线程需要获取特定的两个资源才可以执行"吃"操作.每个叉子只能被特定的两个线程访问,且访问叉子时是互斥的.假设数据结构设计一个信号量数组,5 ...

  4. 哲学家就餐 linux实现_Linux哲学的9个主要原则如何影响您

    哲学家就餐 linux实现 上一次,我在Linux哲学的影响中讨论了Linux哲学的较高层次的观点. 关于它有一些非常好的讨论,许多博客联合了Opensource.com. 我从上一篇文章中收到的评论 ...

  5. python解决哲学家就餐问题(and型信号量)

    最近操作系统刚学完这部分内容,老师要求下去自己实践一下,在网上看了看发现用python解决该问题的博文很少,而且好多都是错的,于是就自己写了一段代码 # and型信号量解决哲学家就餐问题 import ...

  6. 进程同步与互斥——哲学家就餐问题源码实现(dining philosopher’s problem)

    传送门: 进程同步与互斥--信号量(实现锁.条件变量) 进程同步与互斥--哲学家就餐问题源码实现(dining philosopher's problem) 进程同步与互斥--读者/写者问题源码实现( ...

  7. php 哲学家进餐,IPC问题-哲学家就餐(示例代码)

    如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃.哲学家在桌上只有思考(等待)和吃面(执行).看起来最多是只有2个人能同时吃. 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样都没法吃了 ...

  8. 哲学家就餐问题c语言_哲学家就餐问题的一种Python解决方案

    哲学家就餐问题一直是多线程同步问题的经典案例,本文中展示了多线程竞争共享资源带来的死锁问题,并介绍了一种简单的解决方案. 哲学家就餐问题 哲学家最擅长的就是思考和吃饭 ,当他们感觉累的时候,就会拿起一 ...

  9. 哲学家就餐问题--信号量和互斥量预防死锁

    哲学家就餐问题可以采取预防死锁的方案,就是使用互斥量和信号量锁定资源. 互斥量: 对资源进行锁定的意思就是说,当一个哲学家使用叉子的时候,他首先要先把叉子锁定,然后,拿起来.这个时候如果别的哲学家也来 ...

  10. 哲学家就餐与死锁问题,死锁产生的条件以及解决方案

    请结合经典案例-哲学家就餐,来谈谈你对死锁的理解,以及怎么预防和解除死锁? 哲学家就餐 描述:在一张圆桌上,有n个哲学家,n支筷子,他们的生活方式只是交替地进行思考和进餐,饥饿时便试图取其左.右最靠近 ...

最新文章

  1. mysql filde_备份一个约250G的mysql实例【xtrabackup备份方案对比】
  2. '*','*args','**','**kwargs'
  3. Nginx中浏览器缓存的执行流程
  4. python调用cmd命令释放端口_Python——cmd调用(os.system阻塞处理)(多条命令执行)...
  5. 异常处理关于数组java_关于java异常处理的自我学习
  6. linux mv时间,简介Linux中cp和mv搭配{,}在shel_l当中的用法
  7. 中国DCS品牌知名度调查
  8. window7下visio 2013 64位激活工具
  9. 实例化方式的比较 Activator和new
  10. SAP vf11发票冲销
  11. Android漂浮碰壁动画
  12. python pandas合并多个excel,三行Python代码,合并多个Excel文件
  13. 网络安全实验室-基础关 WP
  14. 个人收藏之 - 一些网站
  15. 王道考研论坛--算法基础
  16. 目标检测mAP计算详解
  17. ubunto16.04 安装配置
  18. Swoft入门及技术指南
  19. 快应用,就是站长们的恶梦。加了百度必K站
  20. Keysight公司B2961A型电源直流电压输出测试

热门文章

  1. tornado-简介和原理
  2. JS-取出字符串中重复次数最多的字符并输出
  3. 关于eclipse的indigo版中文注释时字体太小的问题(转)
  4. 东哥读书小记 之 《一个广告人的自白》
  5. 示例 Demo 工程和 API 参考链接
  6. DM9000调试记录
  7. 为何苦命干活的人成不了专家?
  8. 是雏还是鹰mdash;mdash;编程规范之代码注释
  9. pde中微元分析法的主要思想_初中数学常用的思想方法丨所有题型的考试技巧最全整理,高分必备...
  10. npm升级依赖包_Taro跨端开发之依赖管理