哲学家就餐问题报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统

实验报告

实验名称:哲学家就餐问题

班级:信卓1201班

姓名:钟远维

学号:U201213500

日期:2014年10月30日

一、实验目的

1、熟练使用VC6.0编译环境,调试并正确运行程序。

2、理解哲学家就餐问题中出现的问题,进而掌握死锁的必要条件。

3、理解源程序中产生和防止死锁的算法,及相关窗口操作。

4、熟悉哲学家就餐问题流程并写出其伪代码

二、实验内容

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

图1 图2

三、实验要求

1、程序需有防止死锁发生采取的措施;

2、程序要有产生死锁的分配方式;

四、实验算法实现

1、不发生死锁的方式

由源码gChopstickState[iLeftChopstick] = iPhilosopher;

gChopstickState[iRightChopstick] = iPhilosopher;

知基本思路是要么一下子占用两支筷子要么不占用,先确定两只筷子均没被占用才获取筷子,这样就打破了死锁的必要条件。

伪代码如下;

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); //改变右手筷子信号量

GetResource(rightchopstick); //获取右手筷子

eating;

v(mutexleftchopstick);

v(mutexrightchopstick);

end

五、实验运行结果

程序界面说明:

通过位图句柄画演示的界面

1.先画桌子,再画筷子,再画盘子,

2.再画哲学家:

哲学家用圆表示,根据哲学家的状态选择画笔(为resting 状态时为绿色圆圈,为等待或者,就餐时为红色圆圈)

3.最后画哲学家的手:

判断的依据是若筷子的编号和哲学家的编号一直致,那么认为这根筷子属于这个哲学家(筷子资源空闲)那么可以画手表示哲学家获得了这个筷子。(获得资源)

六、实验总结

通过本次实验,程序设计的时候应该有适当的避免死锁的产生的算法程序。当避免死锁产生算法不完美时,有锁死产生的时候的死锁分配方式。这些都是在程序设计的时候应该先想好的。通过实践总结,有以下三种方法可以避免一类死锁。一是至多允许4位哲学家同时吃通心面;二是奇数号哲学家先取左边叉子,再取右边叉子;偶数号哲学家先取右边叉子,再取左边叉子;三是每位哲学家取到手边的两把叉子才开始吃通心面,否则一把叉子也不取。

本次实验在已给源码的基础上我们主要是理解C语言程序并提高伪代码书写能力;所以第一步是要弄懂这个哲学家就餐问题的算法思路,然后结合课堂上老师对伪代码算法的讲解,我们将思路用伪码总结出来。

从这次实验中,我们的另一个收获是对同一个问题的多方向思考。从代码中可以看出不同的分配方式,有的会避免产生死锁,有的可能会导致死锁的发生且时间长短不一样。这不禁让我们思考多种解决死锁的方案,但每种方案从时间、代码量等方面考虑各有优缺点,要想得到最佳的解决方法就需要我们在以后的实践中去不断探索。

相关文档
最新文档