操作系统课程设计 哲学家进餐问题.docx
- 文档编号:25560886
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:17
- 大小:236.13KB
操作系统课程设计 哲学家进餐问题.docx
《操作系统课程设计 哲学家进餐问题.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计 哲学家进餐问题.docx(17页珍藏版)》请在冰豆网上搜索。
操作系统课程设计哲学家进餐问题
哲学家进餐问题课程设计
学院
计算机信息与工程学院
专业
计算机科学与技术
课程名称
操作系统
题目
哲学家进餐问题
完成期限
自2014年6月3日至2014年6月30日共4周
内
容
及
任
务
一、项目的目的
(1)通过实现哲学家进餐问题的同步,深入了解和掌握进程同步和互斥的原理。
(2)了解并掌握利用信号量解决资源死锁问题。
(3)加强对c++语言的编写能力。
二、项目任务的主要内容和要求
设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况
三、项目设计(研究)思路
本次设计包括了总体设计,模块设计,以及程序编写等步骤,主要研究哲学家进餐问题,利用记录信号量避免产生资源死锁问题,设计时候首先总体需求分析,其次模块求精,最后测试编写的程序,采用了在windows环境下的c++语言解决哲学家进餐问题。
四、具体成果形式和要求
程序最后能够显示五个哲学家和五支筷子的状态,能够清楚显示资源是否释放,以及各哲学家对资源的竞争。
进
度
安
排
起止日期
工作内容
6月3至6月10
总体设计思想的分析
6月10至6月17日
从总体到部分,了解程序所需的变量以及函数,对模块进行分析。
6月17日至6月30日
根据总体和模块的分析,编写程序,并且对程序进行编译和测试。
主
要
参
考
资
料
1.汤小丹,计算机操作系统[第三版],西安电子科技出版社,2007;
2.黄干平,陈洛资,等.计算机操作系统.北京:
科学出版社,1989;
3.李勇,陈恩林.计算机体系结构.长沙:
国防科技大学出版;
4.黄祥喜,计算机操作系统实验教程.广州:
中山大学出版社,1994.
指导教师
意见
(签字):
年月日
系(教研室)主任意见
(签字):
年月日
哲学家进餐问题设计说明书(或论文)
(封面)
学院名称:
计算机信息与工程学院
班级名称:
2012级计算机科学与技术
学生姓名:
操飞飞
学号:
**********
题目:
哲学家进餐问题
指导教师
************************************
起止日期:
2014年6月3日至2014年6月30日
第二部分:
参考文献……………………………………………………………………………9
第一部分:
正文部分
一、选题背景
哲学家进餐问题
由Dijkstra提出并解决的哲学家进餐问题(TheDinningPhilosophersProblem)是典型的同步问题,该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐,平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐毕,放下筷子继续思考.
此次课程设计的主要内容是模拟实现资源分配。
同时要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。
二、设计思路
(1)总体设计思想
为哲学家设计3种状态,即“等待”“进餐”“思考”。
每个哲学家重复进行“等待”->“进餐”->“思考”的行动循环。
其中:
“等待”->“进餐”:
只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。
此状态改变发生后,哲学家拿起左右手两边的餐具。
“进餐”->“思考”:
此状态改变发生后,哲学家放下左右手上的餐具。
餐具状态由“使用中”转变为“空闲”。
“思考”->“等待”:
哲学家思考结束后,无条件转入等待状态。
设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。
即设计一个能安排哲学家正常生活的程序。
(2)资源互斥问题
不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。
每个进程中访问临界资源的那段代码称为临界区(CriticalSection)。
每个进程中访问临界资源的那段程序称为临界区(CriticalSection)(临界资源是一次仅允许一个进程使用的共享资源)。
每次只准许一个进程进入临界区,进入后不允许其他进程进入。
不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问
本程序主要使用了EnterCriticalSection(&cs)和LeaveCriticalSection(&cs)两个函数实现临界区互斥。
EnterCriticalSection(&cs)用来进入临界区,LeaveCriticalSection(&cs)用来离开临界区。
三、过程论述
(1)数据结构
①classPhilosopher:
定义一个哲学家类,包含两个私有对象和四个公有对象。
②intnumber,intstatus:
用于记录哲学家编号以及用于保存当前该哲学家的状态,0表示正在等待(即处于饥饿状态)1表示得到餐具正在吃饭,2表示正在思考。
③Philosopher(intnum)方法:
哲学家类构造函数,参数num表示哲学家编号。
④find()const方法:
返回该哲学家编号。
⑤getinfo()const方法:
返回哲学家当前状态。
⑥Change()方法:
根据题目要求改变哲学家的状态(等待->进餐->思考->等待…………)
⑦booltools[5]:
bool类型数组tools[6],用来保存6把餐当前状态:
true表示该餐具当前空闲,false表示该餐具当前正被使用。
⑧Print:
Print用来返回一个哲学家的状态。
⑨toolstatus:
toolstatus用来返回一个餐具的状态。
⑩EnterCriticalSection(&cs)和LeaveCriticalSection(&cs):
用来进入临界区及用来离开临界区。
(2)程序模块
①主程序模块
图3.1主程序模块
②状态改变模块
图3.2状态改变程序模块
③返回哲学家状态模块
图3.3哲学家状态模块
④返回餐具状态模块
图3.4餐具状态模块
四、结果分析
(1)程序开始执行状态
图4.1程序开始执行状态
(2)哲家状态图
图4.2哲学家的状态图1
图4.3哲学家状态图2
图4.4哲学家状态图3
图4.5哲学家状态图4
(3)程序结束图
图4.6程序结束图
五、结论(或总结)
经过4周的时间完成了这次的课程设计,通过这次课程设计,我解决了哲学家进餐问题,加深了windows平台下信号量的理解,了解死锁的产生以及死锁的解决方法。
而且,通过这次设计,我学到了许多课本上学不到的知识,注意到了许多课本上没有提到的东西,我得到了一个很好的理论联系实际的机会,锻炼了通过理论解决实际问题的能力。
正所谓“实践出真知”,有些代码看上去没什么问题,但是实际运行起来就是不出正确结果。
代码内部可能存在逻辑或语法等方面我们平时不会注意到的小问题,通过这次课程设计,我积累了不少这样小问题的解决方法。
设计中总会遇到这样那样的问题,遇到问题势必要自己分析问题,通过各种渠道解决问题,比如利用互联网。
这次课程设计也加强了我上网查数检索问题的能力。
有些时候,学习到的知识是次要的,重要的是学习知识的方法。
第二部分:
参考文献
1.汤小丹,计算机操作系统[第三版],西安电子科技出版社,2007;
2.黄干平,陈洛资,等.计算机操作系统.北京:
科学出版社,1989;
3.李勇,陈恩林.计算机体系结构.长沙:
国防科技大学出版,1987;
4.黄祥喜,计算机操作系统实验教程.广州:
中山大学出版社,1994.
学生签名:
操飞飞填表日期:
2014年6月15日
第三部分:
指导教师评语
第四部分:
成绩评定
指导教师签名:
填表日期:
年月日
附录
#include
#include
#include
#include
#include
usingnamespacestd;//控制活动线程数目的信号量(保护线程共享资源)
booltools[5];//全局变量,用餐工具
CRITICAL_SECTIONcs;//信号量,在线程中使用,临界区
classPhilosopher
{
private:
intnumber;
intstatus;/*标记当前哲学家的状态,0表示正在等待(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考*/
public:
Philosopher(intnum=0):
status
(2),number(num){}
intfind()const{returnnumber;}
intgetinfo()const{returnstatus;}
voidChange();//状态改变函数
};
voidPhilosopher:
:
Change()
{
EnterCriticalSection(&cs);//进入临界区
if(status==1)//正在进餐
{
tools[number%5]=true;//放下左手工具
tools[(number+1)%5]=true;//放下右手工具
status=2;//改变状态为思考
}
elseif(status==2)//思考中
{
status=0;//改变状态为等待
}
elseif(status==0)//等待中
{
if(tools[number%5]&&tools[(number+1)%5])//左右手两边工具均为空闲状态
{
tools[number%5]=false;//拿起左手工具
tools[(number+1)%5]=false;//拿起右手工具
status=1;
}
}
LeaveCriticalSection(&cs);
}
stringprint(Philosopher*pA)
{
//pA->Change();
inti=pA->getinfo();
stringstr;
if(i==0)
str="等待";
elseif(i==1)
str="就餐";
elsestr="思考";
returnstr;
}
stringtoolstatus(boola)
{
stringstate;
if(a==true)
state="闲";
if(a==false)
state="用";
returnstate;
}
intmain()
{
charcon='y';//判断是否继续
for(inti=0;i<5;i++)
tools[i]=true;
PhilosopherP1
(1),P2
(2),P3(3),P4(4),P5(5);
InitializeCriticalSection(&cs);//初始化初始化临界区
cout<<"-----------------------状态说明示意图:
-----------------------"< cout<<""<<"哲学家1号的状态"<<""< cout<<""<<"筷5的状态"<<""<<"筷1的状态"< cout<<"哲学家5号的状态"<<""<<"哲学家2号的状态"< cout<<""<<"筷4的状态"<<""<<"筷2的状态"< cout<<"哲学家4号的状态"<<""<<"筷3的状态"<<""<<"哲学家3号的状态"< cout<<"--------------------------"< cout<<"哲学家们开始生活: "< cout< cout< while(con=='y') { P1.Change(); P2.Change(); P3.Change(); P4.Change(); P5.Change(); cout<<"当前状态为: "< cout<<""< cout<<""< cout< cout<<""< cout< cout<<"--------------------------"< cout<<"若要继续下一状态,输入y;输入其他,结束程序: "; cin>>con; Sleep(20); } DeleteCriticalSection(&cs);//退出资源区 return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统课程设计 哲学家进餐问题 操作系统 课程设计 哲学家 进餐 问题