




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上专心-专注-专业目目录录精选优质文档-倾情为你奉上专心-专注-专业1 题目内容及要求题目内容及要求1.1 题目名称题目名称进程同步模拟设计:吃水果问题1.2 题目描述题目描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。1.3 解题思路解题思路将问题转换为信号量上的资源分配类型问题: 这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过编程实践时,实际是随机的调
2、用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。同步的模拟可以类似于函数调用时的前提关系即先决条件。这样进程同步模拟就完全可以通过函数的调用来实现。 具体的每一个操作的对应的函数的关系: 爸爸向盘子中放一个苹果:Father() 妈妈向盘子中放一个橘子:Mother() 儿子 1 从盘子取一个橘子:Son1() 儿子 2 从盘子取一个橘子:Son2()女儿 1 从盘子取一个苹果:Daugther1()儿子 1 从盘子取一个苹果:Daugther2()精选优质文档-倾情为你奉上专心-专注-专业具体实现方案: (1)用一个整型
3、变量 Plate_Size 表示盘子,初始值为 0,当放水果时Plate_Size 加 1,取水果时 Plate_Size 减 1。变量 Plate_Size 的最大值为2,当为 2 时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状态;为 0 时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状态。(2)整型变量 orange 和 apple 分别表示盘子中的橘子和苹果数目,初始都为 0,Plate_Size=apple+orange。(3)用 6 个 bool 型的变量 Father_lag,Mother_lag,Son1_lag,Son2_lag,Daughter1_la
4、g,Daughter2_lag 表示六个进程是否处于等待状态。处于等待时,变量值为 true。(4)两个放水果进程进程同时处于等待状态时,若有取水果的操作将自动执行等待的放水果进程,执行按等待的先后顺序;两个取苹果或橘子进程同时候处于等待状态,若有放苹果或橘子的操作将自动执行等待的取进程,进行按等待的先后顺序。(5)用一个随机的函数产生 05 的 6 个整数,分别对应六个进程的调用。精选优质文档-倾情为你奉上专心-专注-专业放水果操作流程图设计(以 Father 为例,Mother 类似):否Father 操作:Plate_Size=2否Daugther1 或 Daugher2 处于等待状态是
5、按等待先后顺序调用Daugther1 或 Daughter2 操作是Father 进程处于等待状态Father 进程调用:apple+1Plate_Size+1,Print()函数调用返回 图 1 Father 放水果操作流程图精选优质文档-倾情为你奉上专心-专注-专业取水果操作流程图设计(以 Son 为例,Daughter 类似):Son 操作:orange=0否否Father 或 Mother 处于等待状态是按等待先后顺序调用Father 或 Mother 操作是Son 进程处于等待状态Son 进程调用:orange-1Plate_Size-1,Print()函数调用返回 图 2 Son
6、取水果(橘子)操作流程图精选优质文档-倾情为你奉上专心-专注-专业1.4 程序清单程序清单#include #include #include #include int apple=0;int orange=0;bool Father_lag;bool Mother_lag;bool Son1_lag;bool Son2_lag;int son_a;int Daughter_b;bool Daughter1_lag;bool Daughter2_lag;void Print()cout 现在盘子里有apple个苹果,orange个橘子,共有apple+orange个水果.endl;if(Fat
7、her_lag=true)cout Father 进程处于等待状态,endl;if(Mother_lag=true)cout Mother 进程处于等待状态,endl;if(Son1_lag=true)cout Son1 进程处于等待状态,endl;if(Son2_lag=true) cout Son2 进程处于等待状态, endl;if(Daughter1_lag=true)cout Daughter1 进程处于等待状态,endl;if(Daughter2_lag=true)cout Daughter2 进程处于等待状态,endl;if(Father_lag=false)&(Moth
8、er_lag=false)&(Son1_lag=false)&(Son2_lag=false)&(Daughter1_lag=false)&(Daughter2_lag=false)!=true)coutendl;void Father() /Father 进程apple+;Print();void Mother() /Mother 进程orange+;精选优质文档-倾情为你奉上专心-专注-专业Print();void Son1() /Son1 进程orange-;Print();void Son2() /Son2 进程orange-;Print();void
9、Daughter1() /Daughter1 进程apple-;Print();void Daughter2() /Daughter2 进程apple-;Print();void main()int i;int Plate_Size;/水果数量int MonFa_c;/用于爸爸妈妈等待次序的区别int Son_a;/用于两个儿子等待次序的区别int daughter_b;/用于两个女儿等待次序的区别int k;/产生进程调用的数量srand(unsigned)time(NULL);/srand()函数产生一个以当前时间开始的随机种子 for(k=0;k10;k+) coutendl;cout*
10、第k+1次操作*endl;i=rand()%6; /随进生成 1-5.Plate_Size=apple+orange;switch(i)case 0:cout Father 调用.endl;精选优质文档-倾情为你奉上专心-专注-专业if(Plate_Size=2)Father_lag=true;/Father()等待Print();if(Mother_lag=false)MonFa_c=1;elseFather();if(Daughter1_lag=true)&(Daughter2_lag=true)if(Daughter_b=1)Daughter1_lag=false;/Daught
11、er1 等待取消cout 处于等待的 Daughter1 自动被调用endl;Daughter1(); /处于等待的 Daughter1 自动调用Daughter_b=2;else Daughter2_lag=false;/Daughter2 等待取消cout 处于等待的 Daughter2 自动被调用endl;Daughter2(); /处于等待的 Daughter2()自动调用Daughter_b=1;elseif(Daughter1_lag=true)Daughter1_lag=false;/Daughter1 等待取消cout 处于等待的 Daughter1 自动被调用endl;Dau
12、ghter1(); /处于等待的 Daughter1()自动调用Daughter_b=0;else if(Daughter2_lag=true)Daughter2_lag=false;/Daughter2 等待取消cout 处于等待的 Daughter1 自动被调用endl;精选优质文档-倾情为你奉上专心-专注-专业Daughter2(); /处于等待的 Daughter2()自动调用Daughter_b=0;break;case 1:cout Mother 调用.endl;if(Plate_Size=2)Mother_lag=true; /等待Print();if(Father_lag=fa
13、lse)MonFa_c=2;elseMother();if(Son1_lag=true)&(Son2_lag=true)if(Son_a=1)Son1_lag=false;/Son1 等待取消cout 处于等待的 Son1 自动被调用endl;Son1(); /处于等待的 Son1()自动调用Son_a=2;else Son2_lag=false;/Son2 等待取消cout 处于等待的 Son2 自动被调用endl;Son2(); /处于等待的 Son2()自动调用Son_a=1;else if(Son1_lag=true)Son1_lag=false; /Son1 等待取消cout
14、 处于等待的 Son1 自动被调用endl;精选优质文档-倾情为你奉上专心-专注-专业Son1(); /处于等待的 Son1()自动调用Son_a=0;else if(Son2_lag=true)Son2_lag=false; /Son2 等待取消cout 处于等待的 Son2 自动被调用endl;Son2(); /处于等待的 Son2()自动调用Son_a=0;break;case 2: cout Son1 调用.endl;if(orange=0)Son1_lag=true; /Son1 处于等待Print();if(Son2_lag=false)Son_a=1; /用于判断 Son1 和
15、Son2 等待的先后性elseSon1();if(Father_lag=true)&(Mother_lag=true)if(MonFa_c=1) /Father 和 Mother 同时处于等待,但 Father 先等待,因此先调用Father_lag=false;cout 处于等待的 Father 自动被调用endl;Father();MonFa_c=2;else /Father 和 Mother 同时处于等待,但 Mother 先等待,因此先调用Mother_lag=false;cout 处于等待的 Mother 自动被调用endl;Mother();精选优质文档-倾情为你奉上专心-
16、专注-专业MonFa_c=1;elseif(Father_lag=true) /只有 Father 处于等待,调用Father_lag=false;cout 处于等待的 Father 自动被调用endl;Father();MonFa_c=0;else if(Mother_lag=true)/只有 Mother 处于等待,调用Mother_lag=false;cout 处于等待的 Mother 自动被调用endl;Mother();MonFa_c=0;break;case 3:cout Son2 调用.endl;if(orange=0)Son2_lag=true; /Son2 处于等待Print
17、();if(Son1_lag=false)Son_a=2;elseSon2();if(Father_lag=true)&(Mother_lag=true)if(MonFa_c=1)/Father 和 Mother 同时处于等待,但 Father 先等待,因此先调用Father_lag=false;cout 处于等待的 Father 自动被调用endl;精选优质文档-倾情为你奉上专心-专注-专业Father();MonFa_c=2;else /Father 和 Mother 同时处于等待,但 Mother 先等待,因此先调用Mother_lag=false;cout 处于等待的 Moth
18、er 自动被调用endl;Mother();MonFa_c=1;elseif(Father_lag=true) /只有 Father 处于等待,调用Father_lag=false;cout 处于等待的 Father 自动被调用endl;Father();MonFa_c=0;else if(Mother_lag=true) /只有 Mother 处于等待,调用Mother_lag=false;cout 处于等待的 Mother 自动被调用endl;Mother();MonFa_c=0;break;case 4:cout Daughter1 调用.endl;if(apple=0)Daughter
19、1_lag=true; /Daughter1 等待Print();if(Daughter2_lag=false)Daughter_b=1;else精选优质文档-倾情为你奉上专心-专注-专业Daughter1(); if(Father_lag=true)&(Mother_lag=true)if(MonFa_c=1) /Father 和 Mother 同时处于等待,但 Father 先 /等待,因此先调用Father_lag=false;cout 处于等待的 Father 自动被调用endl;Father();MonFa_c=2;else /Father 和 Mother 同时处于等待,但
20、 Mother 先等待,因此先调用Mother_lag=false;cout 处于等待的 Mother 自动被调用endl;Mother();MonFa_c=1;elseif(Father_lag=true) /只有 Father 处于等待,调用Father_lag=false;cout 处于等待的 Father 自动被调用endl;Father();MonFa_c=0;else if(Mother_lag=true) /只有 Mother 处于等待,调用Mother_lag=false;cout 处于等待的 Mother 自动被调用endl;Mother();MonFa_c=0;break;
21、case 5:精选优质文档-倾情为你奉上专心-专注-专业cout Daughter2 调用.endl;if(apple=0)Daughter2_lag=true;/Daughter2 等待Print();if(Daughter1_lag=false)Daughter_b=2;elseDaughter2();if(Father_lag=true)&(Mother_lag=true)if(MonFa_c=1) /Father 和 Mother 同时处于等待,但 Father 先等待,因此先调用Father_lag=false;cout 处于等待的 Father 自动被调用endl;Fath
22、er();MonFa_c=2;else /Father 和 Mother 同时处于等待,但 Mother 先等待,因此先调用 Mother_lag=false;cout 处于等待的 Mother 自动被调用endl;Mother();MonFa_c=1;else if(Father_lag=true) /只有 Father 处于等待,调用 Father_lag=false;cout 处于等待的 Father 自动被调用endl;Father();MonFa_c=0;else if(Mother_lag=true) /只有 Mother 处于等待,调用 Mother_lag=false;cout 处于等待的 Mother 自动被调用endl;精选优质文档-倾情为你奉上专心-专注-专业Mother();MonFa_c=0;break;精选优质文档-倾情为你奉上专心-专注-专业1.5 提交结果框图提交结果框图由于程序是模拟产生 10 次随机的操作,执行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石家庄工商职业学院《生物化学Ⅰ实验》2023-2024学年第二学期期末试卷
- 石家庄人民医学高等专科学校《专业英语电气》2023-2024学年第二学期期末试卷
- 贵州工贸职业学院《建筑设计Ⅱ》2023-2024学年第二学期期末试卷
- 西南民族大学《光电子材料与器件双语》2023-2024学年第二学期期末试卷
- 上饶职业技术学院《高分子合成工艺及设备》2023-2024学年第二学期期末试卷
- 西南民族大学《连续铸钢》2023-2024学年第二学期期末试卷
- 伊犁职业技术学院《电视节目主持》2023-2024学年第二学期期末试卷
- 天津仁爱学院《Matlab编程与应用》2023-2024学年第二学期期末试卷
- 南京工业职业技术大学《工程制图与CAD设计》2023-2024学年第二学期期末试卷
- 云南交通职业技术学院《单片机原理及应用》2023-2024学年第二学期期末试卷
- 涂装工考试:中级涂装工考点(三)
- 医院重症监护室感染监控指南
- 2024年高中英语衡水体书法练字字帖
- 融资融券实务
- 人教版二年级下册口算题天天练1000道可打印带答案
- 2022北京东城六年级毕业考英语试题含答案
- 《药物分析与检验技术》课件-异烟肼中游离肼的检查方法
- 手术室的健康教育
- 海水的淡化技术及应用
- 食堂餐饮服务方案
- 中职学校设计说明
评论
0/150
提交评论