哲学家就餐问题

问题描述

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

四位哲学家坐在一张桌子旁,在思考和吃饭的无限循环中度过他们的一生。一个哲学家在他能吃之前必须把两个叉子都拿起来。您可以将哲学家看作并发进程,而将分叉看作共享资源。问题是要确定策略或算法,让每个哲学家都有吃的,而不是挨饿。例如,有一个算法是让每个哲学家在用餐前先拿起右手边的叉子,然后拿起左手边的叉子。这最终会导致一个僵局,所有的哲学家都拿着一个叉子,等着对方放下叉子。

哲学家模型

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

资源层次结构解决方案

这里展示的算法是Dijkstra描述的原始算法的变体。每一把叉子都有编号,哲学家们首先拿起小的有编号的叉子,然后拿起大的有编号的叉子。这个算法足以避免死锁,因为只有一个哲学家可以持有最高编号的叉子,因此这个哲学家可以继续吃东西。

结果

第一个图显示了四个哲学家在思考、饥饿和吃之间循环的甘特图。

第二幅图显示了所有四个哲学家在模拟过程中的瞬时状态。从哲学家(填充圆)到叉子(圆角矩形)画的线表明哲学家已经拿起了那个叉子,因此这个叉子对它的邻居来说是不可用的。

死锁

在这个模型中,如果哲学家4颠倒了他的fork偏好顺序,在fork 1之前拿起fork 4,就会出现死锁。这违反了上述资源层次结构约束,并且使用此更改模拟模型将导致死锁,如下所示。

上面的结果表明,每个哲学家都拿起了正确的分叉,每个人都在等待另一个分叉可用,这导致了一个死锁。

参考

[1]餐饮哲学家问题-维基百科(https://en.wikipedia.org/wiki/Dining_philosophers_problem

另请参阅

|||

相关话题