哲学家就餐问题

问题描述

哲学家就餐问题是一个经典的问题,最初是由E.W. Dijkstra算法制定,以证明在计算机科学和并发或并行处理的编程经典问题。

四个哲学家坐在一张桌子旁,度过了生命的思考和吃的无限循环。一位哲人必须拿起两个叉,他可以吃。你可以把哲学家并发进程和叉作为共享资源。问题是要确定政策或算法,使每个哲学家得吃,不会饿死。例如,一个算法是每个哲学家拿起第一叉右手,然后叉在他左边,他吃了。这将最终导致所有的哲学家都拿着一个叉子,等待对方放下叉子死锁情况。

哲学家型号

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

资源层次解决方案

这里示出的算法是通过迪杰斯特拉描述的原始算法的变型。每个叉被编号和哲学家第一拾取编号较小的叉,然后较大编号的叉。该算法足以避免死锁,因为只有一个哲学家可以永远抱着编号最高的叉,因此是哲学家可以继续吃。

结果

第一个图显示所有四个哲学家,因为他们的思想,饥饿,吃之间循环的甘特图。

第二张图显示了模拟过程中所有四个哲学家的瞬时状态。从哲学家(实心圆)引出的线,一个叉(圆角矩形)表示哲学家拾起叉,因此叉为它的邻居不可用。

僵局

在这个模型中,死锁可以达成,如果哲学家4逆转他的叉子的优先顺序,让他叉1.这违反上述资源层次的约束,并模拟这一变化的模式将导致死锁前拿起叉4所示下面。

上面显示的结果是每个哲学家拿起右叉,每个人都在等待另一个叉变得可用,导致死锁。

参考

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

也可以看看

|||

相关话题