课程设计哲学家就餐问题

上传人:aa****6 文档编号:38388091 上传时间:2018-05-01 格式:DOC 页数:19 大小:537.50KB
返回 下载 相关 举报
课程设计哲学家就餐问题_第1页
第1页 / 共19页
课程设计哲学家就餐问题_第2页
第2页 / 共19页
课程设计哲学家就餐问题_第3页
第3页 / 共19页
课程设计哲学家就餐问题_第4页
第4页 / 共19页
课程设计哲学家就餐问题_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《课程设计哲学家就餐问题》由会员分享,可在线阅读,更多相关《课程设计哲学家就餐问题(19页珍藏版)》请在金锄头文库上搜索。

1、操作系统课程设计报告院(系):院(系): 计算机科学学院 专业:专业: 计算机科学与技术专业 学学生生姓姓名名 : : 李海军 班级:班级:计本(2)班 学号学号: 5 题目题目:模拟仿真哲学家进餐问题的解决过程及方法 起讫日期起讫日期: 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 程序各

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

3、)操作系统:windows(2)程序设计语言:C+(3)设定圆桌上有六个哲学家,三对刀叉,如下图摆放:图 1-1 哲学家进餐问题设定图32 总体设计思想及总体设计思想及相关知识相关知识2.1 总体设计思想总体设计思想哲学家的生活就是思考和吃饭,即思考,就餐,再思考,往复循环。要求是:每一个哲学家只有在拿到位于他左右的刀叉后,才能够就餐;哲学家只能先拿一把刀或叉,再去拿另一把刀或叉,而不能同时去抓他旁边的两把餐具,也不能从其他哲学家手中抢夺餐具;哲学家每次就餐后必须放下他手中的两把餐具后恢复思考,不能强抓住餐具不放。设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出

4、下一状态各哲学家的状态和桌上餐具的使用情况。即设计一个能安排哲学家正常生活的程序。为哲学家设计 3 种状态,即“等待” “进餐” “思考” 。每个哲学家重复进行“等待”-“进餐”-“思考”的行动循环。其中:“等待”-“进餐”:只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。此状态改变发生后,哲学家拿起左右手两边的餐具。“进餐”-“思考”:此状态改变发生后,哲学家放下左右手上的餐具。餐具状态由“使用中”转变为“空闲” 。“思考”-“等待”:哲学家思考结束后,无条件转入等待状态。由上所述,程序中应设置 6 个元素的信号量数组,tools6,用来保持哲学

5、家之间的同步。2.2 临界区互斥编程原理临界区互斥编程原理不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区(Critical Section) 。 每个进程中访问临界资源的那段程序称为临界区(Critical Section) (临界资源是一次仅允许一个进程使用的共享资源) 。每次只准许一个进程进入临界区,4进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。本程序主要使用了 EnterCriticalSection ( /控制活动线程数目的信号量(保护线程共享资源)bool tools

6、6;/全局变量,用餐工具CRITICAL_SECTION cs; /信号量, 在线程中使用,临界区class Philosopher private: int number;int status; /*标记当前哲学家的状态,0 表示正在等待(即处于饥饿状态),1表示得到两支筷子正在吃饭,2 表示正在思考*/public:11Philosopher(int num=0): status(2), number(num) int find() const return number; int getinfo() const return status; void Change() ; /状态改变函数

7、; void Philosopher:Change() EnterCriticalSection ( /进入临界区if(status=1)/正在进餐toolsnumber%6=true; /放下左手工具tools(number-1)%6=true; /放下右手工具status=2;/改变状态为思考 else if(status=2)/思考中 status=0; /改变状态为等待 else if(status=0)/等待中 if(toolsnumber%6 /拿起左手工具tools(number-1)%6=false; /拿起右手工具status=1; 12LeaveCriticalSectio

8、n ( string print(Philosopher *pA) /pA-Change(); int i=pA-getinfo(); string str; if(i=0) str=“等待“; else if(i=1) str=“就餐“; else str=“思考“; return str; string toolstatus(bool a)string state;if(a=true)state=“闲“;if(a=false)state=“用“;return state;int main() 13 char con = y; /判断是否继续for(int i=0;icon;Sleep(20

9、); DeleteCriticalSection ( /退出资源区return 0; 155. 测试及结果测试及结果图 5-1 程序运行开始界面图 5-2 哲学家状态 116图 5-3 哲学家状态 2图 5-4 哲学家状态 317图 5-5 哲学家状态 4图 5-6 退出程序6. 课设总结课设总结经过了前后共 2 周的时间,我完成了这次课程设计。通过这次课程设计,我学到了许多课本上学不到的知识,注意到了许多课本上没有提到的东西。而且,通过这次设计,我得到了一个很好的理论联系实际的机会,锻炼了通过理论解18决实际问题的能力。正所谓“实践出真知” ,有些代码看上去没什么问题,但是实际运行起来就是不出正确结果。代码内部可能存在逻辑或语法等方面我们平时不会注

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号