哲学家就餐问题学习笔记

场景:5个哲学家,5根筷子,5盘意大利面(意大利面很滑,需要同时两根筷子才能夹起来)大家围绕桌子,进行思考与进食的活到,如下图所示。
这里写图片描述

哲学家的活动描述:

哲学家除了吃面,还要思考,所以要么放下左右手筷子进行思考,要么拿起两根筷子开始吃饭(哲学家只能拿自己两侧的筷子吃面,不考虑卫生问题,要不两侧的都拿起来吃面,要么就不拿,处于思考状态。吃面和思考其实是交替进行的)。

如何安排哲学家们一致的行动逻辑,保证他们至少有人且尽可能两个人能同时拿到两把叉子开始吃饭,而不会发生“死锁”,“饥饿”,“干等”的状态。这是我们需要考虑的问题。

  • 死锁:大家都同时想吃饭,结果同时拿起左手边叉子,发现同时右边没有叉子,然后各怀私心,僵持者希望有人能放下他左手边叉子,然后抢夺之,开始吃意大利面,结果大家都没放。。。

  • 饥饿:大家都同时想吃饭,结果同时拿起左手边叉子,发现同时5个人右边都没有叉子,然后都很慷慨,结果大家同时放下左手边叉子,然后大家发现有叉子了,又同时开始拿起左手边叉子,又同时放下,如此反复。。。

  • 干等:假设想拿叉子这个想法的产生是一个“原子”操作,即不可同时发生,不可中断,然后一旦有人想拿,就进化为X教授,然后用能力控制了其他人处于僵化状态,然后开始独享,独享完后放下叉子想思考了,立即丧失超能力,于是其余四人回归正常,然后5人中再次有人想拿叉子,进化为教授,周而复始。但是这样,尼玛一个人吃,其余四个干看着啊。。怎么说也有5把叉子,5盘意大利面,至多可以两个人同时吃的。

怎样有比较好的、公平的方法解决哲学家吃意大利面的问题呢?

解决方法:

方法一:

至多只允许四位哲学家同时去拿左筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用。

设置一个初值为 4 的信号量 r,只允许 4 个哲学家同时去拿左筷子,这样就能保证至少有一个哲学家可以就餐,不会出现饿死和死锁的现象。

原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。

这里写图片描述

方法二:

定奇数号哲学家先拿左筷子再拿右筷子,而偶数号哲学家相反。

原理:按照下图,将是 2,3 号哲学家竞争 3 号筷子,4,5 号哲学家竞争 5 号筷子。1 号哲学家不需要竞争。最后总会有一个哲学家能获得两支筷子而进餐。

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_37925202/article/details/81056793
今日推荐