操作系统课设报告ldmWord格式.docx

上传人:b****6 文档编号:21601121 上传时间:2023-01-31 格式:DOCX 页数:10 大小:411.19KB
下载 相关 举报
操作系统课设报告ldmWord格式.docx_第1页
第1页 / 共10页
操作系统课设报告ldmWord格式.docx_第2页
第2页 / 共10页
操作系统课设报告ldmWord格式.docx_第3页
第3页 / 共10页
操作系统课设报告ldmWord格式.docx_第4页
第4页 / 共10页
操作系统课设报告ldmWord格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

操作系统课设报告ldmWord格式.docx

《操作系统课设报告ldmWord格式.docx》由会员分享,可在线阅读,更多相关《操作系统课设报告ldmWord格式.docx(10页珍藏版)》请在冰豆网上搜索。

操作系统课设报告ldmWord格式.docx

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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1