资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1目录目录1设计题目与要求.21.1 实验目的.2 1.2 设计要求.2 1.3 初始条件.22 总体设计思想及相关知识 .32.1 总体设计思想.3 2.2 临界区互斥编程原理 .3 2.3 开发环境与工具 .43 数据结构与模块说明.43.1 数据结构.43.2.1 主程序模块 .53.2.2 状态改变模块 .53.2.3 返回哲学家状态模块 .63.2.4 返回餐具状态模块 .74. 源程序代码.85. 测试及结果.136. 课设总结.177. 参考文献.1821设计题目与要求设计题目与要求1.1 实验目的实验目的通过实现哲学家进餐问题的互步,深入了解和掌握进程互斥的原理。1.2 设计要求设计要求哲学家有 N 个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。1.3 初始条件初始条件(1)操作系统:windows(2)程序设计语言:C+(3)设定圆桌上有六个哲学家,三对刀叉,如下图摆放:图 1-1 哲学家进餐问题设定图32 总体设计思想及总体设计思想及相关知识相关知识2.1 总体设计思想总体设计思想哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是:每一个哲学家只有在拿到位于他左右的刀叉后,才能够就餐;哲学家只能先拿一把刀或叉,再去拿另一把刀或叉,而不能同时去抓他旁边的两把餐具,也不能从其他哲学家手中抢夺餐具;哲学家每次就餐后必须放下他手中的两把餐具后恢复思考,不能强抓住餐具不放。设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。即设计一个能安排哲学家正常生活的程序。为哲学家设计 3 种状态,即“等待” “进餐” “思考” 。每个哲学家重复进行“等待”-“进餐”-“思考”的行动循环。其中:“等待”-“进餐”:只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。此状态改变发生后,哲学家拿起左右手两边的餐具。“进餐”-“思考”:此状态改变发生后,哲学家放下左右手上的餐具。餐具状态由“使用中”转变为“空闲” 。“思考”-“等待”:哲学家思考结束后,无条件转入等待状态。由上所述,程序中应设置 6 个元素的信号量数组,tools6,用来保持哲学家之间的同步。2.2 临界区互斥编程原理临界区互斥编程原理不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区(Critical Section) 。 每个进程中访问临界资源的那段程序称为临界区(Critical Section) (临界资源是一次仅允许一个进程使用的共享资源) 。每次只准许一个进程进入临界区,4进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。本程序主要使用了 EnterCriticalSection ( bool tools6;/全局变量,用餐工具CRITICAL_SECTION cs; /信号量, 在线程中使用,临界区class Philosopher private: int number;int status; /标记当前哲学家的状态,0 表示正在等待(即处于饥饿状态),1 表示得到两支筷子正在吃饭,2 表示正在思考public:Philosopher(int num=0): status(2), number(num) int find() const return number; int getinfo() const return status; void Change() ; /状态改变函数; void Philosopher:Change() EnterCriticalSection ( /进入临界区if(status=1)/正在进餐toolsnumber%6=true; /放下左手工具10tools(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; LeaveCriticalSection ( string print(Philosopher *pA) int i=pA-getinfo(); string str; if(i=0) str=“等待“; else if(i=1) str=“就餐“; 11else str=“思考“; return str; string toolstatus(bool a)string state;if(a=true)state=“闲“;if(a=false)state=“用“;return state;int main() char con = x; /判断是否继续for(int i=0;icon;13Sleep(20); DeleteCriticalSection ( /退出资源区return 0; 5. 测试及结果测试及结果图 5-1 程序运行开始界面14图 5-2 哲学家状态 115图 5-3 哲学家状态 2图 5-4 哲学家状态 316图 5-5 哲学家状态 417图 5-6 退出程序6. 课设总结课设总结通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。通过这次操作系统课程设计, 是我学习到了很多东西。1. 多线程编程对于解决一些并发性的问题是很高效的,而且也很必要,现在学习了使用多线程编程,对于以后解决类似的并发性问题,都会很有用。2 虽然我们学习的操作系统理论课里面说多线程间的执行顺序具有随机性和不确定性,但我们毕竟是在一个特定的操作系统平台上实验,Windows 的线程调度机制我是不得而知的,所以出现的一些奇怪的问题也很难调试,只好人为地去改变线程间的顺序以求模拟出一定的随机性。3. 实验得以完成,需要掌握几个核心的内容,首先是信号量以及互斥,饥饿,死锁的相关知识;其次是线程函数调用的相关知识;当然还有 MFC 方面的。4. 通过实验可以看出,操作系统原理的许多讨论和方法并不是空洞的,在实践中有其具体的应用。 通过实验操作的方式使得对相关知识的掌握更加的深刻和透彻。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!187. 参考文献参考文献计算机操作系统 西安电子科技大学出版社面向对象程序设计 电子出版社操作系统实验教程 ,张丽芬、刘利雄、王全玉等,清华大学出版社。操作系统原理与实践教程周湘贞、曾
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号