- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机信息与工程系
哲学家就餐算法
——操作系统课程设计
姓名:
姓名:
学号:
指导老师:
应用原理
两个或多个进程无限地等待一个事件,而该事件只能由这些等待进程之一来产生,这个现象就被称为死锁。进程在信号量内无穷等待的情况,被称为饥饿。
这个哲学家就餐问题就是模仿进程之间的同步、饥饿、死锁现象。五个哲学家围坐在一个圆桌上,每两个哲学家之间有一支筷子。在哲学家思考一段时间后就会饥饿,然后就想拿起身边的筷子两边各一支。吃完后放下筷子继续思考,形成一个循环。但是如果当两个相邻的哲学家同时想吃饭时,必须有一个哲学家身边只有一支筷子,必须等待其相邻的哲学家吃完后,放下身边的另一支筷子,才能进餐。如果一个哲学家无限期的等待一支筷子,就会被饿死,也就是进程中的饥饿。当他们互相循环等待的时候,就形成了死锁。这其中,哲学家就好像进程,筷子就好像临界资源。
对于饥饿和死锁的问题,我是这么解决的:当哲学家想吃饭时,首先判断是不是两边同时都有筷子,如果都有得话就吃饭,吃完再把两边的筷子都放下;如果只有一边又筷子的话就等待,不吃饭。这样就不会造成饥饿和死锁现象。
01
0
1
43210
4
3
2
1
0
2
2
3
3
4
4
程序原理图
循环是否结束结束
循环是否结束
结束
随即选一个并判断饥饿
选择另一哲学家
主函数
初始哲学家状态
打印哲学家状态
轮转哲学家状态
否 是
否
是
具体程序
随即选择一个哲学家吃饭
srand((unsigned)time(0));
j=rand()% 10;
d=j % 5;
这段代码会随机产生一个数字,并处理在0~4之间,使之成为五个哲学家中的一个,srand函数的功能是,设置新的尾随机数序列的种子。根据时间不同这个随机数会不一样。rand就是产生这个随机数,用% 10 变成0~9之间的数,再由% 5变成0~4之间数。
设置哲学家的状态
char *lun(char *b,int i){
if(strcmp(b,吃饭)==0){
b=思考;
return b;
}
else if(strcmp(b,思考)==0){
b=饥饿;
return b;
}
else if(strcmp(b,饥饿)==0){
if(e[i]!=0)
e[i]-=1;
b=饥饿;
return b;
我设计的哲学家的状态其实就是一个字符串类型的数组,转变状态只需要改变字符串的内容即可。
选择第二个能吃饭的哲学家
int second(int c){
int d;//前一个筷子的随机数
int l;//当前筷子
int f;//前一个筷子
int j;//判断请求状态
int i;//判断吃状态
int k;
int h=5;//等待时间
d=c-1;
l=c % 5;
f=d % 5;
cho[l]=T;
cho[f]=T;
for (j=c;jc+5;j++){
if (strcmp(cho[j % 5],F)==0 strcmp(cho[(j-1) % 5],F)==0 strcmp(phi[j % 5],饥饿)==0)
phi[j % 5]=wanting;
}
k=j % 5;
for (i=0;i5;i++){
if(strcmp(phi[i],wanting)==0 e[i]h){
h=e[i];
k=i;
}
}
return k;
}
这个函数其实是整个算法的中心内容,因为同时可以有两个哲学家的可以吃饭,所以要一个一个判断是谁可以吃饭。第一个可以吃饭的哲学家是随机产生的,而第二个就是根据第一个哲学家的编号来确定的。根据第一个哲学家的编号,可以确定哪两个编号的筷子被拿起,从而判断哪两个筷子的组合可以确定另一个哲学家可以吃饭,往往会有两个哲学家同时满足要求,那么根据哪个哲学家的等待时间长来判断,这个操作有整数型的数组e来实现。
运行结果
程序代码
#includestdio.h
#includestring.h
#includemath.h
#includestdlib.h
#includetime.h
char *phi[]={思考,思考,思考,思考,思考};
char *cho[]={F,F,F,F,F};
int e[]={4,4,4,
原创力文档


文档评论(0)