文档介绍:2010-2011学年第1学期目录1. 课程设计内容 22. 课程设计目的 23. 背景知识 24. 工具/准备工作 35. 设计步骤与方法 . 步骤1:分析哲学家用餐时出现的情况 . 分析在什么情况下5个哲学家全部吃不上饭(即死锁情况) . 分析一种没有人饿死的情况(即解决死锁方法) . 步骤2:编程设计 . 经小组商量采用C原理,如下: . 模块说明 . 模块图 . 步骤3:代码实现以及测试 . 代码实现: . 测试: 156. 设计结果及分析 157. 设计结论 158. 问题及心得体会 159. 对本设计过程及方法、手段的改进建议 (教师) 16哲学家用餐课程设计内容哲学家就餐问题中,一组哲学家围坐在一个圆桌旁,每个哲学家的左边都只有一只筷子(当然他的右边也有一只筷子,但是这是他右边哲学家的左边的筷子),他们吃完了就思考,思考了一会就会饿,饿了就想吃,然而,为了吃饭,他们必须获得左边和右边的筷子。我们要设计一个方案来解决哲学家就餐这个问题。;,如死锁,如何消除死锁,,一组哲学家围坐在一个圆桌旁,每个哲学家的左边都只有一只筷子(当然他的右边也有一只筷子,但是这是他右边哲学家的左边的筷子),他们吃完了就思考,思考了一会就会饿,饿了就想吃,然而,为了吃饭,他们必须获得左边和右边的筷子。假使所有的哲学家都同时拿起左侧筷子,看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子,如此这般,永远重复,对于这种情况,即所有的程序都在无限期地运行,但是都无法取得任何进展,即出现饥饿,所有哲学家都吃不上饭。至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放他所使用过的两支筷子,从而可使更多的哲学家就餐。工具/准备工作工具:Visualc++:分配任务,分析课题设计步骤与方法步骤1:分析哲学家用餐时出现的情况分析在什么情况下5个哲学家全部吃不上饭(即死锁情况)考虑两种实现的方式,如下::Voidphilosopher(inti)/*i:哲学家编号,从0到4*/{While(true){Think();/*哲学家正在思考*/Take_fork(i);/*取左侧的筷子*/Take_fork(i+1)%N);/*取右侧的筷子;%为取模运算*/eat();/*吃饭*/put_fork(i);/*把左侧的筷子放回桌子*/put_fork(i+1)%N);/*把右侧的筷子放回桌子*/}}分析:假如所有的哲学家都同时拿起左侧筷子,看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子,如此这般,永远重复,对于这种情况,即所有的程序都在无限的运行,但是都是无法取得任何进展,即出现饥饿,所有哲学家都吃不上饭。:规定在拿到左侧筷子后,先检查右面的筷子是否可以使用,如果不可用,则先放下左侧筷子,等一段时间再重复整个过程。分析:当出现以下情形,在某一个瞬间,所有的哲学家都同时启动这个算法,拿起左侧的筷子,而看到右侧筷子不可使用,又都放下左侧筷子,等一会儿,又共识拿起左侧筷子。。。如此这样永远重复下去,对于这种情况,所有的程序都在运行,但却无法取得进展,即出现饥饿,所有的哲学家都吃不上饭。分析一种没有人饿死的情况(即解决死锁方法)考虑了四种实现方式()::至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。一下将room作为信号量,只允许4个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入餐厅的哲学家进入room的等待队列。根据FIFO的原则,总会进入就餐。因此不会出现饿死和死锁的现象。伪码Semaphorechopstick[5]={1,1,1,1,1};Semaphoreroom=4;Voidphilosopher(inti){while(true){Think();Wait(room);//请求进入房间进餐wait(chopstick[i]);//请求左手边的筷子wait(chopstick[(i+1)]%5);//请求右手边的筷子eat();signal(chopstick[(i+1)]%5);//释放右手边的筷子singal(chopstick[i]);//释放右手边的筷子singal(room);}}:仅当哲学家的左右筷子都可用时,才允许他拿起筷子进餐