好文档 - 专业文书写作范文服务资料分享网站

哲学家就餐问题报告

天下 分享 时间: 加入收藏 我要投稿 点赞

哲学家就餐问题报告

一、 实验目的

1、熟练使用VC6、0编译环境,调试并正确运行程序。 2、理解哲学家就餐问题中出现的问题,进而掌握死锁的必要条件。

3、理解源程序中产生和防止死锁的算法,及相关窗口操作。 4、熟悉哲学家就餐问题流程并写出其伪代码

二、 实验内容有五个哲学家围坐在一圆桌旁(如图1),桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。每个哲学家的行为是思考,感到饥饿,然后吃通心粉。为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。

图1 图2 三、 实验要求

1、程序需有防止死锁发生采取的措施; 2、 程序要有产生死锁的分配方式; 四、 实验算法实现

1、不发生死锁的方式由源码

gChopstickState[iLeftChopstick] = iPhilosopher;

gChopstickState[iRightChopstick] = iPhilosopher;知基本思路是要么一下子占用两支筷子要么不占用,先确定两只筷子均没

第 1 页 共 1 页

被占用才获取筷子,这样就打破了死锁的必要条件。伪代码如下; var mutexleftchopstick,mutexrightchopstick; beging: resting; waiting; p(mutexleftchopstick); //先改变左手筷子信号量 p(mutexrightchopstick); //马上改变右手筷子信号量 GetResource(leftchopstick,rightchopstick); //同时占用左右手筷子 eating; v(mutexleftchopstick); //释放资源 v(mutexrightchopstick); end

2、 发生死锁的方式基本思路是有筷子即占用,看似效率很高,但因为资源有限,且不可抢占,很容易发生死锁。源码理解: gDinerState[iPhilosopher] = WAITING;//wants chopsticks result = WaitForSingleObject(gchopStick[iLeftChopstick], INFINITE); gChopstickState[iLeftChopstick] = iPhilosopher; //得到左手筷子 Sleep(P_DELAY/4); //休眠状态

gDinerState[iPhilosopher] = WAITING; //继续等待另一只手筷子 result =

WaitForSingleObject(gchopStick[iRightChopstick], INFINITE); gChopstickState[iRightChopstick] = iPhilosopher; //直到等到右手筷子伪码书写:var

mutexleftchopstick,mutexrightchopstick; beging: resting; waiting; p(mutexleftchopstick); //改变左手筷子信号量 GetResource(leftchopstick); //获取左手筷子 p(mutexrightchopstick); //改变右手筷子信号量

第 1 页 共 1 页

GetResource(rightchopstick); //获取右手筷子 eating; v(mutexleftchopstick); v(mutexrightchopstick); end

五、 实验运行结果 程序界面说明:通过位图句柄画演示的界面1.先画桌子,再画筷子,再画盘子,2.再画哲学家:哲学家用圆表示,根据哲学家的状态选择画笔(为resting 状态时为绿色圆圈,为等待或者,就餐时为红色圆圈)3.最后画哲学家的手:判断的依据是若筷子的编号和哲学家的编号一直致,那么认为这根筷子属于这个哲学家(筷子资源空闲)那么可以画手表示哲学家获得了这个筷子。(获得资源)六、 实验总结通过本次实验,程序设计的时候应该有适当的避免死锁的产生的算法程序。当避免死锁产生算法不完美时,有锁死产生的时候的死锁分配方式。这些都是在程序设计的时候应该先想好的。通过实践总结,有以下三种方法可以避免一类死锁。

一是至多允许4位哲学家同时吃通心面;二是奇数号哲学家先取左边叉子,再取右边叉子;偶数号哲学家先取右边叉子,再取左边叉子;三是每位哲学家取到手边的两把叉子才开始吃通心面,否则一把叉子也不取。本次实验在已给源码的基础上我们主要是理解C语言程序并提高伪代码书写能力;所以第一步是要弄懂这个哲学家就餐问题的算法思路,然后结合课堂上老师对伪代码算法的讲解,我们将思路用伪码总结出来。从这次实验中,我们的另一个收获是对同一个问题的多方向思考。从代码中可以看出不同的分配方式,有的会避免产生死锁,有的可能会导致死锁

第 1 页 共 1 页

的发生且时间长短不一样。这不禁让我们思考多种解决死锁的方案,但每种方案从时间、代码量等方面考虑各有优缺点,要想得到最佳的解决方法就需要我们在以后的实践中去不断探索。

第 1 页 共 1 页

哲学家就餐问题报告

哲学家就餐问题报告一、实验目的1、熟练使用VC6、0编译环境,调试并正确运行程序。2、理解哲学家就餐问题中出现的问题,进而掌握死锁的必要条件。3、理解源程序中产生和防止死锁的算法,及相关窗口操作。4、熟悉哲学家就餐问题流程并写出其伪代码二、实验内容有五个哲学家围坐在一圆桌旁(如图1),桌中
推荐度:
点击下载文档文档为doc格式
81lwm3437300kc5204u903ypi6bk1500j2v
领取福利

微信扫码领取福利

微信扫码分享