武汉理工大学--进程同步模拟设计-——吃水果问题_第1页
武汉理工大学--进程同步模拟设计-——吃水果问题_第2页
武汉理工大学--进程同步模拟设计-——吃水果问题_第3页
武汉理工大学--进程同步模拟设计-——吃水果问题_第4页
武汉理工大学--进程同步模拟设计-——吃水果问题_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上进程同步模拟设计 吃水果问题1需求分析1.1吃水果问题的描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。1.2问题的转换 这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。同步的模拟可以类似于函数调用时的前提关系即

2、先决条件。这样进程同步模拟就完全可以通过函数的调用来实现。 具体的每一个操作的对应的函数的关系: 爸爸向盘子中放一个苹果:Father() 妈妈向盘子中放一个橘子:Mother() 儿子1从盘子取一个橘子:Son1() 儿子2从盘子取一个橘子:Son2()女儿1从盘子取一个苹果:Daugther1()儿子1从盘子取一个苹果:Daugther2()2功能设计2.1 数据结构(1)用一个整型变量Plate_Size表示盘子,初始值为0,当放水果时Plate_Size加1,取水果时Plate_Size减1。变量Plate_Size的最大值为2,当为2时表示盘子已经满,此时若进行放水果操作,放水果将处

3、于等待状态;为0时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状态。(2)整型变量orange和apple分别表示盘子中的橘子和苹果数目,初始都为0,Plate_Size=apple+orange。(3)用6个bool型的变量 Father_lag,Mother_lag,Son1_lag,Son2_lag,Daughter1_lag,Daughter2_lag表示六个进程是否处于等待状态。处于等待时,变量值为true。(4)两个放水果进程进程同时处于等待状态时,若有取水果的操作将自动执行等待的放水果进程,执行按等待的先后顺序;两个取苹果或橘子进程同时候处于等待状态,若有放苹果或橘子

4、的操作将自动执行等待的取进程,进行按等待的先后顺序。(5)用一个随机的函数产生05的6个整数,分别对应六个进程的调用。2.2模块说明(1)main函数:用一个随机的函数产生05的6个整数,分别对应六个进程的调用,调用的次数可以自己输入,本程序共产生了10次随机的调用进程。(2)6个进程函数:爸爸向盘子中放一个苹果操作:Father();妈妈向盘子中放一个橘子操作:Mother();儿子1从盘子取一个橘子操作:Son1();儿子2从盘子取一个橘子操作:Son2();女儿1从盘子取一个橘子操作:Daugther1();女儿2从盘子取一个橘子操作:Daugther2()。(3)Print函数:用于输

5、出盘子中苹果和橘子的个数,水果总个数及有哪些进程处于等待状态。2.3 操作的流程图(1)放水果操作 爸爸放苹果进程的操作流程图: Father操作:Plate_Size=2否否Daugther1或Daugher2处于等待状态是按等待先后顺序调用Daugther1或Daughter2操作是Father进程处于等待状态Father进程调用:orange+1Plate_Size+1,Print()函数调用返回(2)取水果操作 儿子1取橘子的操作流程图 Son1操作:Plate_Size=2否否Daugther1或Daugher2处于等待状态是按等待先后顺序调用Daugther1或Daughter2操

6、作是Father进程处于等待状态Father进程调用:orange+1Plate_Size+1,Print()函数调用返回3开发平台及源程序的主要部分3.1开发平台 (1)使用系统:windows7(2)使用语言:C+(3)开发工具:Microsoft Visual C+ 2012 Express3.2源程序主要部分 (1)Print函数(打印盘子剩余水果及各进程等待状态)void Print()cout<<"现在盘子里有"<<apple<<"个苹果,"<<orange<<"个橘子,&

7、quot;<<"共有"<<apple+orange<<"个水果."<<endl;if(Father_lag=true)cout<<"Father进程处于等待状态,"if(Mother_lag=true)cout<<"Mother进程处于等待状态,"if(Son1_lag=true)cout<<"Son1进程处于等待状态,"if(Son2_lag=true) cout<<"Son2进程处于等待

8、状态, "if(Daughter1_lag=true)cout<<"Daughter1进程处于等待状态,"if(Daughter2_lag=true)cout<<"Daughter2进程处于等待状态,"if(Father_lag=false)&&(Mother_lag=false)&&(Son1_lag=false)&&(Son2_lag=false)&&(Daughter1_lag=false)&&(Daughter2_lag=false)

9、!=true) cout<<endl;(2)各进程调用的函数void Father() apple+;Print();void Mother()orange+;Print();void Son1() orange-;Print();void Son2() orange-;Print();void Daughter1() apple-;Print();void Daughter2()apple-;Print();(3)主函数void main() int k; int i; int Plate_Size; int MonFa_c; int Son_a; srand(unsigned)

10、time(NULL); for(k=0;k<10;k+) cout<<"*"<<"第"<<k+1<<"次操 作"<<"*"<<endl; i=rand()%6; Plate_Size=apple+orange; switch(i) case 0: cout<<"Father调用."<<endl; if(Plate_Size=2) Father_lag=true; Print(); if(Moth

11、er_lag=false) MonFa_c=1; else Father(); if(Daughter1_lag=true)&&(Daughter2_lag=true) if(Daughter_b=1) Daughter1_lag=false; cout<<"处于等待的Daughter1自动被调用"<<endl; Daughter1(); Daughter_b=2; else Daughter2_lag=false; cout<<"处于等待的Daughter2自动被调用"<<endl; Da

12、ughter2(); Daughter_b=1; else if(Daughter1_lag=true) Daughter1_lag=false; cout<<"处于等待的Daughter1自动被调用"<<endl; Daughter1(); Daughter_b=0; else if(Daughter2_lag=true) Daughter2_lag=false; cout<<"处于等待的Daughter1自动被调用"<<endl; Daughter2(); Daughter_b=0; break; ca

13、se 1: cout<<"Mother调用."<<endl; if(Plate_Size=2) Mother_lag=true; Print(); if(Father_lag=false) MonFa_c=2; else Mother(); if(Son1_lag=true)&&(Son2_lag=true) if(Son_a=1) Son1_lag=false; cout<<"处于等待的Son1自动被调用"<<endl; Son1(); Son_a=2; else Son2_lag=fal

14、se; cout<<"处于等待的Son2自动被调用"<<endl; Son2(); Son_a=1; else if(Son1_lag=true) Son1_lag=false; cout<<"处于等待的Son1自动被调用"<<endl; Son1(); Son_a=0; else if(Son2_lag=true) Son2_lag=false; cout<<"处于等待的Son2自动被调用"<<endl; Son2(); Son_a=0; break; case

15、 2: cout<<"Son1调用."<<endl; if(orange=0) Son1_lag=true; Print(); if(Son2_lag=false) Son_a=1; else Son1(); if(Father_lag=true)&&(Mother_lag=true) if(MonFa_c=1) Father_lag=false; cout<<"处于等待的Father自动被调用"<<endl; Father(); MonFa_c=2; else Mother_lag=fal

16、se; cout<<"处于等待的Mother自动被调用"<<endl; Mother(); MonFa_c=1; else if(Father_lag=true) Father_lag=false; cout<<"处于等待的Father自动被调用"<<endl; Father(); MonFa_c=0; else if(Mother_lag=true) Mother_lag=false; cout<<"处于等待的Mother自动被调用"<<endl; Mother

17、(); MonFa_c=0; break; case 3: cout<<"Son2调用."<<endl; if(orange=0) Son2_lag=true;Print();if(Son1_lag=false)Son_a=2; else Son2();if(Father_lag=true)&&(Mother_lag=true) if(MonFa_c=1) Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();MonFa_c=2;

18、else Mother_lag=false; cout<<"处于等待的Mother自动被调用"<<endl; Mother(); MonFa_c=1; elseif(Father_lag=true) Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;else if(Mother_lag=true) Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<

19、;endl;Mother();MonFa_c=0;break;case 4: cout<<"Daughter1调用."<<endl; if(apple=0) Daughter1_lag=true; Print(); if(Daughter2_lag=false) Daughter_b=1; elseDaughter1(); if(Father_lag=true)&&(Mother_lag=true) if(MonFa_c=1) Father_lag=false; cout<<"处于等待的Father自动被调用&q

20、uot;<<endl; Father(); MonFa_c=2; else Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1;elseif(Father_lag=true) Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();MonFa_c=0;else if(Mother_lag=true) Mother_lag=false;cout<<

21、"处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=0;break; case 5:cout<<"Daughter2调用."<<endl;if(apple=0) Daughter2_lag=true; Print(); if(Daughter1_lag=false) Daughter_b=2;else Daughter2(); if(Father_lag=true)&&(Mother_lag=true) if(MonFa_c=1) Father_lag=false;cou

22、t<<"处于等待的Father自动被调用"<<endl;Father();MonFa_c=2; else Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();MonFa_c=1; else if(Father_lag=true) Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();MonFa_c=0; else if(Mother_lag=true) Mot

温馨提示

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

评论

0/150

提交评论