主要内容

哲学家就餐问题

问题描述

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

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

哲学家模型

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

资源层次结构解决方案

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

结果

第一张图显示的是四位哲学家的甘特图,他们在思考、饥饿和进食之间循环。

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

死锁

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

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

参考文献

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

另请参阅

|||

相关的话题