主要内容

用餐哲学家问题

问题描述

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

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

哲学家模型

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

资源层次解决方案

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

结果

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

第二张图显示了四位哲学家在模拟过程中的瞬时状态。从哲学家(圆角矩形)到叉子(圆角矩形)的一条线表示哲学家已经拿起了叉子,因此叉子对它的邻居来说是不可用的。

死锁

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

上面的结果表明,每个哲学家都拿起了正确的叉子,每个人都在等待另一个叉子可用,从而导致僵局。

参考文献

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

另请参阅

|||

相关的话题