操作及进程同步的实现 哲学家就餐问题.docx
《操作及进程同步的实现 哲学家就餐问题.docx》由会员分享,可在线阅读,更多相关《操作及进程同步的实现 哲学家就餐问题.docx(11页珍藏版)》请在冰豆网上搜索。
操作及进程同步的实现哲学家就餐问题
课程设计
课程设计名称:
专业班级:
学生姓名:
学号:
指导教师:
课程设计时间:
2010/12/23
计算机科学专业课程设计任务书
学生姓名
专业班级
学号
题目
P、V操作及进程同步的实现2
课题性质
其它
课题来源
自拟课题
指导教师
同组姓名
主要内容
用语言编程实现P、V原语并用P、V原语哲学家就餐问题:
为每个哲学家各编一段程序描述他们的行为,试用P、V操作实现。
任务要求
掌握信号量通信方式的一般方法,了解系统实现“阻塞”和“唤醒”功能的方法和技巧。
同时掌握进程同步和互斥的概念及实现技术。
参考文献
任满杰等《操作系统原理实用教程》电子工业出版社2006
汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社2001
张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000
罗宇等《操作系统课程设计》机械工业出版社2005
审查意见
指导教师签字:
教研室主任签字:
年月日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
1需求分析
哲学家就餐问题是一种典型的同步问题,它是由Dijstra提出并解决的。
该问题描述如下:
有五个哲学家,他们的生活方式是交替的进行思考和进餐。
哲学家们公用一张圆桌,设5个哲学家分别为A,B,C,D,E,桌子上放着5把筷子,编号分别编号为0,1,2,3,4,桌子中央有一盘饭菜。
5个哲学家都很有礼貌,都要等同时拿到身旁的两只筷子才进餐,不然就只是等着继续思考,而且吃了一口之后又马上放下拿起的两根筷子,继续思考。
由于筷子数目有限,不能让5个哲学家同事进餐,而且甚至只能让其中的少数哲学家进餐,其他的哲学家只能轮流享用。
为每个哲学家各编一段程序描述他们的行为,解决哲学家就餐问题。
2概要设计
源程序中各个函数的作用说明:
intReadcount[n];
intchopstick[n];//筷子状态标志
voidGetchopstick(intnextw)//拿起筷子函数。
nextw为哲学家标号
voidDropchopstick(intnextr)//放下筷子函数
intselect();
intmain()//主函数操作
实验结构图:
3运行环境
硬件环境:
基于Xp的PC
软件环境:
WindowsXP
4开发工具和编程语言
开发工具:
VisualC++6.0
编程语言:
VisualC++
5详细设计
#include
#definen5
intin=0;
intout=0;
intReadcount[n];
intchopstick[n];//筷子状态标志
voidGetchopstick(intnextw)//拿起筷子函数。
nextw为哲学家标号
{
printf("第%d名哲学家肚子饿了,申请左边的筷子。
\n",nextw);
if(chopstick[nextw-1]==0||chopstick[nextw-1]==nextw)
{
in=nextw-1;
chopstick[in]=nextw;
printf("申请成功!
第%d名哲学家已经拿起左边一支编号为%d筷子,申请右边编号为%d的筷子。
\n",nextw,in,(in+1)%n);
in=(in+1)%n;
Readcount[nextw-1]=Readcount[nextw-1]+1;
if(chopstick[in]==0||chopstick[in]==nextw)
{
chopstick[in]=nextw;
Readcount[nextw-1]=Readcount[nextw-1]+1;
printf("申请成功!
第%d名哲学家再拿起右边一支编号为%d筷子,开开心心的吃饭啦!
\n",nextw,in);
}
elseprintf("申请失败!
第%d名哲学家只有一支筷子,只好干巴巴的盼着旁边的那位哲学家赶快吃完。
\n",nextw);
}
elseprintf("申请失败!
第%d名哲学家没有拿到筷子,只好干巴巴的等着旁边的那位哲学家赶快吃完。
\n",nextw);
}
voidDropchopstick(intnextr)//放下筷子函数。
{
//nextr为放下筷子的哲学家的编号
if(Readcount[nextr-1]!
=0)//判断筷子是否已经占用
{
if(Readcount[nextr-1]==2)
{
printf("该名哲学家吃饱啦!
准备放下筷子。
。
\n");
chopstick[nextr-1]=0;
chopstick[nextr]=0;
printf("该名哲学家已经放下筷子。
。
\n");
}
else{
printf("该名哲学家只有一支筷子!
又不能吃饭,只好准备放下筷子。
。
\n");
chopstick[nextr-1]=0;
printf("该名哲学家已经放下筷子。
。
\n");
}
}
elseprintf("该名哲学家没有筷子你还让他放下。
。
你好可恶啊,鄙视一下~\n");
}
intselect()
{
inti,nextw,nextr;
printf("请输入编号:
\n1---拿筷子过程\n2---放筷子过程\n3---退出\n");
scanf("%d",&i);
switch(i)
{
case1:
printf("现在进行哲学家拿筷子过程,请输入要申请筷子的哲学家编号(1-5)。
\n");
scanf("%d",&nextw);
if((nextw>0)&&(nextw<6))
{
Getchopstick(nextw);//拿筷子过程
}
else{printf("输入超出范围,请重新输入!
");}
break;
case2:
printf("现在进行哲学家放筷子过程,请输入要放筷子的哲学家编号(1-5)。
\n");
scanf("%d",&nextr);
if((nextr>0)&&(nextr<6))
{
Dropchopstick(nextr);//放筷子过程
}
else{printf("输入超出范围,请重新输入!
\n");}
break;
case3:
return(0);
default:
printf("输入超出范围,请重新输入.\n");
scanf("%d",&i);
}
return
(1);
}
intmain()//主函数操作
{
printf("哲学家就餐问题。
\n规则:
每个人只有申请到了左边的筷子才可以申请右边的筷子。
\n");
for(intm=0;m {
chopstick[m]=0;
}
for(intc=0;c {
Readcount[c]=0;
}
inti;
printf("请输入编号:
\n1---拿放筷子操作\n2---退出\n");
scanf("%d",&i);
while(i!
=2)
{
select();
printf("\n");
printf("请输入编号:
\n1---拿放筷子操作\n2---退出\n");
printf("\n");
scanf("%d",&i);
}
return
(1);
}
6调试分析
实验调试过程中遇到的问题:
起初认为这个设计题目还是比较简单的,但实验中还是遇到很多问题,容易绕弯路,实验要求用语言编程实现P、V原语并用P、V原语哲学家就餐问题:
为每个哲学家各编一段程序描述他们的行为,试用P、V操作实现。
特别是实现“阻塞”和“唤醒”功能过程中,频繁出错。
后来尝试添加chopstick[n];//筷子状态标志,解决了不能直观了解筷子状态这个问题。
7测试结果
源程序算法选择界面运行结果:
拿筷子操作:
放筷子操作:
拿筷子失败:
放筷子失败:
退出:
参考文献
[1]任满杰等,《操作系统原理实用教程》,电子工业出版社,2006
[3]汤子瀛汤小丹梁红兵等,《计算机操作系统》(修订版),西安电子科技大学出版社,2001
[4]张尧学史美林,《计算机操作系统教程》实验指导,清华大学出版社,2000
[5]罗宇等,《操作系统课程设计》,机械工业出版社,2005
心得体会
本次设计收获很多,基本掌握了信号量通信方式的一般方法,对同步和互斥的概念及实现技术也有了一定理解,特别是设计中用到的系统实现“阻塞”和“唤醒”功能的方法和技巧。
设计过程中遇到的一些问题,通过咨询老师、请教同学都一一解决。
以前不太懂的问题也通过本次设计予以解决,本次课程设计让我受益匪浅。
信息科学与工程学院课程设计成绩评价表
课程名称:
操作系统系统原理
设计题目:
处理机调度程序
专业:
计算机科学与技术班级:
1姓名:
学号
序号
评审项目
分数
满分标准说明
1
内容
思路清晰,语言表达准确,概念清楚,论点正确;设计方法科学,分析归纳合理;结论严谨,设计有应用价值。
任务饱满,工作量适中
2
创新
内容新颖,设计能反映新技术,对前人工作有改进或突破,或有独特见解
3
完整性、实用性
整体构思后合理,理论依据充分,设计完整,实用性强
4
数据准确、可靠
数据准确,算法设计合理
5
规范性
设计格式、绘图、实验数据、标准的运用等符合有关标准和规定
6
纪律性
遵守课程设计纪律,听从指导教师安排,设计过程态度认真
7
答辩
准备充分,思路清晰、论点正确、对设计方案理解深入,问题回答有理有据,简明正确
总分
综
合
意
见
指导教师年月日