计算机信息与工系.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

yx118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档