欢迎来到天天文库
浏览记录
ID:57520063
大小:37.50 KB
页数:2页
时间:2020-08-26
《华中科技大学电信系操作系统实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验一:哲学家就餐问题通信0701张开越U200713562一、实验目的:1.熟练使用VC++6.0编译环境,调试并正确运行程序。2.理解哲学家就餐问题中出现的问题,进而掌握死锁的必要条件。3.理解源程序中产生和防止死锁的算法,及相关窗口操作。4.(选做)为哲学家就餐问题提供解决方案,并用C语言实现。二、实验原理:1.问题描述:有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边
2、或右边去取筷子。2.防止死锁发生的分配方式:仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。这样要么一次占有两只筷子(所有线程需要的资源)进行下一步的吃通心粉,然后释放所有的资源;要么不占用资源,这样就不可能产生死锁了。3.产生死锁的分配方式:当筷子(资源)可用时,先分配左边的筷子,等待一会后再分配右边的筷子,由于这个过程中,左边的筷子一直没有释放,就有可能产生死锁了。4.程序运行说明:程序运行过程中会弹出一个MessageBox提示操作者操作:1.第一个对话框用于选择运行模式a.选择yes表示采用的是运行的防止死锁的方式,这样
3、的话整个程序可以一直运行下去,不会产生死锁。b.选择no表示运行产生死锁的方式会弹出第二个对话框。2.第二个对话框用于选择运行时,线程运行的时间a.选择res线程时间比较短,很快就可以死锁b.选择no线程时间跟选择yes时候的时间差不多,产生死锁的时间稍微长一点。三、实验过程及分析1.伪码代码:1)不发生死锁的方式(要么一下占用两支筷子,要么不占用)varmutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick);//先改变左手
4、筷子信号量p(mutexrightchopstick);//马上改变右手筷子信号量GetResource(leftchopstick,rightchopstick);eating;v(mutexleftchopstick);v(mutexrightchopstick);end1)发生死锁的方式(一旦可以占用筷子,就马上占用)varmutexleftchopstick,mutexrightchopstick;beging:resting;waiting;p(mutexleftchopstick);//改变左手筷子信号量GetResour
5、ce(leftchopstick);//获取左手筷子p(mutexrightchopstick);//改变右手筷子信号量GetResource(rightchopstick);//获取右手筷子eating;v(mutexleftchopstick);v(mutexrightchopstick);end1.代码分析:1)不发生死锁的方式:先确定两只筷子均没被占用才获取筷子,这样就打破了死锁的必要条件。2)发生死锁的方式:有筷子即占用,看似效率很高,但因为资源有限,且不可抢占,很容易发生死锁。2.(选做)另种死锁解决方案:规定其中一名哲学
6、家先改变右手筷子的信号量,先获取右手筷子。这样,这名哲学家左手的筷子就有可能空闲出来,成为左边科学家的空闲右手筷子,此一环永远不会发生死锁。一、实验总结:本实验很考验对C语言程序的阅读能力,尽管事先知道程序的算法原理,但真正从大量代码中找出核心算法还是需要花些功夫。体会到了程序员编写程序的时候注释的重要性。也考虑到解决死锁的办法绝不止源程序中的和上面列举的这两种方法,在不加任何附加条件的情况下,甚至可以列链表,从链表中挑选哲学家占用筷子。但考虑到程序的存储效率和运行效率,源程序所给的代码已经是一个很好的解决办法了。
此文档下载收益归作者所有