操作系统课程设计_进程同步模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计题目:进程同步模拟—吃水果问题
目录
1需求分析 (2)
1.1吃水果问题的描述 (2)
1.2问题的转换 (2)
2功能设计 (3)
2.1 数据结构 (3)
2.2模块说明 (3)
2.3 操作的流程图 (4)
3开发平台及源程序的主要部分 (6)
3.1开发平台 (6)
3.2源程序 (7)
4测试用例,运行结果与运行情况分析 (16)
4.1测试用例 (16)
4.2运行结果 (16)
5自我评价与总结 (17)
进程同步模拟设计
——吃水果问题
1需求分析
1.1吃水果问题的描述
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.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时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状态;为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 操作的流程图
2.3.1放水果操作
爸爸放苹果进程的操作流程图:
2.3.2取水果操作
儿子1取橘子的操作流程图:
3开发平台及源程序的主要部分3.1开发平台
(1)使用系统:Windows XP
(2)使用语言:C++
(3)开发工具:Visual C++ 6.0
3.2源程序
3.2.1各进程调用的函数
void Father() //Father进程
{
apple++;
}
void Mother() //Mother进程
{
orange++;
}
void Son1() //Son1进程
{
orange--;
}
void Son2() //Son2进程
{
orange--;
}
void Daughter1() //Daughter1进程
{
apple--;
}
void Daughter2() //Daughter2进程
{
apple--;
}
3.2.2 Print函数(打印盘子剩余水果及各进程等待状态)
void Print() //打印盘子剩余水果及各进程的等待状态的进程
{
cout<<"现在盘子里有"< if(Father_lag==true) cout<<"Father进程处于等待状态,"; if(Mother_lag==true) cout<<"Mother进程处于等待状态,"; if(Son1_lag==true) cout<<"Son1进程处于等待状态,"; if(Son2_lag==true)