【牛客】哲学家就餐问题+进程竞争

来源:互联网 发布:linux server 版本 编辑:程序博客网 时间:2024/06/05 11:31

1. 问题描述

场景:5个哲学家,5把叉子,5盘意大利面(意大利面很滑,需要两把叉子才能拿起)大家围绕桌子,进行思考与进食的活到,如下图所示。

哲学家的活动方式为:要么放下左右手刀叉进行思考,要么拿起刀叉开始吃饭(刀叉拿起时,必须拿两把,而且只能左右手依次拿,先左手拿左边,后右手拿右边,或者先右手拿右边,左边拿左边)。其只有这两种交替状态。

哲学家们面临的问题为:如何安排哲学家们一致的行动逻辑,保证他们至少有人且尽可能两个人能同时拿到两把叉子开始吃饭,而不会发生“死锁”,“饥饿”,“干等”的状态。需要注意的是,大家想吃饭的时机是随机的,想思考的时机也是随机的,这个不受控制,不可能由“你”来安排哲学家们哪几个先吃,哪几个后吃,他们不受你控制,但你要赋予他们一种性格,或者说思考方式,保证他们自主的思考,自主的解决问题。

  • 死锁:大家都同时想吃饭,结果同时拿起左手边叉子,发现同时右边没有叉子,然后各怀私心,僵持者希望有人能放下他左手边叉子,然后抢夺之,开始吃意大利面,结果大家都没放。。。
  • 饥饿:大家都同时想吃饭,结果同时拿起左手边叉子,发现同时右边没有叉子,然后都很慷慨,结果大家同时放下左手边叉子,然后大家发现有叉子了,又同时开始拿起左手边叉子,又同时放下,如此反复。。。
  • 干等:假设想拿叉子这个想法的产生是一个“原子”操作,即不可同时发生,不可中断,然后一旦有人想拿,就进化为X教授,然后用能力控制了其他人处于僵化状态,然后开始独享,独享完后放下叉子想思考了,立即丧失超能力,于是其余四人回归正常,然后5人中再次有人想拿叉子,进化为教授,周而复始。但是这样,尼玛一个人吃,其余四个干看着啊。。怎么说也有5把叉子,5盘意大利面,至多可以两个人同时吃的。
2.进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件
1 )互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2 )请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3 )不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4 )环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
3.例题:
若系统中有五台打印机,有多个进程均需要使用两台,规定每个进程一次仅允许申请一台,则在不发生死锁的情况下至多允许______个进程参与竞争
解答:4
哲学家就餐问题:当5个进程的时候如果都同时申请到了1台,就发生死锁了。如果是4个进程,那必然有一个能申请到2台