PV操作及进程同步的实现2哲学家就餐问题.docx

上传人:b****8 文档编号:11240864 上传时间:2023-02-26 格式:DOCX 页数:11 大小:103.09KB
下载 相关 举报
PV操作及进程同步的实现2哲学家就餐问题.docx_第1页
第1页 / 共11页
PV操作及进程同步的实现2哲学家就餐问题.docx_第2页
第2页 / 共11页
PV操作及进程同步的实现2哲学家就餐问题.docx_第3页
第3页 / 共11页
PV操作及进程同步的实现2哲学家就餐问题.docx_第4页
第4页 / 共11页
PV操作及进程同步的实现2哲学家就餐问题.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

PV操作及进程同步的实现2哲学家就餐问题.docx

《PV操作及进程同步的实现2哲学家就餐问题.docx》由会员分享,可在线阅读,更多相关《PV操作及进程同步的实现2哲学家就餐问题.docx(11页珍藏版)》请在冰豆网上搜索。

PV操作及进程同步的实现2哲学家就餐问题.docx

PV操作及进程同步的实现2哲学家就餐问题

课程设计

 

课程设计名称:

专业班级:

学生姓名:

学号:

指导教师:

课程设计时间:

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

答辩

准备充分,思路清晰、论点正确、对设计方案理解深入,问题回答有理有据,简明正确

总分

 

指导教师年月日

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

当前位置:首页 > 解决方案 > 其它

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

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