您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 操作系统实验之进程管理实验报告
武汉理工大学学生实验报告书实验课程名称计算机操作系统开课学院计算机科学与技术学院指导老师姓名学生姓名学生专业班级2016—2017学年第一学期学生学号实验课成绩实验二进程管理一、设计目的、功能与要求1、实验目的掌握进程管理的相关内容,对进程的同步和互斥,及信号量机制有深入的理解。2、实现功能模拟实现用信号量机制解决经典同步问题3、具体要求任选一种计算机高级语言编程实现;实现5个哲学家(5只筷子)的顺利就餐需要避免出现死锁使用信号量、及信号量的等待队列使用p操作、v操作二、问题描述(1)有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子,即共5只筷子。每个哲学家的行为是思考和进餐。为了进餐,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。思考时则同时将两支筷子放回原处。(2)规则:①只有拿到两只筷子时,哲学家才能吃饭;②如果筷子已经在他人手上,则该哲学家必须等到他人吃完之后才能拿到筷子;③任何一个哲学家在自己没有拿到两只筷子吃饭之前,决不放下自己手中的筷子。(3)可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐。(4)死锁解决方案:①至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐;②仅当左右两只筷子均可用时,才允许哲学家拿起筷子就餐;③规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲学家则相反。本实验中采取方法2.三、数据结构及功能设计1、数据结构定义筷子类Chopstick和哲学家类Philosopher,Chopstick中包含筷子编号id,筷子的状态available(表示筷子是否可用)。包含takeup拿起筷子函数和putdown放下筷子函数,相当于申请筷子资源和释放筷子资源。Philosopher类中包含哲学家左右手的两只筷子left、right以及哲学家的编号Phi_num。包含eat就餐动作,think思考动作,finish完成就餐三种动作。在eat动作中通过判断是否左右手的筷子可以同时拿起来避免程序出现死锁问题,若可以同时拿起,进行eat动作,否则将另一只手中的筷子放下。//Chopstick类classChopStick{private:intid;boolavailable;//是否可以拿起筷子public:ChopStick(inti=0){id=i;available=true;}//拿起筷子booltakeup(){while(!available)returnfalse;available=false;returntrue;}//放下筷子voidputdown(){available=true;}};//Philosopher类classPhilosopher{private:ChopStick&left,&right;intPhi_num;public:Philosopher(intnum,ChopStick&c1,ChopStick&c2):left(c1),right(c2){Phi_num=num;}booleat(){boolbr,bl;bl=left.takeup();if(!bl){coutThePhilosopherPhi_numiswaitingtheleftchopstick.endl;sleep(1);returnfalse;}br=right.takeup();if(!br){coutThePhilosopherPhi_numiswaitingtherightchopstick.endl;//右筷子不能拿起时放下左筷子left.putdown();sleep(1);returnfalse;}coutThephilosopherPhi_numishavingdinner.endl;sleep(1);returntrue;}voidthink(){left.putdown();right.putdown();coutThephilosopherPhi_numisthinking.endl;sleep(1);}voidfinish(){sleep(1);coutThephilosopherPhi_numhasfinishedeating.endl;think();}};2、功能设计通过philosopher类定义五个哲学家对象,通过Chopstick类定义五只筷子对象。生成一个0-4的随机数,对应首先开始就餐的哲学家。该哲学家开始就餐,拿起左右手筷子,然后顺时针或者逆时针对其他四个哲学家依次进行吃饭动作,吃饭之前判断是否可以拿起筷子,不能拿起则进行等待,若拿起了一只筷子但另一只筷子不能拿起,需要放下另一只手中的筷子继续等待。程序直到所有哲学家都完成就餐才结束。四、开发工具及主要源代码1、开发工具SublimeText3文本编辑器,采用g++编译。2、主要源码//主函数intmain(){ChopStickchopstick[5]={ChopStick(0),ChopStick(1),ChopStick(2),ChopStick(3),ChopStick(4),};Philosopherphilosopher[5]={Philosopher(0,chopstick[4],chopstick[0]),Philosopher(1,chopstick[0],chopstick[1]),Philosopher(2,chopstick[1],chopstick[2]),Philosopher(3,chopstick[2],chopstick[3]),Philosopher(4,chopstick[3],chopstick[4])};boolb[5];inti,j;srand(time(0));j=rand()%5;for(i=j;ij+5;i++){b[i%5]=philosopher[i%5].eat();coutendl********************************************************endl;}for(i=j;ij+5;i++){if(b[i%5]){philosopher[i%5].finish();if(!b[(i%5+1)%5])b[(i%5+1)%5]=philosopher[(i%5+1)%5].eat();if(!b[(i%5+4)%5])b[(i%5+4)%5]=philosopher[(i%5+4)%5].eat();}else{b[i%5]=philosopher[i%5].eat();if(b[i%5])continue;elsecoutThephilosopheri%5needwaitingendl;}coutendl********************************************************endl;}return0;}五、测试用例及运行结果、分析测试结果截图:分析:产生了一个随机数0,并依次加1对每个哲学家进行分析。分析时首先看左筷子是否可用,然后看右筷子,若有一个不可用则放下手中的另一只筷子,并说明needwaiting。然后再下一时间段对每个哲学家再次分析,直到每个哲学家都吃上饭,程序结束。通过实验结果可得,程序正确运行,且解决了死锁问题。六、自我评价与总结本次操作系统实验是模拟进程管理过程,解决哲学家的就餐问题。个人本次实验还比较顺利,使用了比较熟悉的c++语言进行算法的编写,比较巧妙的定义了两个类来定义哲学家和筷子对象的属性以及相应的动作,方便在各种就餐过程中对筷子的资源进行申请和释放,以及哲学家实现相应的动作。另一个觉得比较好的地方是解决了死锁问题,通过判断当前哲学家是否可以同时拿起左右筷子来避免死锁。不足之处为,在本次实验中没有使用多线程的方法,与同学讨论发现使用c++中多线程操作可以节约很多代码和空间,算法实现简单。而且其中带有了p操作和v操作不用自己重新定义。提高了代码的可读性。本次实验通过解决哲学家就餐问题算法实现,对这进程管理的理解更加深刻了,也通过实验结果的比较,掌握了死锁问题的解决方法。通过这样一个一个小实验,也一定程度上锻炼了我的编程能力。
本文标题:操作系统实验之进程管理实验报告
链接地址:https://www.777doc.com/doc-4257070 .html