操作系统
课程设计报告
题 目: 哲学家进餐问题
班 级:
学 号:
作者姓名:
指导教师:
2011年X月X日
目 录
1.设计题目求 1
11实验目 1
12设计求 1
13 初始条件 1
2.总体设计思想相关知识 2
21总体设计思想 2
22 界区互斥编程原理 2
23开发环境工具 3
3.数结构模块说明 3
31 数结构 3
32程序模块流程图 4
321 程序模块 4
323 返回哲学家状态模块 6
324 返回餐具状态模块 6
4.源程序代码 7
5.测试结果 11
6.课设总结 14
7.参考文献 15
1.设计题目求
11实验目
通实现哲学家进餐问题步深入解掌握进程步互斥原理
12设计求
哲学家N定全体达开始讨:讨间隙哲学家进餐进餐时需刀叉哲学家刀叉进餐哲学家数餐桌布置行设定实现刀叉互斥算法程序实现
13 初始条件
(1)操作系统:windows
(2)程序设计语言:C++
(3)设定圆桌六哲学家三刀叉图摆放:
图11 哲学家进餐问题设定图
2.总体设计思想相关知识
21总体设计思想
哲学家生活思考吃饭思考饿餐思考循环复求:哲学家位左右刀叉够餐哲学家先刀叉刀叉时抓旁边两餐具哲学家手中抢夺餐具哲学家次餐必须放手中两餐具恢复思考强抓住餐具放
设计程序够显示前哲学家状态桌餐具情况死锁推算出状态哲学家状态桌餐具情况设计安排哲学家正常生活程序
哲学家设计3种状态等进餐思考哲学家重复进行等>进餐>思考行动循环中:
等>进餐:哲学家处等进餐状态左右手两边餐具处空闲状态时发生种状态改变状态改变发生哲学家起左右手两边餐具
进餐>思考:状态改变发生哲学家放左右手餐具餐具状态中转变空闲
思考>等:哲学家思考结束条件转入等状态
述程序中应设置6元素信号量数组tools[6]保持哲学家间步
22 界区互斥编程原理
硬件界资源软件界资源进程必须互斥进行访问进程中访问界资源段代码称界区(Critical Section)
进程中访问界资源段程序称界区(Critical Section)(界资源次仅允许进程享资源)次准许进程进入界区进入允许进程进入硬件界资源软件界资源进程必须互斥进行访问
程序EnterCriticalSection (&cs)LeaveCriticalSection (&cs)两函数实现界区互斥
EnterCriticalSection (&cs)进入界区LeaveCriticalSection (&cs)离开界区
23开发环境工具
系统台:WINDOW环境
实现语言:C++
开发工具:VC++60
3.数结构模块说明
31 数结构
Philosopher
numberint
statusint
+Philosopher(in numint)
+find() constint
+getinfo() constint
+Change()void
图31 哲学家类UML图
程序中定义哲学家类包含两私象四公象
Number象:报讯哲学家编号
Status象:保存前该哲学家状态0表示正等(处饥饿状态)1表示餐具正吃饭2表示正思考
Philosopher(int num)方法:哲学家类构造函数参数num表示哲学家编号
find() const方法:返回该哲学家编号
getinfo() const方法:返回哲学家前状态
Change()方法:根题目求改变哲学家状态(等>进餐>思考>等…………)
外程序中包含公象bool类型数组tools[6]保存6餐前状态:true表示该餐具前空闲false表示该餐具前正
程序中包含两公函数:printtoolstatusPrint返回哲学家状态toolstatus返回餐具状态
32程序模块流程图
321 程序模块
图32 程序模块流程
322 状态改变模块
图33 状态改变模块Change()流程图
323 返回哲学家状态模块
图34 返回哲学家状态模块print()流程图
324 返回餐具状态模块
图35 返回餐具状态模块toolstatus(bool a)流程图
4.源程序代码
实验目:通实现哲学家进餐问题步深入解掌握进程步互斥原理
设计求:哲学家N定全体达开始讨:讨间隙哲学家进餐
进餐时需刀叉哲学家刀叉进餐哲学家数
餐桌布置行设定实现刀叉互斥算法程序实现
#include
#include
#include
#include
#include
using namespace std
bool tools[6] 全局变量餐工具
CRITICAL_SECTION cs 信号量 线程中界区
class Philosopher
{
private
int number
int status *标记前哲学家状态0表示正等(处饥饿状态)1表示两支筷子正吃饭2表示正思考*
public
Philosopher(int num0) status(2) number(num) { }
int find() const { return number }
int getinfo() const { return status }
void Change() 状态改变函数
}
void PhilosopherChange()
{
EnterCriticalSection (&cs) 进入界区
if(status1) 正进餐
{
tools[number6]true 放左手工具
tools[(number1)6]true 放右手工具
status2 改变状态思考
}
else if(status2) 思考中
{
status0 改变状态等
}
else if(status0) 等中
{
if(tools[number6]&&tools[(number1)6]) 左右手两边工具均空闲状态
{
tools[number6]false 起左手工具
tools[(number1)6]false 起右手工具
status1
}
}
LeaveCriticalSection (&cs)
}
string print(Philosopher *pA)
{
pA>Change()
int ipA>getinfo()
string str
if(i0)
str等
else if(i1)
str餐
else str思考
return str
}
string toolstatus(bool a)
{
string state
if(atrue)
state闲
if(afalse)
state
return state
}
int main()
{
char con 'y' 判断否继续
for(int i0i<6i++)
tools[i]true 3组刀叉未初始化
Philosopher P1(1)P2(2)P3(3)P4(4)P5(5)P6(6)
InitializeCriticalSection (&cs) 初始化初始化界区
cout<<状态说明示意图:<
{
P1Change()
P2Change()
P3Change()
P4Change()
P5Change()
P6Change()
cout<<前状态:<
cin>>con
Sleep(20)
}
DeleteCriticalSection (&cs) 退出资源区
return 0
}
5.测试结果
图51 程序运行开始界面
图52 哲学家状态1
图53 哲学家状态2
图54 哲学家状态3
图55 哲学家状态4
图56 退出程序
6.课设总结
前2周时间完成次课程设计
通次课程设计学许课学知识注意许课没提东西
通次设计理联系实际机会锻炼通理解决实际问题力正谓实践出真知代码没什问题实际运行起出正确结果代码部存逻辑语法等方面时会注意问题通次课程设计积累少样问题解决方法
设计中总会遇样样问题遇问题势必分析问题通种渠道解决问题利互联网次课程设计加强网查数检索问题力时候学知识次重学知识方法
7.参考文献
[1]宗华宗涛陈吉著 操作系统 北京:民邮电出版社2009
[2]李爱华程磊著 面相象程序设计(C++语言) 北京 清华学出版社2010
衡 yang 师 范学院
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档