哲学家进餐问题文档_第1页
哲学家进餐问题文档_第2页
哲学家进餐问题文档_第3页
哲学家进餐问题文档_第4页
哲学家进餐问题文档_第5页
免费预览已结束,剩余15页可下载查看

下载本文档

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

文档简介

1、目录1设计题目与要求 21.1 实验目的 21.2 设计要求 21.3 初始条件 22. 总体设计思想及相关知识 32.1 总体设计思想 32.2 临界区互斥编程原理 32.3 开发环境与工具 43. 数据结构与模块说明 43.1 数据结构 43.1.1 主程序模块 53.1.2 状态改变模块 53.1.3 返回哲学家状态模块 63.1.4 返回餐具状态模块 74. 源程序代码 85. 测试及结果 136. 课设总结 157. 参考文献 16201 .设计题目与要求1.1 实验目的通过实现哲学家进餐问题的互步,深入了解和掌握进程互斥的原理。1.2 设计要求哲学家有N个,也定全体到达后开始讨论:

2、在讨论的间隙哲学家进餐,每人进餐 时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。哲学家的人数、 餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。1.3 初始条件(1)操作系统:windows(2)程序设计语言:C+(3)设定圆桌上有六个哲学家,三对刀叉,如下图摆放:哲学家编号讶 凹1号刀2埼又 图 2号刀图1-1哲学家进餐问题设定图2 总体设计思想及相关知识2.1 总体设计思想哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是: 每一个哲学家只有在拿到位于他左右的刀叉后, 才能够就餐; 哲学家只能先拿一把刀或叉, 再去拿另一把刀或叉, 而不能同时去抓他

3、旁边的两把餐具, 也不能从其他哲学家手中抢夺餐具; 哲学家每次就餐后必须放下他手中的两把餐具后恢复思考,不能强抓住餐具不放。设计一个程序, 能够显示当前各哲学家的状态和桌上餐具的使用情况, 并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。 即设计一个能安排哲学家正常生活的程序。为哲学家设计3 种状态,即“等待” “进餐” “思考” 。每个哲学家重复进行“等待”-> “进餐”-> “思考”的行动循环。其中:“等待”-> “进餐”:只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。此状态改变发生后,哲学家拿起左右手两边的餐

4、具。“进餐”-> “思考”:此状态改变发生后,哲学家放下左右手上的餐具。餐具状态由“使用中”转变为“空闲” 。“思考”-> “等待”:哲学家思考结束后,无条件转入等待状态。由上所述,程序中应设置6 个元素的信号量数组, tools6 ,用来保持哲学家之间的同步。2.2 临界区互斥编程原理不论是硬件临界资源, 还是软件临界资源, 多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区( Critical Section) 。每个进程中访问临界资源的那段程序称为临界区( Critical Section ) (临界资源是一次仅允许一个进程使用的共享资源) 。每次只准

5、许一个进程进入临界区,进入后不允许其他进程进入。 不论是硬件临界资源, 还是软件临界资源, 多个进程必须互斥地对它进行访问。本程序主要使用了 EnterCriticalSection (&cs)和 LeaveCriticalSection (&cs)两 个函数实现临界区互斥。EnterCriticalSection (&cs)用来进入临界区,LeaveCriticalSection (&cs)用来离 开临界区。2.3 开发环境与工具系统平台:WINDOW环境实现语言:C+开发工具:VC+6.03 数据结构与模块说明3.1 数据结构程序中定义一个哲学家类,包含两个

6、私有对象和四个公有对象。Number对象:报讯哲学家的编号。Status对象:用于保存当前该哲学家的状态,0表示正在等待(即处于饥饿状态)1 表示得到餐具正在吃饭, 2 表示正在思考Philosopher(int num)方法:哲学家类构造函数,参数 num表示哲学家编号find() const 方法:返回该哲学家编号getinfo() const 方法:返回哲学家当前状态Change(方法:根据题目要求改变哲学家的状态(等待,进餐,思考,等待)另外,程序中包含一个公有对象, bool 类型数组 tools6 ,用来保存6 把餐具当前状态: true表示该餐具当前空闲,false表示该餐具当前

7、正被使用。程序中还包含两个公有函数:print和toolstatus。Print用来返回一个哲学家的状态,toolstatus用来返回一个餐具的状态。3.2程序各模块流程图3.2.1主程序模块是结束图3-2主程序模块流程图3.2.2状态改变模块是7荤数左右于鞋具1t uuli niuiLbel3JG - false .tools (number-L)*6=fale-_W改奏状态为迸蜃二st atus=l 5图3-3状态改变模块Change(流程图3.2.3返回哲学家状态模块图3-4返回哲学家状态模块print()流程图3.2.4返回餐具状态模块图3-5返回餐具X态模块toolstatus(bo

8、ol a流程图4. 源程序代码目的:通过实现哲学家进餐问题的互步,深入了解和掌握进程互斥的原理。设计要求:哲学家有 N个,规定全体到齐后开始讨论,在讨论的间隙哲学家进餐,每 人进餐时都需使用刀、叉合一把,所有哲学家刀和叉都拿到后才能进餐。哲学家的人数、餐 桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。#include <windows.h>#include <time.h>#include <string>#include <iostream>#include <assert.h>using namespace std;bo

9、ol tools6; /全局变量,用餐工具CRITICAL_SECTION cs; / 信号量 , 在线程中使用,临界区class Philosopherprivate: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() ;/

10、状态改变函数;void Philosopher:Change()EnterCriticalSection (&cs) ; / 进入临界区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) /左右手两边工具均为空闲状态toolsnumber%6=f

11、alse;/ 拿起左手工具tools(number-1)%6=false; /拿起右手工具 status=1;LeaveCriticalSection (&cs) ;string print(Philosopher *pA)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="

12、 闲 "if(a=false)state="用"return state;int main()char con = 'x' / 判断是否继续for(int i=0;i<6;i+)toolsi=true; /3 组刀叉都未使用,初始化Philosopher P1(1),P2(2),P3(3),P4(4),P5(5),P6(6);InitializeCriticalSection (&cs) ; / 初始化临界区cout<<" 状态说明示意图: "<<endl;cout<<"

13、;"<<" 哲学家 1 号的状态 "<<""<<endl;cout<<" 哲学家 6 号的状态 "<<""<<" 叉 3 的状态 "<<""<<" 刀 1 的状态<<"<<" 哲学家 2 号的状态 "<<endl;cout<<""<<" 刀 3

14、 的状态 "<<""<<" 叉 1 的状 态"«endl;cout«"哲学家5号的状态"«""«""«"哲学家3号的状态"«endl;cout«""«"哲学家4号的状态"«""«endl;cout<<”餐具的状态,“用”表示使用中,“闲”表示空闲中。"<&l

15、t;endl;cout«""«endl;cout<<"哲学家们开始生活:"«endl;cout«endl;cout«endl;while(con='x')(P1 .Change();P2.Change();P3.Change();P4.Change();P5.Change();P6.Change();cout<<"当前状态为:"<<endl;cout«""«P1 .find()«pri

16、nt(&P1)«""«endl;cout«P6.find()«print(&P6)<<" "«toolstatus(tools0)«""«toolstatus(tools1 )«""«P2.find()«print(&P2)«endl;cout«" "«toolstatus(tools5)«""

17、1;toolstatus(tools2)«endl;cout«P5.find()«print(&P5)<<" "«toolstatus(tools4)«""«toolstatus(tools3)«""«P3.find()«print(&P3)«endl;cout«""«P4.find()«print(&P4)«""

18、1;endl;cout«""«endl;cout<<"若要继续下一状态,输入 X;输入其他,结束程序: cin»con;Sleep(20);DeleteCriticalSection (&cs) ; / 退出资源区 return 0;5. 测试及结果5-1 程序运行开始界面5-2 哲学家状态15-3 哲学家状态25-4 哲学家状态35-5 哲学家状态45-6 退出程序6. 课设总结通过这次课程设计使我们懂得了理论与实际相结合是很重要的, 只有理论知识是远远不够的, 只有把所学的理论知识与实践相结合起来, 从理论中得出结论,才能真正为社会服务, 从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中发现了自己的不足之处, 对一些前面学过的知识理解得不够深刻, 掌握得不够牢固, 通过这次课程设计之后, 我们把前面所学过的知识又重新温故了一遍。 通过这次操作系统课程设计, 是我学习到了

温馨提示

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

评论

0/150

提交评论