主要内容

就餐哲学家问题

问题描述

用餐哲学家的问题是一个经典问题,最初由E.W. Dijkstra提出,以展示计算机科学中的经典问题以及并发或平行过程的编程。

四个哲学家坐在桌子旁,在无限的思维和饮食周期中度过生命。哲学家必须在他进食之前捡起两个叉子。您可以将哲学家视为并发过程和叉子作为共享资源。问题是确定政策或算法,以便每个哲学家都可以吃饭并且不会饿死。例如,一个算法是让每个哲学家先将叉子拿到他的右边,然后在他进食之前将叉子拿到左边。这最终将导致一个僵局,所有哲学家都拿着一个叉子,互相等待叉子放下叉子。

哲学家模型

该示例将每个哲学家建模为一个离散事件系统,该系统在模拟开始时生成一个实体。实体在系统中的位置反映了哲学家的状态。哲学家的每个状态都是可以在随机时间内持有实体的实体服务器。

资源层次结构解决方案

这里说明的算法是Dijkstra描述的原始算法的变体。每个叉子都是编号的,哲学家首先拿起较小的叉子,然后拿起较大的编号叉。该算法足以避免僵局,因为只有一位哲学家可以持有数量最高的叉子,因此哲学家可以继续吃饭。

结果

第一个图显示了所有四个哲学家在思考,饥饿和饮食之间循环时的甘特图。

第二个图显示了模拟过程中所有四个哲学家的瞬时状态。从哲学家(填充的圆圈)到叉子(圆形矩形)的一条线表明,哲学家已经选择了叉子和叉子,因此叉子对其邻居不可用。

僵局

在此模型中,如果哲学家4扭转了他的叉子偏好命令,则可以结束僵局以下。

上面的结果表明,每个哲学家都捡起了正确的叉子,每个人都在等待另一叉叉就可以使用,造成僵局。

参考

[1]用餐哲学家问题-Wikipedia(https://en.wikipedia.org/wiki/dining_philosophers_problem

也可以看看

|||

相关话题