操作系统课程设计-哲学家进餐问题_第1页
操作系统课程设计-哲学家进餐问题_第2页
操作系统课程设计-哲学家进餐问题_第3页
操作系统课程设计-哲学家进餐问题_第4页
操作系统课程设计-哲学家进餐问题_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./操作系统课程设计课程设计题目:哲学家进餐问题姓名:专业:班级:学号:指导教师:20XX6月10日目录1.设计题目与要求21.1实验目的21.2初始条件22总体设计思想及相关知识32.1总体设计思想32.2临界区互斥编程原理32.3开发环境与工具33模块说明33.1状态改变模块44.部分源程序代码及测试结果65.课设总结7参考文献81.设计题目与要求1.1实验目的通过实现哲学家进餐问题的同步,深入了解和掌握进程同步和互斥的原理。用C++进行线程的创建与撤销代码相对来说比较简单,因为封装比较多,我们能做的就是创建与调用。当然,代码中也有一些复杂的地方,不是对线程的操作,而是关于界面的显示与操作,单个线程容易创建与撤销,但难的是合理的"监控"与组织多个线程并及时进行状态的显示。虽然用程序语言实现了进程创建〔当然,这是在并不会理论的情况下,但还是没弄清理论的实质。可能理论更抽象些吧。在平常的编程中,虽然经常遇到过要使用多线程的问题,但没有去试过从操作系统的角度去考虑线程的运行,在以后的学习中,我想还是会深入了解与学习这方面的东西的。1.2设计要求哲学家有N个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。〔1操作系统:windows〔2程序设计语言:C++〔3设定圆桌上有六个哲学家,三对刀叉,如下图摆放:图1-1哲学家进餐问题设定图2总体设计思想及相关知识2.1总体设计思想哲学家的生活就是思考和吃饭,即思考,就餐,再思考,往复循环。要:每一个哲学家只有在拿到位于他左右的刀叉后,才能够就餐;哲学家只能先拿一把刀或叉,再去拿另一把刀或叉,而不能同时去抓他旁边的两把餐具,也不能从其他哲学家手中抢夺餐具;哲学家每次就餐后必须放下他手中的两把餐具后恢复思考,不能强抓住餐具不放。设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。即设计一个能安排哲学家正常生活的程序。为哲学家设计3种状态,即"等待""进餐""思考"。每个哲学家重复进行"等待"->"进餐"->"思考"的行动循环。其中:"等待"->"进餐":只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于"空闲"状态时,可以发生这种状态改变。此状态改变发生后,哲学家拿起左右手两边的餐具。"进餐"->"思考":此状态改变发生后,哲学家放下左右手上的餐具。餐具状态由"使用中"转变为"空闲"。"思考"->"等待":哲学家思考结束后,无条件转入等待状态。由上所述,程序中应设置6个元素的信号量数组,tools[6],用来保持哲学家之间的同步。2.2临界区互斥编程原理不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区〔CriticalSection。每个进程中访问临界资源的那段程序称为临界区〔CriticalSection〔临界资源是一次仅允许一个进程使用的共享资源。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。本程序主要使用了EnterCriticalSection<&cs>和LeaveCriticalSection<&cs>两个函数实现临界区互斥,临界区用EnterCriticalSection<&cs>来进入,LeaveCriticalSection<&cs>用来离开临界区。2.3开发环境与工具系统平台:WINDOW环境实现语言:C++开发工具:VisualC++6.03.模块说明本人在此次课程设计中,打开visualC++——》新建——》project——》win32consoleapplication建立一个zxm工程。利用工作区间打开zxm.cpp编译。Philosopher-number:int-status:int+Philosopher<innum:int>+find<>const:int+getinfo<>const:int+Change<>:void图3-1哲学家类的UML图〔该图阐述了zxm.cpp文件的主要结构:创建一个philosopher类,在philosopher类中定义了status、number整型成员变量。Philosopher〔构造函数,find<>、getinfo<>、change<>成员函数图3-3状态改变模块Change<>流程图4.部分源程序代码部分源代码:voidPhilosopher::Change<>//Philosopher类中change成员函数{EnterCriticalSection<&cs>//进入临界区if<status==1>//正在进餐{tools[number%5]=true;//放下左手工具tools[<number-1>%5]=true;//放下右手工具status=2;//改变状态为思考}elseif<status==2>//思考中{status=0;//改变状态为等待}elseif<status==0>//等待中{if<tools[number%5]&&tools[<number-1>%5]>//左右手两边工具均为空闲状态{tools[number%5]=false;//拿起左手工具tools[<number-1>%5]=false;//拿起右手工具status=1;}}LeaveCriticalSection<&cs>}5.测试及结果图5-1程序运行开始界面6.课设总结经过了前后共1周的时间,我们小组三人艰辛的完成了这次课程设计。由开始的苹果问题到现在所解决的哲学家进餐问题,不仅体现了我的应急能力差,还反映出了对操作系统这门功课理解的不到位,没有真正理解进程和线程的创建与作用,线程的同步与互斥。通过这次课程设计,我学到了许多课本学到的知识和课本上学不到的问题,体会到了对一个团队来说合作才是最重要的,就算你一个人没日没夜的做也不如大家一起思考一个小时。聪明的人往往是能很好的利用身边的人和资源。通过这次设计,我得到了一个很好的理论联系实际的机会,锻炼了通过理论解决实际问题的能力。正所谓"实践出真知",有些代码看上去没什么问题,但是实际运行起来就是不出正确结果。代码部可能存在逻辑或语法等方面我们平时不会注意到的小问题,通过这次课程设计,我积累了不少这样小问题的解决方法。有些时候,学习到的知识是次要的,重要的是学习知识的方法。知识是死的,人事活着的。死读书就是读死书,作为一个当代大学生,我们应该充实发挥大脑,灵活运用、参考文献《计算机

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论