您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 课程设计哲学家就餐问题
操作系统课程设计报告院(系):计算机科学学院专业:计算机科学与技术专业学生姓名:李海军班级:__计本(2)班_学号:200881010215题目:模拟仿真"哲学家进餐"问题的解决过程及方法起讫日期:2010.6.30----2010.7.11指导教师:何珍祥完成日期:2010年7月10日1目录1.设计题目与要求.........................................................................................................................21.1实验目的.............................................................................................................................21.3初始条件............................................................................................................................22总体设计思想及相关知识...........................................................................................................32.1总体设计思想.....................................................................................................................32.2临界区互斥编程原理........................................................................................................32.3开发环境与工具.................................................................................................................43数据结构与模块说明....................................................................................................................43.1数据结构............................................................................................................................43.2程序各模块流程图.............................................................................................................63.2.1主程序模块.............................................................................................................63.2.2状态改变模块.........................................................................................................73.2.3返回哲学家状态模块.............................................................................................83.2.4返回餐具状态模块.................................................................................................94.源程序代码..............................................................................................................................105.测试及结果................................................................................................................................156.课设总结....................................................................................................................................17参考文献.........................................................................................................................................1821.设计题目与要求1.1实验目的通过实现哲学家进餐问题的同步,深入了解和掌握进程同步和互斥的原理。1.2设计要求哲学家有N个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。1.3初始条件(1)操作系统:windows(2)程序设计语言:C++(3)设定圆桌上有六个哲学家,三对刀叉,如下图摆放:图1-1哲学家进餐问题设定图32总体设计思想及相关知识2.1总体设计思想哲学家的生活就是思考和吃饭,即思考,就餐,再思考,往复循环。要求是:每一个哲学家只有在拿到位于他左右的刀叉后,才能够就餐;哲学家只能先拿一把刀或叉,再去拿另一把刀或叉,而不能同时去抓他旁边的两把餐具,也不能从其他哲学家手中抢夺餐具;哲学家每次就餐后必须放下他手中的两把餐具后恢复思考,不能强抓住餐具不放。设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。即设计一个能安排哲学家正常生活的程序。为哲学家设计3种状态,即“等待”“进餐”“思考”。每个哲学家重复进行“等待”-“进餐”-“思考”的行动循环。其中:“等待”-“进餐”:只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。此状态改变发生后,哲学家拿起左右手两边的餐具。“进餐”-“思考”:此状态改变发生后,哲学家放下左右手上的餐具。餐具状态由“使用中”转变为“空闲”。“思考”-“等待”:哲学家思考结束后,无条件转入等待状态。由上所述,程序中应设置6个元素的信号量数组,tools[6],用来保持哲学家之间的同步。2.2临界区互斥编程原理不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区(CriticalSection)。每个进程中访问临界资源的那段程序称为临界区(CriticalSection)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,4进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。本程序主要使用了EnterCriticalSection(&cs)和LeaveCriticalSection(&cs)两个函数实现临界区互斥。EnterCriticalSection(&cs)用来进入临界区,LeaveCriticalSection(&cs)用来离开临界区。2.3开发环境与工具系统平台:WINDOW环境实现语言:C++开发工具:VC++6.03数据结构与模块说明3.1数据结构Philosopher-number:int-status:int+Philosopher(innum:int)+find()const:int+getinfo()const:int+Change():void图3-1哲学家类的UML图程序中定义一个哲学家类,包含两个私有对象和四个公有对象。Number对象:哲学家的编号。Status对象:用于保存当前该哲学家的状态,0表示正在等待(即处于饥饿状态)1表示得到餐具正在吃饭,2表示正在思考5Philosopher(intnum)方法:哲学家类构造函数,参数num表示哲学家编号find()const方法:返回该哲学家编号getinfo()const方法:返回哲学家当前状态Change()方法:根据题目要求改变哲学家的状态(等待-进餐-思考-等待…………)另外,程序中包含一个公有对象,bool类型数组tools[6],用来保存6把餐具当前状态:true表示该餐具当前空闲,false表示该餐具当前正被使用。程序中还包含两个公有函数:print和toolstatus。Print用来返回一个哲学家的状态,toolstatus用来返回一个餐具的状态。63.2程序各模块流程图3.2.1主程序模块图3-2主程序模块流程图73.2.2状态改变模块图3-3状态改变模块Change()流程图83.2.3返回哲学家状态模块图3-4返回哲学家状态模块print()流程图93.2.4返回餐具状态模块图3-5返回餐具状态模块toolstatus(boola)流程图104.源程序代码//实验目的:通过实现哲学家进餐问题的同步深入了解和掌握进程同步和互斥的原理。//设计要求:哲学家有N个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,//每人进餐时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。哲学家的人数、//餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。#includewindows.h#includetime.h#includestring#includeiostream#includeassert.husingnamespacestd;//控制活动线程数目的信号量(保护线程共享资源)booltools[6];//全局变量,用餐工具CRITICAL_SECTIONcs;//信号量,在线程中使用,临界区classPhilosopher{private:intnumber;intstatus;/*标记当前哲学家的状态,0表示正在等待(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/public:Philosopher(intnum=0):status(2),number(num){}11intfind()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)//思
本文标题:课程设计哲学家就餐问题
链接地址:https://www.777doc.com/doc-6473753 .html