操作系统课设报告ldmWord格式.docx
- 文档编号:21601121
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:10
- 大小:411.19KB
操作系统课设报告ldmWord格式.docx
《操作系统课设报告ldmWord格式.docx》由会员分享,可在线阅读,更多相关《操作系统课设报告ldmWord格式.docx(10页珍藏版)》请在冰豆网上搜索。
EnterCriticalSection(&
cs)用来进入临界区,LeaveCriticalSection(&
cs)用来离开临界区。
哲学家进餐问题设定图
<二>程序结构
1、主程序模块(详见图1)
2、状态改变模块(详见图2)
3、返回哲学家状态模块(详见图3)
4、返回餐具状态模块(详见图4)
<三>数据结构:
程序中定义一个哲学家类,包含两个私有对象和四个公有对象。
Number对象:
报讯哲学家的编号。
Status对象:
用于保存当前该哲学家的状态,0表示正在等待(即处于饥饿状态)1表示得到餐具正在吃饭,2表示正在思考
Philosopher(intnum)方法:
哲学家类构造函数,参数num表示哲学家编号
find()const方法:
返回该哲学家编号
getinfo()const方法:
返回哲学家当前状态
Change()方法:
根据题目要求改变哲学家的状态(等待->
进餐->
思考->
等待…………)
另外,程序中包含一个公有对象,bool类型数组tools[6],用来保存6把餐当前状态:
true表示该餐具当前空闲,false表示该餐具当前正被使用。
程序中还包含两个公有函数:
print和toolstatus。
Print用来返回一个哲学家的状态,toolstatus用来返回一个餐具的状态。
<四>程序流程图:
1、主程序模块
图1
2、状态改变模块
图2
3、返回哲学家状态模块
图3
4、返回餐具状态模块
图4
五.运行示例及结果分析
结果分析:
哲学家们抢餐具,但只能抢空闲的餐具,只有同时拿到了刀和叉才能就餐。
当哲学家只拿到一把餐具的时候,如果临近的餐具在用它抢不到,那这位哲学家就把拿到的餐具放下,继续等待临近两把餐具都闲的时候抢到了才能进餐。
根据这个原理就能分析结果了。
1号刀和3号叉式闲的时候,哲学家0号就抢到了餐具1号刀和3号,那哲学家0号就开始进餐了,当餐具刀2和叉2在用的时候4号哲学家在等待。
其他哲学家按照上面的原理得出结果。
运行示例如下图:
图5-1程序运行开始界面
图5-2哲学家状态1
图5-2哲学家状态2
图5-2哲学家状态3
图5-2哲学家状态4
图5-6退出程序
六、心得与体会
经过了前后共2周的时间,我完成了这次课程设计。
通过这次课程设计,我学到了许多课本上学不到的知识,注意到了许多课本上没有提到的东西。
设计中总会遇到这样那样的问题,遇到问题势必要自己分析问题,通过各种渠道解决问题,比如利用互联网。
这次课程设计也加强了我上网查数检索问题的能力。
有些时候,学习到的知识是次要的,重要的是学习知识的方法。
参考文献:
1、汤小丹编:
《计算机操作系统》(第三版),西安电子科技大学出版社
2、谭浩强编:
《C语言程序设计》,清华大学出版社
附录、源程序清单
#include<
windows.h>
#include<
time.h>
string>
iostream>
assert.h>
usingnamespacestd;
booltools[6];
//定义信号量,全局变量,数组用来保存6把餐当前状态:
true表示该餐具当前空闲,false表示该餐具当前正被使用CRITICAL_SECTIONcs;
//信号量,在线程中使用,临界区classPhilosopher{private:
intnumber;
//报讯哲学家的编号intstatus;
//标记当前哲学家的状态,0表示正在等待(即处于饥饿状态),1表示得到两支筷子正在吃饭,2表示正在思考public:
Philosopher(intnum=0):
status
(2),number(num){}//Philosopher(intnum)哲学家类构造函数,参数num表示哲学家编号intfind()const{returnnumber;
}//返回该哲学家编号intgetinfo()const{returnstatus;
}//返回哲学家当前状态voidChange();
//改变哲学家的状态(等待->
等待…………)};
voidPhilosopher:
:
Change(){EnterCriticalSection(&
cs);
//进入临界区实现临界区互斥if(status==1)//正在进餐{tools[number%6]=true;
//放下左手工具tools[(number-1)%6]=true;
//放下右手工具status=2;
//改变状态为思考}elseif(status==2)//思考中{status=0;
//改变状态为等待}elseif(status==0)//等待中{if(tools[number%6]&
&
tools[(number-1)%6])//左右手两边工具均为空闲状态{tools[number%6]=false;
//拿起左手工具tools[(number-1)%6]=false;
//拿起右手工具status=1;
//改变状态为进餐}}LeaveCriticalSection(&
//离开临界区。
实现临界区互斥}stringprint(Philosopher*pA)//用来返回一个哲学家的状态{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<
6;
i++)tools[i]=true;
//3组刀叉都未使用,初始化PhilosopherP1
(1),P2
(2),P3(3),P4(4),P5(5),P6(6);
//定义哲学家对象InitializeCriticalSection(&
//初始化初始化临界区cout<
<
"
-----------------------状态说明示意图:
-----------------------"
endl;
cout<
哲学家0号的状态"
"
哲学家5号的状态"
叉3的状态"
刀1的状态"
哲学家1号的状态"
刀3的状态"
叉1的状态"
哲学家4号的状态"
叉2的状态"
刀2的状态"
哲学家2号的状态"
哲学家3号的状态"
"
--------------------------"
哲学家开始生活:
while(con=='
)//哲学家状态发生改变{P1.Change();
P2.Change();
P3.Change();
P4.Change();
P5.Change();
P6.Change();
//输出当前状态图cout<
当前状态为:
P1.find()<
print(&
P1)<
P6.find()<
P6)<
toolstatus(tools[0])<
toolstatus(tools[1])<
P2.find()<
P2)<
toolstatus(tools[5])<
toolstatus(tools[2]);
P5.find()<
P5)<
toolstatus(tools[4])<
toolstatus(tools[3])<
P3.find()<
P3)<
P4.find()<
P4)<
若要继续下一状态,输入y;
输入其他,结束程序:
cin>
>
con;
Sleep(20);
}DeleteCriticalSection(&
//退出资源区return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 报告 ldm
![提示](https://static.bdocx.com/images/bang_tan.gif)