苹果-桔子问题的实现_第1页
苹果-桔子问题的实现_第2页
苹果-桔子问题的实现_第3页
苹果-桔子问题的实现_第4页
苹果-桔子问题的实现_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、*实践教学* 兰州理工大学计算机与通信学院2013年秋季学期操作系统原理课程设计 题 目:苹果-桔子问题的实现专业班级:计算机科学与技术 姓 名: 学 号: 指导教师:王旭阳 成 绩:_ 摘要 本设计实际上是生产者-消费者问题的一种变形。这里,生产者(父亲和母亲)放入缓冲区(盘子)的产品有两类(苹果和桔子),消费者(女儿和儿子)也有两类,每类消费者只消费其中固定的一类产品。生产者和消费者共享缓冲区,缓冲区中有空时,生产者可放入产品(不许放重),否则等待。缓冲区中有产品时,消费者可取出产品(不许取重),否则等待。关键词:进程同步;PV操作;互斥;信号量目录摘要I第一章 需求分析11.1吃水果问题

2、的描述11.2问题的转换1第二章 功能设计12.1 数据结构12.2模块说明22.2.1 主函数22.2.2 4个调度进程函数22.3 操作的流程图3231放水果操作3232取水果操作52.4P、V原语的描述5第3章 各模块的伪码算法73.1 算法设计73.1.1 父亲进程模块73.1.2 母亲进程模块73.1.3 儿子进程模块83.1.5 Print函数8第4章 开发平台及程序清单的主要部分94.1开发平台9第5章 运行结果与运行情况分析115.1运行结果11课程设计总结13参考文献14附录:部分源程序代码15第一章 需求分析1.1吃水果问题的描述桌上有一个空盘子,只允许放一个水果。爸爸专向

3、盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时,一次只能放一个水果。1.2问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。同步的模拟可以类似于函数调用时的前提关系即先决条件。这样进程同步模拟就完全可以通过函数的调用来实现。具体的每一个操作的对应的函数的关系:爸爸向盘子中放一个苹果:Father() 妈妈向盘子中放一个橘

4、子:Mother() 儿子从盘子取一个橘子:Son() 女儿从盘子取一个苹果:Daugther()第二章 功能设计2.1 数据结构(1)用一个整型变量Plate_Size表示盘子的水果量,初始值为0,当放水果时Plate_Size加1,取水果时Plate_Size减1。变量Plate_Size的最大值为1,当为1时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状态;为0时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状态。(2) 整型变量orange和apple分别表示盘子中的橘子和苹果数目,初始都为0,orange表示儿子的私有信号量,apple表示女儿的私有信号量,盘子中

5、水果总量为Plate_Size=apple+orange。(3)用4个bool型的变量 Father_lag,Mother_lag,Son_lag,Daughter_lag表示四个进程是否处于等待状态。处于等待时,变量值为true。(4)两个放水果进程进程同时处于等待状态时,若有取水果的操作将自动执行等待的放水果进程,执行按等待的先后顺序;取苹果或橘子进程同时候处于等待状态,若有放苹果或橘子的操作将自动执行等待的取进程,进行按等待的先后顺序。(5)用一个随机的函数产生03的4个整数,分别对应四个进程的调用。2.2模块说明2.2.1 主函数 用一个随机的函数产生03的4个整数,分别对应四个进程的

6、调用,调用的次数可以自己输入,本程序共产生了10次随机的调用进程。2.2.2 4个调度进程函数 爸爸向盘子中放一个苹果操作:Father() 妈妈向盘子中放一个橘子操作:Mother() 儿子从盘子取一个橘子操作:Son() 女儿从盘子取一个苹果操作:Daugther() 2.2.3 Print函数用于输出盘子中苹果和橘子的个数,水果总个数及有哪些进程处于等待状态。2.3 操作的流程图231放水果操作爸爸放苹果进程的操作流程图:Father操作:Plate_Size=1否否Daugther处于等待状态是调用Daugther操作是Father进程处于等待状态Father进程调用:orange+1

7、Plate_Size+1,Print()函数调用返回图2.1爸爸放苹果进程的操作流程图妈妈放桔子进程的操作流程图:Mother操作:Plate_Size=1否否Son处于等待状态是调用Son操作是Mother进程处于等待状态Mother进程调用:orange+1Plate_Size+1,Print()函数调用返回图2.2 妈妈放桔子进程的操作流程图232取水果操作 儿子取橘子的操作流程图:Son操作:Plate_Size=1否否Daugther处于等待状态是调用Daugther操作是Father进程处于等待状态Father进程调用:orange+1Plate_Size+1,Print()函数调

8、用返回图2.3 儿子取橘子的操作流程图2.4P、V原语的描述SemaphorePlate_SizSemaphoreappleSemaphoreorangeFather()While(ture)P(Plate_Siz)P(mutex)父亲向盘子中放进一个苹果 V(apple) V(mutex) Mother()While(ture)P(Plate_Siz) P(mutex)母亲向盘子中放进一个桔子 V(orange) V(mutex)Son(i)While(ture) P(Plate_Siz) P(mutex) P(apple)儿子从盘子中走一个桔子V(orange) V(mutex) Daug

9、ther()While(ture)P(Plate_Siz) P(mutex)女儿从盘子中走一个苹果 V(apple) V(mutex) 第3章 各模块的伪码算法3.1 算法设计 3.1.1 父亲进程模块void Father() /Father进程 apple+; Print(); 3.1.2 母亲进程模块void Mother() /Mother进程 orange+;Print(); 3.1.3 儿子进程模块void Son() /Son进程 orange-;Print(); 3.1.4 女儿进程模块 void Daughter() /Daughter进程 apple-; Print();

10、3.1.5 Print函数void Print() /Print函数(打印盘子剩余水果及各进程等待状态) cout现在盘子里有apple个苹果,orange个橘子,共有apple+orange个水果.endl; if(Father_lag=true) coutFather进程处于等待状态,; if(Mother_lag=true) coutMother进程处于等待状态,; if(Son_lag=true) coutSon进程处于等待状态,; if(Daughter_lag=true) coutDaughter进程处于等待状态,; if(Father_lag=false)&(Mother_lag

11、=false)&(Son_lag=false)&(Daughter_lag=false)!=true) coutendl; 第4章 开发平台及程序清单的主要部分4.1开发平台(1)使用系统:indowsXP(2)使用语言:C+(3)开发工具:VisualC+6.0第5章 运行结果与运行情况分析5.1运行结果第一次运行结果为:图5.1 第一次运行结果第二次运行结果:图5.2 第二次运行结果课程设计总结在本次设计中,首先分析问题并把问题转化为编程问题;其次用了随机函数来调用相应的进程函数,这对进程间的同步和等待状态有很好的说明;再次设了四个bool型的变量来表示各进程时候处于等待状态,还设置了相应

12、的整型变量来解决等待进程在适当的条件下自动调用的先后问题。在本次设计中,首先使我提高了分析问题,并根据需求转化成相应的程序结构的能力;其次也丰富了自己编写程序,调试程序的经验,这使得我编程时可能出现的错误的认识,并如何去避免产生了新的认识。在本次设计中除了可以用随机函数来产生随机数来调用相应的进程函数,也可以用人输入的方式来选择调用相应的进程函数,这样可以会麻烦些,不过对进程同步的模拟可能会更加透彻。总的来说这次设计比较成功,加深我对进程的理解,同时也提高了自己的编程的能力。编程是个长久的过程,平时要多去动手实践,去提高自己分析问题、发现问题、解决问题的能力参考文献1. 汤子瀛,哲凤屏.计算机

13、操作系统.西安电子科技大学学出版社.2. 王清,李光明.计算机操作系统.冶金工业出版社.3. 孙钟秀等. 操作系统教程. 高等教育出版社5. 张丽芬,刘利雄.操作系统实验教程. 清华大学出版社.6. 孟静,操作系统教程原理和实例分析. 高等教育出版社7. 周长林,计算机操作系统教程. 高等教育出版社8. 张尧学,计算机操作系统教程,清华大学出版社9. 任满杰,操作系统原理实用教程,电子工业出版社 附录:部分源程序代码#include /用到了time函数,所以要有这个头文件 #include /用到了srand函数,所以要有这个头文件 #include int Plate_Size=0; /表

14、示盘子中当前有几个水果 int orange=0,apple=0; /表示盘子中orange和apple的个数 bool Father_lag,Mother_lag,Son_lag,Daughter_lag; /四个进程处于等待时,变量值为true void main() /main()函数,实现其他功能函数的调用 void Print(); /函数声明 void Father(); void Mother(); void Son(); void Daughter(); int k; srand(unsigned)time(NULL);/srand()函数产生一个以当前时间开始的随机种子 fo

15、r(k=0;k10;k+) cout第k+1次操作:endl; /printf(第%d次操作:n,k+1); int i=rand()%4; /随进生成4以内的整数,即0-3的4个整数 Plate_Size=apple+orange; int MonFa_c,Daughter_b,Son_a; /for语句的局部变量,控制进程等待的优先次序,MonFa_c=2,Mather()执行,MonFa_c=1,Father()执行 switch(i) /0为Father()调用,1为Mother()调用,2为Son(),3为Daughter()调用 case 0: coutFather调用.endl;

16、 if(Plate_Size=1) Father_lag=true; /Father()等待 Print(); if(Mother_lag=false) MonFa_c=1; else Father(); if(Daughter_lag=true) if(Daughter_b=1) Daughter_lag=false;/Daughter等待取消 Daughter(); /处于等待的Daughter自动调用 else Daughter_b=0; else Daughter_b=0; /没有等待的Dauther进程 break; case 1: coutMother调用.endl; if(Pla

17、te_Size=1) Mother_lag=true; /Mother()等待Print(); if(Father_lag=false) MonFa_c=2; else Mother(); if(Son_lag=true) /Son等待 if(Son_a=1) /Son执行 Son_lag=false;/Son等待取消 Son(); /处于等待的Son()自动调用 else Son_a=0; else Son_a=0; break; case 2: coutSon调用.endl; if(orange=0) Son_lag=true; /Son处于等待Print(); else Son(); i

18、f(Father_lag=true)&(Mother_lag=true) if(MonFa_c=1) /Father和Mother同时处于等待,但Father先等待,因此先调用 Father_lag=false; Father(); MonFa_c=2; else /Father和Mother同时处于等待,但Mother先等待,因此先调用 Mother_lag=false; Mother(); MonFa_c=1; else if(Father_lag=true) /只有Father处于等待,调用 Father_lag=false; Father(); MonFa_c=0; else if(M

19、other_lag=true)/只有Mother处于等待,调用 Mother_lag=false; Mother(); MonFa_c=0; break; case 3: coutDaughter调用.endl; if(apple=0) Daughter_lag=true; /Daughter等待Print(); Daughter_b=1; else Daughter(); if(Father_lag=true)&(Mother_lag=true) if(MonFa_c=1) /Father和Mother同时处于等待,但Father先等待,因此先调用 Father_lag=false; Father(); MonFa_c=2; else /Father和Mother同时处于等待,但Mother先等待,因此先调用 Mother_lag=false; Mother(); MonFa_c=1; else if(Father_lag=true) /只有Father处于等待,调用 Father_lag=false;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论