1、 课程设计报告课程设计报告 (本科(本科/专科)专科) 课程: 操作系统课程设计 学号: 姓名: 班级: 教师: 时间: 2012.12.7 -2013.1.7 计算机科学与技术系 1 设计名称: 哲学家进餐问题 设计内容、目的与要求: 实验目的: 通过实现哲学家进餐问题的同步深入了解和掌握进程同步和互斥的原 理。 内容和要求: 哲学家有 N 个,也定全体到达后开始讨论:在讨论的间隙哲学家 进餐, 每人进餐时都需使用刀、 叉各一把, 所有哲学家刀和叉都拿到后才能进餐。 哲学家的人数、 餐桌上的布置自行设定, 实现刀和叉的互斥使用算法的程序实现。 计划与进度安排: 2 1:设置初始条件(12 月
2、 17 号) (1)操作系统:windows (2)程序设计语言:C+ (3)设定圆桌上有六个哲学家,三对刀叉。 2:详细设计: (12 月 18 号至 1 月 6 号) (1) :设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并 能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。 即设计一个 能安排哲学家正常生活的程序。 (2) :为哲学家设计 3 种状态,即“等待” “进餐” “思考” 。每个哲学家重复进 行“等待”-“进餐”-“思考”的行动循环。 (3) :确定程序模块。 (4) :编写程序。 (5) :调试修改。 (6) :结果分析。 设计过程、步骤(可加页)
3、 : 3 1. 分工:汤正愿:课题分析,模块设计,主函数的编写; 洪志飞:课题分析,模块设计,子函数的编写。 2.确定数据结构 Philosopher -number:int -status:int +Philosopher(in num:int) +find() const:int +getinfo() const:int +Change():void 图 3-1 哲学家类的 UML 图 程序中定义一个哲学家类,包含两个私有对象和四个公有对象。 Number 对象:报讯哲学家的编号。 Status 对象:用于保存当前该哲学家的状态,0 表示正在等待(即处于饥饿状态) 1 表示得到餐具正在吃饭
4、,2 表示正在思考 Philosopher(int num)方法:哲学家类构造函数,参数 num表示哲学家编号 find() const 方法:返回该哲学家编号 getinfo() const 方法:返回哲学家当前状态 Change()方法:根据题目要求改变哲学家的状态(等待-进餐-思考-等 待) 另外,程序中包含一个公有对象,bool类型数组 tools6,用来保存 6 把餐当前 状态:true 表示该餐具当前空闲,false 表示该餐具当前正被使用。 程序中还包含两个公有函数:print 和 toolstatus。Print 用来返回一个哲学家的状 态,toolstatus 用来返回一个餐
5、具的状态。 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
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 周的时间,我完成了这次课程设计。 通过这次课程设计, 我学到了许多课本上学不到的知识, 注意到了许多课本上没有提到 的东西。 而且,通过这次设计,我得到了一个很好的理论联系实际的机会,锻炼了通过理论解决 实际问题的能力。正所谓“实践出真知” ,有些代码看上去没什么问题,但是实际运行起来 就是不出正确结果。 代码内部可能存在逻辑或语法等方面我们平时不会注意到的小问题, 通 过这次课程设计,我积累了不少这样小问题的解决