转载自:https://blog.csdn.net/qq_28602957/article/details/53538329

有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。

在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。

哲学家进餐问题可看作是并发进程并发执行时处理共享资源的一个有代表性的问题。

此算法可以保证不会有相邻的两位哲学家同时进餐。

若五位哲学家同时饥饿而各自拿起了左边的筷子,这使五个信号量 chopstick 均为 0,当他们试图去拿起右边的筷子时,都将因无筷子而无限期地等待下去,即可能会引起死锁。

哲学家进餐问题的改进解法

  • 方法一:至多只允许四位哲学家同时去拿左筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用。
  • 方法二:仅当哲学家的左右手筷子都拿起时才允许进餐。
  • 方法三:规定奇数号哲学家先拿左筷子再拿右筷子,而偶数号哲学家相反。

方法一

至多只允许四位哲学家同时去拿左筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用。

设置一个初值为 4 的信号量 r,只允许 4 个哲学家同时去拿左筷子,这样就能保证至少有一个哲学家可以就餐,不会出现饿死和死锁的现象。

原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。

方法二

仅当哲学家的左右手筷子都拿起时才允许进餐。

解法 1:利用 AND 型信号量机制实现。

原理:多个临界资源,要么全部分配,要么一个都不分配,因此不会出现死锁的情形。

解法 2:利用信号量的保护机制实现。

原理:通过互斥信号量 mutex 对 eat() 之前取左侧和右侧筷子的操作进行保护,可以防止死锁的出现。

方法三

规定奇数号哲学家先拿左筷子再拿右筷子,而偶数号哲学家相反。

原理:按照下图,将是 2,3 号哲学家竞争 3 号筷子,4,5 号哲学家竞争 5 号筷子。1 号哲学家不需要竞争。最后总会有一个哲学家能获得两支筷子而进餐。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. P3321 [SDOI2015]序列统计(离散对数下NTT,乘法换加法)
  2. Matlab系统信息、系统命令和跨平台
  3. Linux系统运维工程师PDF文档精选
  4. openstack系列文章(二)
  5. vuecli3+webpack4优化实践(删除console.log和配置dllPlugin)
  6. javascript(面向对象,作用域,闭包,设计模式等)
  7. PYTOHN1.day14
  8. [Ext JS 7]基于NPM的开发
  9. java语言环境变量_java语言环境jdk的安装和环境变量的配置
  10. linux grep,egrep,正则表达式
  11. Vista暴力破解器只是一个玩笑 谁说破解谁撒谎
  12. js vue 截取分割字符串数据
  13. 计算机控制技术课程简介与资料
  14. 从步履蹒跚到举重若轻,阿里基础架构如何扛住全球最猛的流量洪峰?
  15. 阿里云对象存储OSS中上传的资源在生成URL链接时直接在浏览器中打开而不是下载的问题解决方法
  16. 使用 AndroidSocketClient 库建立 SSL 安全链接
  17. 给IDEA换个酷炫的主题,有点好看!
  18. struts2框架深入
  19. 【论文阅读】Efficient Reading of Papers in Science and Technology
  20. CSGO手套武器箱直接卖还是开了再卖?

热门文章

  1. 【Java -- Map】
  2. NB-IoT智能配电柜测温监测系统解决方案
  3. 波导Z769手机java下载_手机指令秘籍传授
  4. 小巧的绿色html导航引导页
  5. python3.7 openpyxl函数 拆分 excel 单元格
  6. python怎样按某一列值拆分Excel表格
  7. mysql数据库物理结构_MySQL数据库结构设计(物理设计)
  8. 第三阶段.Linux+arm
  9. 记录一下git 打patch导入patch遇到的问题
  10. (win11)VMware虚拟机Ubuntu系统--C语言(操作系统实验课)