当前位置:文档之家› 进程同步模拟吃水果,操作系统课程设计报告书

进程同步模拟吃水果,操作系统课程设计报告书

某某大学课程设计报告课程名称:操作系统课程设计设计题目:进程同步模拟吃水果问题系别:计算机系专业:计算机科学与技术组别:学生: 学号:起止日期:指导教师:目录第一章需求分析 (1)1.1问题概述 (1)1.2任务分析 (1)1.3设计思路 (1)1.4运行环境 (1)第二章概要设计 (2)2.1 数据结构 (2)2.2模块说明 (2)2.2.1主函数 (2)2.2.2 6个进程函数 (2)2.3 操作的流程图 (3)第三章详细设计 (4)3.1定义类 (4)3.2定义各个过程 (5)3.3定义Print()函数 (5)3.4主函数 (6)第四章调式和操作说明 (13)4.1测试用例 (13)4.2运行结果 (14)第五章总结和体会 (15)参考文献: (15)致谢: (15)第一章需求分析1.1问题概述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

1.2任务分析1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

2.设计报告容要求:模拟吃水果问题,实现进程的同步操作;给出实现方案(包括数据结构和模块说明等);画出程序的基本结构框图和流程图;分析说明每一部分程序的的设计思路;实现源代码;按期提交完整的程序代码和可执行程序;根据要求完成课程设计报告。

1.3设计思路这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。

通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。

而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。

同步的模拟可以类似于函数调用时的前提关系即先决条件。

这样进程同步模拟就完全可以通过函数的调用来实现。

具体的每一个操作的对应的函数的关系:爸爸向盘子中放一个苹果:Father()妈妈向盘子中放一个橘子:Mother()儿子1从盘子取一个橘子:Son1()儿子2从盘子取一个橘子:Son2()女儿1从盘子取一个橘子:Daugther1()儿子1从盘子取一个橘子:Daugther2()1.4运行环境(1):硬件配置个人计算机:PⅢ 500MHz以上/128M存/10G硬盘(2):软件配置操作系统:Windows XP开发软件:VisualC++6.0第二章概要设计2.1 数据结构(1)用一个整型变量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_lag,Daughter2_lag表示六个进程是否处于等待状态。

处于等待时,变量值为true。

(4)两个放水果进程进程同时处于等待状态时,若有取水果的操作将自动执行等待的放水果进程,执行按等待的先后顺序;两个取苹果或橘子进程同时候处于等待状态,若有放苹果或橘子的操作将自动执行等待的取进程,进行按等待的先后顺序。

(5)用一个随机的函数产生0—5的6个整数,分别对应六个进程的调用。

2.2模块说明2.2.1主函数用一个随机的函数产生0—5的6个整数,分别对应六个进程的调用,调用的次数可以自己输入,本程序共产生了10次随机的调用进程。

2.2.2 6个进程函数爸爸向盘子中放一个苹果操作:Father()妈妈向盘子中放一个橘子操作:Mother()儿子1从盘子取一个橘子操作:Son1()儿子2从盘子取一个橘子操作:Son2()女儿1从盘子取一个橘子操作:Daugther1()女儿2从盘子取一个橘子操作:Daugther2()2.2.3 Print函数用于输出盘子中苹果和橘子的个数,水果总个数及有哪些进程处于等待状态。

2.3 操作的流程图图一放水果操作(放水果时父亲和母亲是随即进行)图二吃水果的流程图(假如儿子1先)第三章详细设计3.1定义类*//*class A{private:int apple=0;int orange=0;public:void Father();void Mother();void Son1();void Son2();void Daughter1();void Daughter2();void print();}3.2定义各个过程void Father() //Father进程{apple++;Print();}void Mother() //Mother进程{orange++;// Print();}void Son1() //Son1进程{orange--;// Print();}void Son2() //Son2进程{orange--;// Print();}void Daughter1() //Daughter1进程{apple--;// Print();}void Daughter2() //D aughter2进程{apple--;//Print();}3.3定义Print()函数void Print(){cout<<"现在盘子里有"<<apple<<"个苹果,"<<orange<<"个橘子,"<<"共有"<<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进程处于等待状态, ";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))!=true)cout<<endl;}3.4主函数int main(){int k;srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子for(k=0;k<10;k++){ int i;cout<<"第"<<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;}else{Father();Print();if((Daughter1_lag==true)&&(Daughter2_lag==true)){if(Daughter_b==1){Daughter1_lag=false;//Daughter1等待取消cout<<"处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1自动调用Print();Daughter_b=2;}else{Daughter2_lag=false;//Daughter2等待取消cout<<"处于等待的Daughter2自动被调用"<<endl;Daughter2(); //处于等待的Daughter2()自动调用Print();Daughter_b=1;}}else{if(Daughter1_lag==true){Daughter1_lag=false;//Daughter1等待取消cout<<"处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1()自动调用Print();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==false)MonFa_c=2;}else{Mother();Print();if((Son1_lag==true)&&(Son2_lag==true)){if(Son_a==1){Son1_lag=false;//Son1等待取消cout<<"处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Print();Son_a=2;}else{Son2_lag=false;//Son2等待取消cout<<"处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Print();Son_a=1;}}else{if(Son1_lag==true){Son1_lag=false; //Son1等待取消cout<<"处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Print();Son_a=0;}else if(Son2_lag==true){Son2_lag=false; //Son2等待取消cout<<"处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Print();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和Son2等待的先后性}else{Son1();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1)//Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=0;}else if(Mother_lag==true)//只有Mothe处于等待,调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}}break;case 3:cout<<"Son2调用."<<endl;if(orange==0){Son2_lag=true; //Son2处于等待Print();if(Son1_lag==false)Son_a=2;}else{Son2();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1)//Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true)//只有Father处于等待,调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endFather();Print();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}}break;case 4:cout<<"Daughter1调用."<<endl;if(apple==0){Daughter1_lag=true; //Daughter1Print();if(Daughter2_lag==false)Daughter_b=1;}{Daughter1();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先{ //等待,因此先调用Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用 {Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}break; case 5:cout<<"Daughter2调用."<<endl;if(apple==0){Daughter2_lag=true; //Daughter2等待Print();if(Daughter1_lag==false)Daughter_b=2;}else{Daughter2();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{ Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true)//只有Father处于等待,调用{ Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{ Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}}break;}}return 0;}第四章调式和操作说明4.1测试用例由于程序是模拟产生10次随机的操作,执行相应的函数来模拟进程同步。

相关主题