哲学家就餐问题报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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语言程序并提高伪代码书写能力;所以第一步是要弄懂这个哲学家就餐问题的算法思路,然后结合课堂上老师对伪代码算法的讲解,我们将思路用伪码总结出来。
从这次实验中,我们的另一个收获是对同一个问题的多方向思考。从代码中可以看出不同的分配方式,有的会避免产生死锁,有的可能会导致死锁的发生且时间长短不一样。这不禁让我们思考多种解决死锁的方案,但每种方案从时间、代码量等方面考虑各有优缺点,要想得到最佳的解决方法就需要我们在以后的实践中去不断探索。