实验一 哲学家就餐问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一哲学家就餐问题
一、实验目的
1.熟练使用VC++6.0编译环境,调试并正确运行程序。
2.熟悉哲学家就餐问题流程。
3.理解哲学家就餐问题中出现的问题,进而掌握死锁的必要条件。
4.熟悉源程序中产生和防止死锁的算法,及其相关窗口操作。
二、实验原理
1.问题描述:
有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每
两人之间放一只筷子,每个哲学家的行为时思考,饥饿,然后吃通心粉,每个哲学
家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边取筷子。
2.防止死锁发生的分配方式:
仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。这样要么一次占有两
只筷子(所有线程需要的资源)进行下一步吃通心粉,然后释放所有的资源;要么
不占用资源,这样就不可能产生死锁了。
3.产生死锁的分配方式:
当筷子(资源)可用时,先分配左边的筷子,等待一会后再分配右边的筷子,由于
这个过程中,左边的筷子一直没有释放,就可能产生死锁了。
4.程序运行说明:
程序运行过程中会弹出一个MessageBox提示操作者操作:
1)第一个对话框用于选择运行模式
a.选择yes表示采用的是运行的防止死锁的方式,这样的话整个程序可以一直运行下去,不会产生死锁。
b.选择no表示运行产生死锁的方式会弹出第二个对话框。
2)第二个对话框用于选择运行时,线程运行的时间
a.选择yes线程时间比较短,很快就可以死锁。
b.选择no线程时间跟选择yes时的时间差不多,产生死锁的时间稍微长一点。
三、实验过程及分析
1.PhilosopherThread(LPVOID pVoid)函数伪代码
1)不死锁方式
Var mutexleftchopstick,mutexrightchopstick;
Beging:
Resting;
Waiting;
P{mutexleftchopstick};
P{mutexrightchopstick};
GetResource{leftchopstick,rightchopstick};
Eating;
V{mutexleftchopstick};
V{mutexrightchopstick};
End
2)发生死锁方式
Var mutexleftchopstick,mutexrightchopstick;
Beging:
Resting;
Waiting;
P{mutexleftchopstick};
GetResource{leftchopstick};
P{mutexrightchopstick};
GetResource{rightchopstick};
Eating;
V{mutexleftchopstick};
V{mutexrightchopstick};
End
2.代码分析
1)不发生死锁时,哲学家迅速同时抢占两个筷子的资源,而若是不能同时抢占两只筷子则继续等待,知道有两只筷子空闲则抢占,这样就打破了死锁的必要条
件。
2)发生死锁时,因哲学家有左边的筷子空闲就抢占,再等待抢占右边的筷子,这样就有可能发生所有哲学家同时发现自己左边的筷子都空闲,都占用了左边的
筷子而等待右边的筷子,此时右边的筷子又都被别的哲学家占用,这样就进入
永远等待状态,即发生了死锁。
四、思考题
其他解决死锁方法:
1.引入一个对各个进程的调度者,当哲学家饥饿时向该调度者申请用餐,而调度
者根据哲学家面前是否同时有两只筷子空闲来判断哲学家此时能否就餐,能则
占用这两只筷子并且让哲学家就餐,不能则让哲学家继续等待。引入一个调度
者能很有效地管理进程资源的分配。
2.可以让哲学家按一定顺序就餐,也可以避免死锁,但这样效率不高。
五、实验小结
通过这次上机实验,我对哲学家就餐问题有了更深入的了解,也学习到了具体C语言代码是如何实现这个问题的演示的。同时更重要的是对资源的调度分配有了更深的思考,如何有效合理地分配资源,如何避免死锁,这都是我们再编写某些进程代码时需要考虑到的问题,而这次实验使我掌握了几种避免死锁的资源分配方法,对此我感到受益匪浅。