哲学家的晚餐

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

回复评论 (12)

路过 帮顶。
点赞  2008-12-29 08:25
??这个很强。
简单分析一下,1.应该是可以实现,因为同单位时间可以有两个人吃饭,那么在一个哲学家被饿死的10个时间中可以有20个人次吃到食物。而哲学家的总数是五个,所以满足要求。
2.如果是围着圆卓做的话,那么如果一号在吃饭,则他相邻的2号和五号都不能吃了,而不相邻的4号和3号中可以有一个吃饭。
3,如果这样的话我有个思路能不能这样,用定时器,就像调度线程一样调度哲学家吃饭,初始给1号和3号吃饭,然后是2号和4号。每次的调度策略就是看谁的未进食的间隔最长,就分配谁吃,确定了这个再确定另外两个(不与这个人相领的那两个人)的未进食间隔。以此类推。
点赞  2008-12-29 09:49
现在的问题是,如何知道等待时间的问题,超过10个单位时间就报警,在等待信号量的时候同时计时。
点赞  2008-12-29 11:53
很经典的问题了
看linux的源代码!!!!



    *
      LINUX内核
    * 更多

    * > LINUX系统第三章--启动系统
    * > LINUX V0.11源代码分析
    * > LINUX V0.11源代码CHM档
    * > ucLinux 核心(中文手册)
    * > LINUX系统第五章--内核源代...
    * > LINUX内核源代码情景分析(上)
    * > LINUX系统第四章--内核初始化
    * > 理解LINUX内核

下载地址http://www.eesdn.cn/edown/
点赞  2009-1-3 15:32
难道是纯C的吗?你设一个结构哲学家的结构里面有时间这个参数不行吗?为什么每个都需要一个信号量?
点赞  2009-1-3 16:44
刚用共享内存方法实现了。
如LS所说,结构里弄个时间参数。
点赞  2009-3-4 17:24
顶4楼的老大。
点赞  2009-3-5 10:04
控制进食时间间隔和分组,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,效率也较高
点赞  2009-3-11 09:44
补充说明:
LZ写的内容是用程序设计的手段把哲学家进餐问题建了软件模型
我上贴说的办法是在该模型上通过增加一种机制解决哲学家进餐问题的死锁问题
点赞  2009-3-11 09:55
记号,学习。
点赞  2009-3-11 14:51
新手上路,进来学习下。
点赞  2009-3-16 21:42
同问
点赞  2009-11-26 19:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复