您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统课程设计哲学家进餐问题报告
课程设计报告(本科/专科)课程:操作系统课程设计学号:姓名:班级:教师:时间:2012.12.7-2013.1.7计算机科学与技术系1设计名称:哲学家进餐问题设计内容、目的与要求:实验目的:通过实现哲学家进餐问题的同步深入了解和掌握进程同步和互斥的原理。内容和要求:哲学家有N个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。计划与进度安排:21:设置初始条件(12月17号)(1)操作系统:windows(2)程序设计语言:C++(3)设定圆桌上有六个哲学家,三对刀叉。2:详细设计:(12月18号至1月6号)(1):设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。即设计一个能安排哲学家正常生活的程序。(2):为哲学家设计3种状态,即“等待”“进餐”“思考”。每个哲学家重复进行“等待”-“进餐”-“思考”的行动循环。(3):确定程序模块。(4):编写程序。(5):调试修改。(6):结果分析。设计过程、步骤(可加页):31.分工:汤正愿:课题分析,模块设计,主函数的编写;洪志飞:课题分析,模块设计,子函数的编写。2.确定数据结构Philosopher-number:int-status:int+Philosopher(innum:int)+find()const:int+getinfo()const:int+Change():void图3-1哲学家类的UML图程序中定义一个哲学家类,包含两个私有对象和四个公有对象。Number对象:报讯哲学家的编号。Status对象:用于保存当前该哲学家的状态,0表示正在等待(即处于饥饿状态)1表示得到餐具正在吃饭,2表示正在思考Philosopher(intnum)方法:哲学家类构造函数,参数num表示哲学家编号find()const方法:返回该哲学家编号getinfo()const方法:返回哲学家当前状态Change()方法:根据题目要求改变哲学家的状态(等待-进餐-思考-等待…………)另外,程序中包含一个公有对象,bool类型数组tools[6],用来保存6把餐当前状态:true表示该餐具当前空闲,false表示该餐具当前正被使用。程序中还包含两个公有函数:print和toolstatus。Print用来返回一个哲学家的状态,toolstatus用来返回一个餐具的状态。3.模块分析。(1)主程序模块:4(2)状态改变模块:5(3)返回哲学家状态模块:6(4)返回餐具状态模块:7结果与分析(可以加页):8程序运行开始界面9哲学家状态:1号,3号,5号哲学家进入等待状态,2号,4号哲学家进入就餐状态,6号哲学家进入思考状态,只有4号,5号餐具空闲。10哲学家状态:1号,3号,6号哲学家进入等待状态,2号,4号哲学家进入思考状态,5号哲学家进入就餐状态,只有3号,4号餐具在使用。退出程序结果分析:状态1:1号,3号,5号哲学家进入就餐状态,其他哲学家仍然等待,6把用餐工具都在使用。状态2:1号,3号,5号哲学家进入思考状态,6号哲学家进入就餐状态,只有4号,5号餐具在使用。状态3:1号,3号,5号哲学家进入等待状态,2号,4号哲学家进入就餐状态,6号哲学家进入思考状态,只有4号,5号餐具空闲。状态4:1号,3号,6号哲学家进入等待状态,2号,4号哲学家进入思考状态,5号哲学家进入就餐状态,只有3号,4号餐具在使用。分析:程序能够实现哲学家的思考,就餐,等待状态的转换,餐具能够实现互斥。11设计体会与建议:经过了前后共2周的时间,我完成了这次课程设计。通过这次课程设计,我学到了许多课本上学不到的知识,注意到了许多课本上没有提到的东西。而且,通过这次设计,我得到了一个很好的理论联系实际的机会,锻炼了通过理论解决实际问题的能力。正所谓“实践出真知”,有些代码看上去没什么问题,但是实际运行起来就是不出正确结果。代码内部可能存在逻辑或语法等方面我们平时不会注意到的小问题,通过这次课程设计,我积累了不少这样小问题的解决方法。设计中总会遇到这样那样的问题,遇到问题势必要自己分析问题,通过各种渠道解决问题,比如利用互联网。这次课程设计也加强了我上网查数检索问题的能力。有些时候,学习到的知识是次要的,重要的是学习知识的方法。12源程序代码:#includewindows.h#includetime.h#includestring#includeiostream#includeassert.husingnamespacestd;booltools[6];//全局变量,用餐工具CRITICAL_SECTIONcs;//信号量,在线程中使用,临界区,当一个线程执行了EnterCritialSection之后,cs里面的信息便被修改了,以指明哪一个线程占用了它。classPhilosopher{private:13intnumber;intstatus;/*标记当前哲学家的状态,0表示正在等待(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/public:Philosopher(intnum=0):status(2),number(num){}intfind()const{returnnumber;}intgetinfo()const{returnstatus;}voidChange();//状态改变函数};voidPhilosopher::Change(){EnterCriticalSection(&cs);//进入临界区if(status==1)//正在进餐{tools[number%6]=true;//放下左手工具tools[(number-1)%6]=true;//放下右手工具status=2;//改变状态为思考}elseif(status==2)//思考中{status=0;//改变状态为等待}elseif(status==0)//等待中{if(tools[number%6]&&tools[(number-1)%6])//左右手两边工具均为空14闲状态{tools[number%6]=false;//拿起左手工具tools[(number-1)%6]=false;//拿起右手工具status=1;}}LeaveCriticalSection(&cs);}stringprint(Philosopher*pA){//pA-Change();inti=pA-getinfo();stringstr;if(i==0)str=等待;elseif(i==1)str=就餐;elsestr=思考;returnstr;}stringtoolstatus(boola){stringstate;if(a==true)15state=闲;if(a==false)state=用;returnstate;}intmain(){charcon='y';//判断是否继续for(inti=0;i6;i++)tools[i]=true;//3组刀叉都未使用,初始化PhilosopherP1(1),P2(2),P3(3),P4(4),P5(5),P6(6);InitializeCriticalSection(&cs);//初始化初始化临界区cout-----------------------状态说明示意图:-----------------------endl;cout哲学家0号的状态endl;cout哲学家5号的状态叉3的状态刀1的状态哲学家1号的状态endl;cout刀3的状态叉1的状态endl;cout哲学家4号的状态叉2的状态刀2的状态哲学家2号的状态endl;cout哲学家3号的状态endl;cout餐具的状态,用表示使用中,闲表示空闲中。endl;cout--------------------------endl;cout哲学家们开始生活:endl;coutendl;16coutendl;while(con=='y'){P1.Change();P2.Change();P3.Change();P4.Change();P5.Change();P6.Change();cout当前状态为:endl;coutP1.find()print(&P1)endl;coutP6.find()print(&P6)toolstatus(tools[0])toolstatus(tools[1])P2.find()print(&P2)endl;couttoolstatus(tools[5])toolstatus(tools[2])endl;coutP5.find()print(&P5)toolstatus(tools[4])toolstatus(tools[3])P3.find()print(&P3)endl;coutP4.find()print(&P4)endl;cout--------------------------endl;cout若要继续下一状态,输入y;输入其他,结束程序:;cincon;Sleep(20);}DeleteCriticalSection(&cs);//退出资源区return0;}
本文标题:操作系统课程设计哲学家进餐问题报告
链接地址:https://www.777doc.com/doc-4221744 .html