![武汉理工大学--进程同步模拟设计-——吃水果问题_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-4/27/d4b141b4-bdc3-494c-bd3c-38cc746d6be9/d4b141b4-bdc3-494c-bd3c-38cc746d6be91.gif)
![武汉理工大学--进程同步模拟设计-——吃水果问题_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-4/27/d4b141b4-bdc3-494c-bd3c-38cc746d6be9/d4b141b4-bdc3-494c-bd3c-38cc746d6be92.gif)
![武汉理工大学--进程同步模拟设计-——吃水果问题_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-4/27/d4b141b4-bdc3-494c-bd3c-38cc746d6be9/d4b141b4-bdc3-494c-bd3c-38cc746d6be93.gif)
![武汉理工大学--进程同步模拟设计-——吃水果问题_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-4/27/d4b141b4-bdc3-494c-bd3c-38cc746d6be9/d4b141b4-bdc3-494c-bd3c-38cc746d6be94.gif)
![武汉理工大学--进程同步模拟设计-——吃水果问题_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-4/27/d4b141b4-bdc3-494c-bd3c-38cc746d6be9/d4b141b4-bdc3-494c-bd3c-38cc746d6be95.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文学:话剧影视文学测试题(题库版)
- 2024版别墅装修的设计合同
- 2024临时工承包合同
- 用友离散行业细分领域铸造行业解决方案
- 大学生创新创业训练计划
- 女装合同延期申请书
- 拆装维修塔吊合同范本
- 商业房产收购合同范本
- 房屋租赁合同范本模板
- 危废收购合同范本
- D -Z-T 0453.2-2023 铌钽矿石化学分析方法 第2部分:锂、铷、铍、镍、铜、锌、铌、钽、钨和钇元素含量的测定 封闭酸溶-电感耦合等离子体质谱法(正式版)
- 安徽省合肥市2022-2023学年五年级下学期语文期末试卷(含答案)
- ktv经营管理合同协议书范本
- 2022-2023学年北京市朝阳区高一下学期期末考试历史试题(解析版)
- 人教版小学四年级下册数学期末测试卷含完整答案【有一套】
- 口腔科门诊护士培训计划方案
- 2024年湖南益阳市大通湖区招聘事业单位人员34人历年公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版
- 华为运营管理中的知识转移与共享
- 形式逻辑新解智慧树知到期末考试答案章节答案2024年上海财经大学
- MOOC 中医藏象理论与临床-西南医科大学 中国大学慕课答案
- JT-T-321-1997灯塔主体及附属设施设置要求-PDF解密
评论
0/150
提交评论