如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃。哲学家在桌上只有思考(等待)和吃面(执行)。看起来最多是只有2个人能同时吃。

版本一:这个思路的最糟糕的就是都拿起左边叉子,那样都没法吃了,直接死锁。

版本二:改进版本一,如果拿起左边叉子,先看右边是否能用,不可用的话放下左边叉子等待一段时间再运行。这个思路的问题就是,会产生某个时刻每个人都拿起左叉子,又放下,又拿起,虽然没有死锁,但是没有人在吃面,消耗了性能但是任务没有进展,造成饥饿。

版本三:改进版本二,每次等待右边是否能用的每个哲学家(线程)时间不一样,这个方法看起来ok,但是考虑到极度糟糕情况下,它仍不能稳定,对于极度要求稳定的场合显然也是不合适的。

版本四:我们可以对think后加一个互斥量,就是在拿起左叉子前,就加上一个互斥量,别人就没法拿叉子了,放下互斥量在去掉,但问题是性能差,一次只能有一位人吃面,一开始我们就分析过其实可以两个人同时吃的。

这是新的解法:其实就是在版本四的基础上对每个要拿起叉子的哲学家进行了left 和 right的饥饿状态判断,只有当邻居都不在饮食的基础上才能饮食。这样既不会死锁也不会饥饿,且性能满足了。

下面为Wiki的解释和方法:

服务生解法

一个简单的解法是引入一个餐厅服务生,哲学家必须经过他的允许才能拿起餐叉。因为服务生知道哪只餐叉正在使用,所以他能够作出判断避免死锁。

为了演示这种解法,假设哲学家依次标号为A至E。如果A和C在吃东西,则有四只餐叉在使用中。B坐在A和C之间,所以两只餐叉都无法使用,而D和E之间有一只空余的餐叉。假设这时D想要吃东西。如果他拿起了第五只餐叉,就有可能发生死锁。相反,如果他征求服务生同意,服务生会让他等待。这样,我们就能保证下次当两把餐叉空余出来时,一定有一位哲学家可以成功的得到一对餐叉,从而避免了死锁。

资源分级解法

另一个简单的解法是为资源(这里是餐叉)分配一个偏序或者分级的关系,并约定所有资源都按照这种顺序获取,按相反顺序释放,而且保证不会有两个无关资源同时被同一项工作所需要。在哲学家就餐问题中,资源(餐叉)按照某种规则编号为1至5,每一个工作单元(哲学家)总是先拿起左右两边编号较低的餐叉,再拿编号较高的。用完餐叉后,他总是先放下编号较高的餐叉,再放下编号较低的。在这种情况下,当四位哲学家同时拿起他们手边编号较低的餐叉时,只有编号最高的餐叉留在桌上,从而第五位哲学家就不能使用任何一只餐叉了。而且,只有一位哲学家能使用最高编号的餐叉,所以他能使用两只餐叉用餐。当他吃完后,他会先放下编号最高的餐叉,再放下编号较低的餐叉,从而让另一位哲学家拿起后边的这只开始吃东西。

尽管资源分级能避免死锁,但这种策略并不总是实用的,特别是当所需资源的列表并不是事先知道的时候。例如,假设一个工作单元拿着资源3和5,并决定需要资源2,则必须先要释放5,之后释放3,才能得到2,之后必须重新按顺序获取3和5。对需要访问大量数据库记录的计算机程序来说,如果需要先释放高编号的记录才能访问新的记录,那么运行效率就不会高,因此这种方法在这里并不实用。

Chandy/Misra解法

1984年,K. Mani Chandy和J. Misra提出了哲学家就餐问题的另一个解法,允许任意的用户(编号{displaystyle P_{1},cdots ,P_{n}}

)争用任意数量的资源。与资源分级解法不同的是,这里编号可以是任意的。

把餐叉凑成对,让要吃的人先吃,没餐叉的人得到一张换餐叉券。

饿了,把换餐叉券交给有餐叉的人,有餐叉的人吃饱了会把餐叉交给有券的人。有了券的人不会再得到第二张券。

保证有餐叉的都有得吃。

这个解法允许很大的并行性,适用于任意大的问题。

php 哲学家进餐,IPC问题-哲学家就餐(示例代码)相关推荐

  1. 【操作系统实验】Linux环境下用进程实现哲学家进餐问题——C语言完整代码+详细实验报告

    [注意]代码在文末,以下为详细实验报告 [实验目的]   以哲学家进餐问题为例,学习并熟悉Linux下进程通信.同步机制的具体实现方法,主要是了解并掌握信号量机制和避免死锁的使用方法,使得不会出现哲学 ...

  2. 哲学家进餐问题(java模拟死锁及解决方案)

    一.问题描述 哲学家进餐问题是由 Dijkstra 提出并解决的,该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐.平时 ...

  3. 死锁(哲学家进餐问题)基本介绍和解决办法

    死锁的基本介绍: 死锁指两个或两个以上进程在执行过程中,由于资源竞争或者由于彼此通信而造成的一种阻塞现象,若无外力作用,他们将无法继续运行下去.哲学家进餐问题: 哲学家进餐问题: 哲学家进餐问题是荷兰 ...

  4. 哲学家进餐问题pv_【jMiniLang】哲学家就餐问题

    演示GIF(1.57MB),控制台输出效果(还有parser/vm/ui)自己实现: 信号量与PV原语 信号量为正数代表有空闲资源,为零与负数代表没有空闲资源.负数的绝对值代表等待的进程个数.信号量用 ...

  5. IPC之哲学家进餐问题

    A问题: 1965年,Dijkstra提出并解决了一个他称之为哲学家进餐的同步问题. "五个哲学家围坐在一张圆桌周围,每个哲学家的前面都有一份通心面,由于面条很滑,必须使用2把叉子才能夹住. ...

  6. Linux哲学家进餐杀死进程,100分跪求“哲学家就餐问题”在 Linux下运行的源代码(后缀名为.c)!!!...

    如题. | 代码大致如下,当然不能直接使用,我没写P,V操作的函数. # define N 5 /* 哲学家数目 */ # define LEFT (i-1+N)%N /* i的左邻号码 */ # d ...

  7. java 第六次实验_操作系统第六次实验报告——使用信号量解决哲学家进餐问题...

    0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 通过编程进一步了解信号量. 2 实验内容 在服务器上用Vim编写一个程序:使用信号量解决任一个经典PV问题,测试给出结果,并 ...

  8. 哲学家进餐_我如何通过预算学习计划进餐

    哲学家进餐 by Sterling Osborne, PhD Researcher 作者:斯特林·奥斯本(Sterling Osborne),博士研究员 我如何通过预算学习计划进餐 (How I pl ...

  9. C++实现进程调度模拟程序——哲学家进餐问题

    文章目录 一.开发环境 二.进餐问题 三.系统分析 四.程序流程图 五.源代码 5.1 多线程实现 5.2 C语言模拟 一.开发环境 开发平台: Visual C++6.0 开发环境: Windows ...

最新文章

  1. 计算机视觉相关干货文章-20190807
  2. 数据仓库系列1-高质量数据建模
  3. 《构建之法》8、9、10章
  4. 14英寸电脑长宽多少_首款5G折叠屏电脑发布:看完价格,我酸了
  5. 【嵌入式】C语言程序调试和宏使用的技巧
  6. seo 伪原创_如何判断外包的seo文章是否是抄袭或伪原创?
  7. 基于css3的鼠标滑动按钮动画之CSS--续
  8. [css] 说下你对background-size的理解,它有什么运用场景?
  9. python字典购物车实现的功能_python购物车功能实现
  10. IO多路复用之select、poll、epoll介绍
  11. Kafka 几个实现细节
  12. RSS文件的基本格式
  13. 误删除恢复 (extundelete)
  14. 微信小程序开发者工具扫码成功但是进不去
  15. 跨境电商独立站海外引流渠道:Quora运营技巧
  16. android模拟qq进场动画,Android用ViewPager仿QQ实现多页面滑动及动画效果
  17. 马化腾:电力时代孕育了计算机,人工智能兴盛于云计算
  18. turing tree_Turing GPU将如何彻底改变沉浸式AI
  19. 网页Unity3d游戏全离线玩的高招!
  20. java的开发步骤_Java学习1:JAVA开发的步骤

热门文章

  1. springboot项目使用junit4进行单元测试,maven项目使用junit4进行单元测试
  2. Linux通过端口号杀死指定进程
  3. Go 中切片索引与 Python 中列表索引的差异
  4. mysql/mariadb centos7 修改root用户密码及配置参数
  5. 算法最少分组法_数据结构
  6. LeetCode中等题之最优除法
  7. LeetCode简单题之按照频率将数组升序排序
  8. Arm Cortex-M23 MCU,Arm Cortex-M33 MCU与RISC-V MCU技术
  9. 利用UltraScale和UltraScale+FPGA和MPSOC加速DSP设计生产力
  10. 传感器融合带来多重好处