首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > VxWorks >

哲学家的晚餐解决思路

2012-02-09 
哲学家的晚餐要求:有5个哲学家坐在一个圆桌上。食物摆在桌子中间,桌子上总共有5把叉子,每个哲学家的左右手

哲学家的晚餐
要求:有5个哲学家坐在一个圆桌上。食物摆在桌子中间,桌子上总共有5把叉子,每个哲学家的左右手各有一把。因为吃饭时,哲学家需要同时使用左手和右手的叉子,所以哲学家必须和他左边和右边的哲学家共享叉子。在这个实验中,假定哲学家每次吃饭的时间长度为单位1,吃完一次后则放下两把叉子。如果等待10个单位时间长度之后,哲学家仍没有得到叉子吃饭,则被饿死。你需要设计一种方法使得任何一个哲学家都不被饿死。
有关内容:VxWorks信号量、定时器和消息队列的程序设计,并通过实验了解资源冲突的原因和解决方法。
相关提示:?
  需要考虑的问题:死锁!!!当每个哲学家同时拿到左手的叉子时,同时,每个人又在等待右手的叉子。然而,没有哲学家会放下手中的叉子,所以永远没有人能够开始吃饭。这种情况就会产生死锁并导致永远循环等待。
?为了解决这个问题,你需要使用二进制信号量。为每个叉子创建一个信号量。拿到叉子可以通过调用semTake()来实现,放下叉子可以通过调用semGive()来实现。
?避免出现死锁,在死锁即将发生前解除死锁。
?通过定时器判断哲学家是否被饿死。
?通过WindView来对程序运行结果进行分析。
恳请大家给一点提示。谢谢

[解决办法]
??这个很强。
简单分析一下,1.应该是可以实现,因为同单位时间可以有两个人吃饭,那么在一个哲学家被饿死的10个时间中可以有20个人次吃到食物。而哲学家的总数是五个,所以满足要求。
2.如果是围着圆卓做的话,那么如果一号在吃饭,则他相邻的2号和五号都不能吃了,而不相邻的4号和3号中可以有一个吃饭。
3,如果这样的话我有个思路能不能这样,用定时器,就像调度线程一样调度哲学家吃饭,初始给1号和3号吃饭,然后是2号和4号。每次的调度策略就是看谁的未进食的间隔最长,就分配谁吃,确定了这个再确定另外两个(不与这个人相领的那两个人)的未进食间隔。以此类推。
[解决办法]
控制进食时间间隔和分组,1-5,共5个task
每个TASK进食后,delay(一个时间单位)
序号task的前一个task也被delay(一个时间单位),避免竞争

T1:1、3进食
1、3、5被delay
T2:2、4进食
2、4、1被delay
T3:3、5进食
3、5、2被delay
T4:4、1进食
4、1、3被delay
T5:5、2进食
5、2、4被delay
循环

实际进食时间间隔为1,效率也较高

热点排行