哲学家吃饭问题 实验报告 操作系统文档格式.docx
- 文档编号:17378446
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:8
- 大小:136.36KB
哲学家吃饭问题 实验报告 操作系统文档格式.docx
《哲学家吃饭问题 实验报告 操作系统文档格式.docx》由会员分享,可在线阅读,更多相关《哲学家吃饭问题 实验报告 操作系统文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
掌握进程同步问题的解决思路及方法,熟练使用Windows操作系统提供的信号量机制解决各种进程同步问题。
设有五个哲学家,共用一张放有五把椅子的餐桌,每人坐在一把椅子上,桌子上有五个碗和五只筷子,每人两边各放一只筷子。
哲学家们是交替思考和进餐,饥饿时便试图取其左右最靠近他的筷子。
条件:
(1)只有拿到两只筷子时,哲学家才能吃饭。
(2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。
(3)任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。
2.总体设计思想与相关知识
2.1总体设计思想
哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。
要求是:
每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;
哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺筷子;
哲学家每次就餐后必须放下他手中的两把筷子后恢复思考,不能强抓住餐具不放。
设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。
即设计一个能安排哲学家正常生活的程序。
可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐。
2.3.1最多允许4个哲学家同时坐在桌子周围。
2.3.2给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之。
2.3.3为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子,并且一次拿到两只筷子,否则不拿。
3.数据结构及流程图
3.1数据结构
philosopherProc
+myid:
int
+mystate:
int
+philosopherProc(LPVOIDlpParameter)+ResumeThread(hPhilosopher[i]):
+strcpy(stateStr,"
"
):
程序中定义一个哲学家类,包含两个私有对象和四个公有对象。
myid对象:
报讯哲学家的编号。
mystate对象:
用于保存当前该哲学家的状态,
philosopherProc(LPVOIDlpParameter)方法:
哲学家类构造函数,PHILOSOPHER_NUM表示哲学家编号
ResumeThread(hPhilosopher[i])方法:
返回该哲学家编号
strcpy(stateStr,"
)方法:
返回哲学家当前状态
根据题目要求改变哲学家的状态(饥饿->
进餐->
思考->
饥饿…………)
3.2流程图
4.源代码(c++)
//哲学家就餐问题的解法
#include<
windows.h>
process.h>
time.h>
stdlib.h>
stdio.h>
iostream>
usingnamespacestd;
//命名空间std内定义的所有标识符都有效
constunsignedintPHILOSOPHER_NUM=5;
//哲学家数目
constcharTHINKING=1;
/*标记当前哲学家的状态,1表示等待,2表示得到饥饿,3表示正在吃饭*/
constcharHUNGRY=2;
constcharDINING=3;
HANDLEhPhilosopher[5];
//定义数组存放哲学家
/*HANDLE(句柄)是windows操作系统中的一个概念。
指的是一个核心对象在某一个进程中的唯一索引*/
HANDLEsemaphore[PHILOSOPHER_NUM];
//semaphore用来表示筷子是否可用
HANDLEmutex;
//Mutex用来控制安全输出
DWORDWINAPIphilosopherProc(LPVOIDlpParameter)//返回DWORD(32位数据)的API函数philosopherProc
{
intmyid;
charidStr[128];
charstateStr[128];
charmystate;
intret;
unsignedintleftFork;
//左筷子
unsignedintrightFork;
//右筷子
myid=int(lpParameter);
itoa(myid,idStr,10);
WaitForSingleObject(mutex,INFINITE);
cout<
<
"
philosopher"
<
myid<
begin......"
endl;
ReleaseMutex(mutex);
mystate=THINKING;
//初始状态为THINKING
leftFork=(myid)%PHILOSOPHER_NUM;
rightFork=(myid+1)%PHILOSOPHER_NUM;
while(true)
{
switch(mystate)
caseTHINKING:
mystate=HUNGRY;
//改变状态
strcpy(stateStr,"
HUNGRY"
);
break;
caseHUNGRY:
ret=WaitForSingleObject(semaphore[leftFork],0);
//先检查左筷子是否可用
if(ret==WAIT_OBJECT_0)
{
ret=WaitForSingleObject(semaphore[rightFork],0);
//左筷子可用就拿起,再检查右筷子是否可用
mystate=DINING;
//右筷子可用,就改变自己的状态
DINING"
}
else
ReleaseSemaphore(semaphore[leftFork],1,NULL);
//如果右筷子不可用,就把左筷子放下
caseDINING:
//吃完后把两支筷子都放下
ReleaseSemaphore(semaphore[rightFork],1,NULL);
//改变自己的状态
THINKING"
//输出状态
is:
stateStr<
//sleeparandomtime:
between1-5s
intsleepTime;
sleepTime=1+(int)(5.0*rand()/(RAND_MAX+1.0));
Sleep(sleepTime*10);
}
intmain()
inti;
srand(time(0));
mutex=CreateMutex(NULL,false,NULL);
for(i=0;
i<
PHILOSOPHER_NUM;
i++)
semaphore[i]=CreateSemaphore(NULL,1,1,NULL);
hPhilosopher[i]=CreateThread(NULL,0,philosopherProc,LPVOID(i),CREATE_SUSPENDED,0);
ResumeThread(hPhilosopher[i]);
Sleep(2000);
return0;
5.运行结果
6.结果分析
对哲学家进行编号,将他们的初始状态全部设定为THINGKING,接着先从0开始改变他们的状态为HUNGRY,继续运行后4号和2号哲学家先DINING,3号和1号哲学家为HUNGRY,当4号哲学家吃完后,0号哲学家就开始DINING。
7.总结及心得体会
这次操作系统的作业让我深刻的体会到操作系统的知识作用。
培养我综合运用知识的能力,结合了c++的知识来解决这个问题。
巩固了以前的知识。
在设计这个程序的时候我遇到了很多困难,但是通过老师和同学们的帮助,我一一解决掉了。
而且发现了我很多学习中的不足之处,对以前学习的知识认识不够深刻,掌握的不够,这个要好好复习一下。
总的来说,这个操作系统的作业带给我很多收获,让我受益匪浅。
附件:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哲学家吃饭问题 实验报告 操作系统 哲学家 吃饭 问题 实验 报告