操作系统课程设计吃水果问题完整版资料

上传人:w****i 文档编号:98903649 上传时间:2019-09-15 格式:DOC 页数:20 大小:384KB
返回 下载 相关 举报
操作系统课程设计吃水果问题完整版资料_第1页
第1页 / 共20页
操作系统课程设计吃水果问题完整版资料_第2页
第2页 / 共20页
操作系统课程设计吃水果问题完整版资料_第3页
第3页 / 共20页
操作系统课程设计吃水果问题完整版资料_第4页
第4页 / 共20页
操作系统课程设计吃水果问题完整版资料_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《操作系统课程设计吃水果问题完整版资料》由会员分享,可在线阅读,更多相关《操作系统课程设计吃水果问题完整版资料(20页珍藏版)》请在金锄头文库上搜索。

1、沈阳理工大学课程设计专用纸 1 目目 录录 1 题目内容及要求题目内容及要求2 1.1题目名称.2 1.2题目描述.2 1.3解题思路.2 1.4程序清单.6 1.5提交结果框图.16 2 总结总结20 3 参考文献参考文献20 沈阳理工大学课程设计专用纸 2 1 题目内容及要求题目内容及要求 1.1 题目名称题目名称 进程同步模拟设计:吃水果问题 1.2 题目描述题目描述 桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个 水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门 等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。 1.3 解题思路解题思路 将问题转换为

2、信号量上的资源分配类型问题: 这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以 转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通 过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相 当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作, 这就默认了互斥。同步的模拟可以类似于函数调用时的前提关系即先决条件。 这样进程同步模拟就完全可以通过函数的调用来实现。 具体的每一个操作的对应的函数的关系: 爸爸向盘子中放一个苹果:Father() 妈妈向盘子中放一个橘子:Mother() 儿子 1 从盘子取一个橘子:Son1() 儿子 2 从盘子取

3、一个橘子:Son2() 女儿 1 从盘子取一个苹果:Daugther1() 儿子 1 从盘子取一个苹果:Daugther2() 沈阳理工大学课程设计专用纸 3 具体实现方案: (1)用一个整型变量 Plate_Size 表示盘子,初始值为 0,当放水果时 Plate_Size 加 1,取水果时 Plate_Size 减 1。变量 Plate_Size 的最大值为 2,当为 2 时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状 态;为 0 时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状 态。 (2)整型变量 orange 和 apple 分别表示盘子中的橘子和苹果数目,初

4、始都 为 0,Plate_Size=apple+orange。 (3)用 6 个 bool 型的变量 Father_lag,Mother_lag,Son1_lag,Son2_lag,Daughter1_lag,Daughter2 _lag 表示六个进程是否处于等待状态。处于等待时,变量值为 true。 (4)两个放水果进程进程同时处于等待状态时,若有取水果的操作将自动执 行等待的放水果进程,执行按等待的先后顺序;两个取苹果或橘子进程同时候 处于等待状态,若有放苹果或橘子的操作将自动执行等待的取进程,进行按等 待的先后顺序。 (5)用一个随机的函数产生 05 的 6 个整数,分别对应六个进程的调

5、用。 沈阳理工大学课程设计专用纸 4 放水果操作流程图设计(以 Father 为例,Mother 类似): 否 Father 操作: Plate_Size=2 否 Daugther1 或 Daugher2 处 于等待状态 是 按等待先后顺序调用 Daugther1 或 Daughter2 操作 是 Father 进程处于等待状 态 Father 进程调用:apple+1 Plate_Size+1,Print()函数调用 返回 图 1 Father 放水果操作流程图 沈阳理工大学课程设计专用纸 5 取水果操作流程图设计(以 Son 为例,Daughter 类似): Son 操作: orange=

6、0 否 否 Father 或 Mother 处于等待 状态 是 按等待先后顺序调用 Father 或 Mother 操作 是 Son 进程处于等待状态 Son 进程调用:orange-1 Plate_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; i

7、nt son_a; int Daughter_b; bool Daughter1_lag; bool Daughter2_lag; void Print() cout“ 现在盘子里有“apple“个苹果,“orange“个橘子, “共有“apple+orange“个水果.“endl; if(Father_lag=true) cout“ Father 进程处于等待状态,“endl; if(Mother_lag=true) cout“ Mother 进程处于等待状态,“endl; if(Son1_lag=true) cout“ Son1 进程处于等待状态,“endl; if(Son2_lag=tr

8、ue) cout“ Son2 进程处于等待状态, “endl; if(Daughter1_lag=true) cout“ Daughter1 进程处于等待状态,“endl; if(Daughter2_lag=true) cout“ Daughter2 进程处于等待状态,“endl; if(Father_lag=false) void Father() /Father 进程 apple+; Print(); void Mother() /Mother 进程 orange+; 沈阳理工大学课程设计专用纸 7 Print(); void Son1() /Son1 进程 orange-; Print(

9、); void Son2() /Son2 进程 orange-; Print(); void 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(NUL

10、L);/srand()函数产生一个以当前时间开始的随机种子 for(k=0;k10;k+) coutendl; cout“*“第“k+1“次操作 “*“endl; i=rand()%6; /随进生成 1-5. Plate_Size=apple+orange; switch(i) case 0: cout“ Father 调用.“endl; 沈阳理工大学课程设计专用纸 8 if(Plate_Size=2) Father_lag=true;/Father()等待 Print(); if(Mother_lag=false) MonFa_c=1; else Father(); if(Daughter1

11、_lag=true)/Daughter1 等待取消 cout“ 处于等待的 Daughter1 自动被调 用“endl; Daughter1(); /处于等待的 Daughter1 自动调用 Daughter_b=2; else Daughter2_lag=false;/Daughter2 等待取消 cout“ 处于等待的 Daughter2 自动被调 用“endl; Daughter2(); /处于等待的 Daughter2()自动调用 Daughter_b=1; else if(Daughter1_lag=true) Daughter1_lag=false;/Daughter1 等待取消

12、cout“ 处于等待的 Daughter1 自动被调 用“endl; Daughter1(); /处于等待的 Daughter1()自动调用 Daughter_b=0; else if(Daughter2_lag=true) Daughter2_lag=false;/Daughter2 等待取消 cout“ 处于等待的 Daughter1 自动被调 用“endl; 沈阳理工大学课程设计专用纸 9 Daughter2(); /处于等待的 Daughter2()自动调用 Daughter_b=0; break; case 1: cout“ Mother 调用.“endl; if(Plate_Siz

13、e=2) Mother_lag=true; /等待 Print(); if(Father_lag=false) MonFa_c=2; else Mother(); if(Son1_lag=true)/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_l

14、ag=false; /Son1 等待取消 cout“ 处于等待的 Son1 自动被调用 “endl; 沈阳理工大学课程设计专用纸 10 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()

15、; if(Son2_lag=false) Son_a=1; /用于判断 Son1 和 Son2 等待的先后性 else Son1(); if(Father_lag=true) cout“ 处于等待的 Father 自动被调用 “endl; Father(); MonFa_c=2; else /Father 和 Mother 同时处于等待,但 Mother 先等待,因此先调 用 Mother_lag=false; cout“ 处于等待的 Mother 自动被调用 “endl; Mother(); 沈阳理工大学课程设计专用纸 11 MonFa_c=1; else if(Father_lag=true) /只有 Father 处于等待,调用 Father_lag=false; cout“

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号