您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > PV操作及进程同步的实现2哲学家就餐问题
课程设计课程设计名称:专业班级:学生姓名:学号:指导教师:课程设计时间:2010/12/23计算机科学专业课程设计任务书学生姓名专业班级学号题目P、V操作及进程同步的实现2课题性质其它课题来源自拟课题指导教师同组姓名主要内容用语言编程实现P、V原语并用P、V原语哲学家就餐问题:为每个哲学家各编一段程序描述他们的行为,试用P、V操作实现。任务要求掌握信号量通信方式的一般方法,了解系统实现“阻塞”和“唤醒”功能的方法和技巧。同时掌握进程同步和互斥的概念及实现技术。参考文献任满杰等《操作系统原理实用教程》电子工业出版社2006汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社2001张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000罗宇等《操作系统课程设计》机械工业出版社2005审查意见指导教师签字:教研室主任签字:年月日说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页1需求分析哲学家就餐问题是一种典型的同步问题,它是由Dijstra提出并解决的。该问题描述如下:有五个哲学家,他们的生活方式是交替的进行思考和进餐。哲学家们公用一张圆桌,设5个哲学家分别为A,B,C,D,E,桌子上放着5把筷子,编号分别编号为0,1,2,3,4,桌子中央有一盘饭菜。5个哲学家都很有礼貌,都要等同时拿到身旁的两只筷子才进餐,不然就只是等着继续思考,而且吃了一口之后又马上放下拿起的两根筷子,继续思考。由于筷子数目有限,不能让5个哲学家同事进餐,而且甚至只能让其中的少数哲学家进餐,其他的哲学家只能轮流享用。为每个哲学家各编一段程序描述他们的行为,解决哲学家就餐问题。2概要设计源程序中各个函数的作用说明:intReadcount[n];intchopstick[n];//筷子状态标志voidGetchopstick(intnextw)//拿起筷子函数。nextw为哲学家标号voidDropchopstick(intnextr)//放下筷子函数intselect();intmain()//主函数操作实验结构图:3运行环境硬件环境:基于Xp的PC软件环境:WindowsXP4开发工具和编程语言开发工具:VisualC++6.0编程语言:VisualC++5详细设计#includestdio.h主函数拿起筷子函数放下筷子函数就餐结果#definen5intin=0;intout=0;intReadcount[n];intchopstick[n];//筷子状态标志voidGetchopstick(intnextw)//拿起筷子函数。nextw为哲学家标号{printf(第%d名哲学家肚子饿了,申请左边的筷子。\n,nextw);if(chopstick[nextw-1]==0||chopstick[nextw-1]==nextw){in=nextw-1;chopstick[in]=nextw;printf(申请成功!第%d名哲学家已经拿起左边一支编号为%d筷子,申请右边编号为%d的筷子。\n,nextw,in,(in+1)%n);in=(in+1)%n;Readcount[nextw-1]=Readcount[nextw-1]+1;if(chopstick[in]==0||chopstick[in]==nextw){chopstick[in]=nextw;Readcount[nextw-1]=Readcount[nextw-1]+1;printf(申请成功!第%d名哲学家再拿起右边一支编号为%d筷子,开开心心的吃饭啦!\n,nextw,in);}elseprintf(申请失败!第%d名哲学家只有一支筷子,只好干巴巴的盼着旁边的那位哲学家赶快吃完。\n,nextw);}elseprintf(申请失败!第%d名哲学家没有拿到筷子,只好干巴巴的等着旁边的那位哲学家赶快吃完。\n,nextw);}voidDropchopstick(intnextr)//放下筷子函数。{//nextr为放下筷子的哲学家的编号if(Readcount[nextr-1]!=0)//判断筷子是否已经占用{if(Readcount[nextr-1]==2){printf(该名哲学家吃饱啦!准备放下筷子。。\n);chopstick[nextr-1]=0;chopstick[nextr]=0;printf(该名哲学家已经放下筷子。。\n);}else{printf(该名哲学家只有一支筷子!又不能吃饭,只好准备放下筷子。。\n);chopstick[nextr-1]=0;printf(该名哲学家已经放下筷子。。\n);}}elseprintf(该名哲学家没有筷子你还让他放下。。你好可恶啊,鄙视一下~\n);}intselect(){inti,nextw,nextr;printf(请输入编号:\n1---拿筷子过程\n2---放筷子过程\n3---退出\n);scanf(%d,&i);switch(i){case1:printf(现在进行哲学家拿筷子过程,请输入要申请筷子的哲学家编号(1-5)。\n);scanf(%d,&nextw);if((nextw0)&&(nextw6)){Getchopstick(nextw);//拿筷子过程}else{printf(输入超出范围,请重新输入!);}break;case2:printf(现在进行哲学家放筷子过程,请输入要放筷子的哲学家编号(1-5)。\n);scanf(%d,&nextr);if((nextr0)&&(nextr6)){Dropchopstick(nextr);//放筷子过程}else{printf(输入超出范围,请重新输入!\n);}break;case3:return(0);default:printf(输入超出范围,请重新输入.\n);scanf(%d,&i);}return(1);}intmain()//主函数操作{printf(哲学家就餐问题。\n规则:每个人只有申请到了左边的筷子才可以申请右边的筷子。\n);for(intm=0;mn;m++){chopstick[m]=0;}for(intc=0;cn;c++){Readcount[c]=0;}inti;printf(请输入编号:\n1---拿放筷子操作\n2---退出\n);scanf(%d,&i);while(i!=2){select();printf(\n);printf(请输入编号:\n1---拿放筷子操作\n2---退出\n);printf(\n);scanf(%d,&i);}return(1);}6调试分析实验调试过程中遇到的问题:起初认为这个设计题目还是比较简单的,但实验中还是遇到很多问题,容易绕弯路,实验要求用语言编程实现P、V原语并用P、V原语哲学家就餐问题:为每个哲学家各编一段程序描述他们的行为,试用P、V操作实现。特别是实现“阻塞”和“唤醒”功能过程中,频繁出错。后来尝试添加chopstick[n];//筷子状态标志,解决了不能直观了解筷子状态这个问题。7测试结果源程序算法选择界面运行结果:拿筷子操作:放筷子操作:拿筷子失败:放筷子失败:退出:参考文献[1]任满杰等,《操作系统原理实用教程》,电子工业出版社,2006[3]汤子瀛汤小丹梁红兵等,《计算机操作系统》(修订版),西安电子科技大学出版社,2001[4]张尧学史美林,《计算机操作系统教程》实验指导,清华大学出版社,2000[5]罗宇等,《操作系统课程设计》,机械工业出版社,2005心得体会本次设计收获很多,基本掌握了信号量通信方式的一般方法,对同步和互斥的概念及实现技术也有了一定理解,特别是设计中用到的系统实现“阻塞”和“唤醒”功能的方法和技巧。设计过程中遇到的一些问题,通过咨询老师、请教同学都一一解决。以前不太懂的问题也通过本次设计予以解决,本次课程设计让我受益匪浅。信息科学与工程学院课程设计成绩评价表课程名称:操作系统系统原理设计题目:处理机调度程序专业:计算机科学与技术班级:1姓名:学号序号评审项目分数满分标准说明1内容思路清晰,语言表达准确,概念清楚,论点正确;设计方法科学,分析归纳合理;结论严谨,设计有应用价值。任务饱满,工作量适中2创新内容新颖,设计能反映新技术,对前人工作有改进或突破,或有独特见解3完整性、实用性整体构思后合理,理论依据充分,设计完整,实用性强4数据准确、可靠数据准确,算法设计合理5规范性设计格式、绘图、实验数据、标准的运用等符合有关标准和规定6纪律性遵守课程设计纪律,听从指导教师安排,设计过程态度认真7答辩准备充分,思路清晰、论点正确、对设计方案理解深入,问题回答有理有据,简明正确总分综合意见指导教师年月日
本文标题:PV操作及进程同步的实现2哲学家就餐问题
链接地址:https://www.777doc.com/doc-1876021 .html