武汉理工大学 进程同步模拟设计-——吃水果问题
放水果
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘子放苹果(apple),妈妈专向盘子放桔子(orange)。两个儿子专等吃盘子中的桔子,两个女儿专等吃盘子中的苹果。请用信号量来实现爸爸、妈妈、儿子、女儿之间的同步与互斥关系。
解:本题原型为生产者-消费者问题,只是由一种产品改为两种水果,所以将表示满缓冲区单元个数的一个信号量改为表示盘中苹果的个数和桔子个数的两个信号量,设置如下信号量:
empty:记录允许向盘子中放入水果的个数,初值为2。apple:盘子中已放入的苹果的个数,初值为0。orange:盘子中已放入的桔子的个数,初值为0。mutex:向盘子中取、放操作是一个互斥操作,也就是说盘子对于取、放水果而言是一个临界资源,为此设置一个信号量,其初值为1。
本题4个进程的同步与互斥活动的描述如下:
Var mutex, empty, apple, orange:=1,2,0,0
Begin
Father:begin
Repeat
wait(empty); //盘中可放入的水果数
wait(mutex); //申请向盘中取、放水果
向盘中放苹果;
signal(mutex); //允许向盘中取、放水果signal(apple); //递增盘中的苹果数
end
Mother:begin
Repeat
wait (empty); //减少盘中可放入的水果数wait (mutex); //申请向盘中取、放水果向盘中放桔子;
signal (mutex); //允许向盘中取、放水果signal (orange); //递增盘中的桔子数
操作系统课程设计吃水果问题完整
Father();
MonFa_c=2;
}
else //Father和Mother同时处于等待,但Mother先等待,因此先调用
{
Mother_lag=false;
cout<<"处于等待的Mother自动被调用"<<endl;
Mother();
if(Son1_lag==false)
Son_a=2;
}
else
{
Son2();
if((Father_lag==true)&&(Mother_lag==true))
{
if(MonFa_c==1)//Father和Mother同时处于等待,但Father先等待,因此先调用
{
Father_lag=false;
{
orange--;
Print();
}
void Daughter1() //Daughter1进程
{
apple--;
Print();
}
void Daughter2() //Daughter2进程
{
apple--;
Print();
}
void main()
{
武汉理工大学C语言 第2章 算法2015
P1 成立 循环体
不成立
基本结构小结
三种基本结构的共同特点 (1)有一个入口 (2)有一个出口。
口混淆。)
成立 A
P
不成 立 B
选择结构示意图
(请注意:一个菱形判断框有两个出口, 而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出
(3)结构中每一部分都应当有被执行到的机会。 (4)没有死循环。
A×B
B+1 否 B﹥5?
A
B 是
输出A
算法结束
计算5!的算法示意图 100 k 思考1: 计算 sum 思考2: 计算N!
k 1
开始 例3:计算N!(N为任意正整数)。 s1:输入N s2:使A = 1 s3:使B = 2 s4:A×BA s5:B+1B s6:如果B≤N,返回重 新执行s4、s5、s6;否 则, A值为N!,输出A值, 算法结束。
输入N
1 A 2 B A×B A B+1 B
否
B>N? 是 输出 A
结束
一个流程图主要包括: ⑴表示相应操作的图框;⑵带箭头的流程线; ⑶图框内外相应的文字说明。 传统流程图的优缺点 优点:直观形象、图框间的逻辑关系清楚。 缺点:对流程线的使用没有限制。因此,使 用者可以不受限制地使流程任意地转来转去, 使流程图变得毫无规律,使人难以理解算法的 逻辑。 结构化流程图
进程同步模拟设计--吃水果问题
附件1:
学号:012
课程设计
题目进程同步模拟设计--吃水果问题
学院计算机科学与技术学院
专业计算机科学与技术专业
班级计算机
姓名
指导教师
2011 年01 月19 日
课程设计任务书
学生:专业班级:
指导教师:作单位:计算机科学与技术学院
题目: 进程同步模拟设计——吃水果问题
初始条件:
1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等
具体要求)
1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
2.设计报告容应说明:
⑴需求分析;
⑵功能设计(数据结构及模块说明);
⑶开发平台及源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
i)你认为你完成的设计哪些地方做得比较好或比较出色;
ii)什么地方做得不太好,以后如何改正;
iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
iv)完成本题是否有其他方法(如果有,简要说明该方法);
v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按0分记)
指导教师签名:年月日
进程同步模拟设计——哲学家就餐问题
课程设计
题目进程同步模拟设计—哲学家就餐
学院计算机科学与技术
专业计算机科学与技术
班级计算机
姓名
指导教师
20011 年 1 月19 日
需求分析
1.1问题描述
有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子,即共5只筷子。
每个哲学家的行为是思考和进餐。为了进餐,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子。思考时则同时将两支筷子放回原处
(此图中以叉子代表筷子)
规则:
只有拿到两只筷子时,哲学家才能吃饭;
如果筷子已经在他人手上,则该哲学家必须等到他人吃完之后才能
拿到筷子;
任何一个哲学家在自己没有拿到两只筷子吃饭之前,决不放下自己手中的筷子。
由此出现的问题:
可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐
1.2问题分析
该问题可用记录型信号量或者是AND型信号量解决。
记录型信号量解决:
经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量组成信号量数组。当哲学家饥饿时总是先拿其左边的筷子,成功后,再去拿右边的筷子,又成功后方可就餐。进餐完,又先放下他左边的筷子,再放下右边筷子。这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。
AND型信号量解决:
在哲学家就餐过程中,要求每个哲学家先获得两个临界资源后方能就餐,这在本质上就是AND同步问题,故用AND信号量机制可获得最简洁的解法。
1.3解决方法
操作系统课程设计可选题目
6.请求分页存储管理方式中页面置换算法的模拟与 实现(包括以下算法) 实现(包括以下算法) 最佳置换算法(OPT) 1、最佳置换算法(OPT) 2、先进先出(FIFO)置换算法 先进先出(FIFO) 最近最久未使用(LRU) 3、最近最久未使用(LRU)置换算法 Clock和改进型Clock算法 根据能力选择) 和改进型Clock算法( 4、Clock和改进型Clock算法(根据能力选择)
进程同步的模拟与实现(以下模型任选其一) 进程同步的模拟与实现(以下模型任选其一) 吸烟者问题: 吸烟者问题:考虑有三个吸烟者进程和一个经销 商进程的系统。 商进程的系统。每个吸烟者连续不断地做烟卷并 抽他做好的烟卷。做一支烟卷需要烟草、 抽他做好的烟卷。做一支烟卷需要烟草、纸和火 柴三种原料。这三个吸烟者分别掌握有烟草、 柴三种原料。这三个吸烟者分别掌握有烟草、纸 和火柴。经销商源源不断地提供上述三种原料, 和火柴。经销商源源不断地提供上述三种原料, 但他只将其中的两种原料放在桌上, 但他只将其中的两种原料放在桌上,具有另一种 原料的吸烟者就可做烟卷并抽烟, 原料的吸烟者就可做烟卷并抽烟,且在做完后给 经销商发信号, 经销商发信号,然后经销商再拿出两种原料放在 桌上,如此反复。 桌上,如此反复。试设计同步算法来描述他们的 活动。 活动。
进程同步的模拟与实现(以下模型任选其一) 进程同步的模拟与实现(以下模型任选其一) 吃水果问题:桌上有一个空盘, 吃水果问题:桌上有一个空盘,允许存放一只水 爸爸可向盘内放苹果,妈妈可向盘内放桔子, 果,爸爸可向盘内放苹果,妈妈可向盘内放桔子, 儿子专等吃盘内的桔子,女儿专等吃盘中的苹果。 儿子专等吃盘内的桔子,女儿专等吃盘中的苹果。 请用wait signal操作实现爸爸 妈妈、儿子、 wait、 操作实现爸爸、 请用wait、signal操作实现爸爸、妈妈、儿子、女 儿四个并发进程的同步与互斥。 儿四个并发进程的同步与互斥。
武汉理工大学c语言 课后程序代码
max=max; if(min<a) min=min; else; min=a; sum=sum+a; i=i+1; } c=(float)(sum-max-min); d=c/5.0; printf("最后得分为%f",d); getch(); }
算法2 (1)令i=1. (2)判断i<=10?是继续(3);否继续(5). (3)A=I,b=i*I,i=i+1. (4)输出第i个数a及其平方b,继续(2). (5)结束
程序3
b=p*a; printf("第%d年的总钱数 为%f\n",n,b); n=n+1; } getch(); }
程序4
j+=e; o=o+1; } #include<stdio.h> while(p<=5){ #include<conio.h> switch(p){ main(){ case 1:k=(double)f*2.46;break; double q,k,l,m,n,r; case 2:l=(double)g*4.95;break; int a,b,c,d,e,f,g,h,i,j,o,p; case 3:m=(double)h*9.12;break; f=g=i=j=h=0; case 4:n=(double)i*4.35;break; p=1; case 5:r=(double)j*6.66;break; o=1; } while(o<=7){ p=p+1; printf("请按顺序输入第%d天五种产 } 品的销量,每完成一个数,按一次空 q=k+l+m+n+r; 格键",o); printf("输出一个星期的总销售额 scanf("%d %d %d %d %f",q); %d",&a,&b,&c,&d,&e); getch(); f+=a; } g+=b; h+=c; i+=d;
武汉理工大学操作系统课内实践报告
学生学号实践课成绩
课内实践
实践内容请求页式内存管理的分配与回收
开课学院计算机科学与技术学院
指导老师姓名
学生姓名
学生专业班级
— 学年第一学期
目录
1设计目的、功能与要求 (2)
1.1设计目的、功能 (2)
1.2要求 (2)
2问题的详细描述、需求分析 (2)
2.1问题的详细描述 (2)
2.2 需求分析 (3)
3数据结构、功能设计(功能与框图、功能模块说明) (3)
3.1 算法分析 (3)
3.2 数据结构 (3)
3.3模块说明 (4)
3.3.1 主函数 (4)
3.3.2 功能函数 (5)
4开发工具及源程序的主要部分(需对主要代码段附文字注释) (5)
4.1开发平台 (5)
4.2 源程序的主要部分 (5)
5测试用例、运行结果与运行情况分析 (8)
5.1测试方法 (8)
5.2测试结果 (8)
6自我评价与总结 (11)
7参考文献 (11)
请求页式内存管理的分配与回收1设计目的、功能与要求
1.1设计目的、功能
模拟实现内存管理的分配与回收功能,掌握内存管理的相关内容,对内存的分配与回收有深入的理解。
1.2要求
(1)任选一种计算机高级语言编程实现
(2)选择一种内存管理方案:动态分区式、请求页式、段式、段页式等(3)能够输入给定的内存大小,进程的个数,每个进程所需内存空间大小(4)能够选择分配 / 回收操作
(5)能够显示进程在内存的存储地址、大小等
(6)显示每次完成内存分配或回收后内存空间的使用情况
2问题的详细描述、需求分析
2.1问题的详细描述
利用c++语言设计程序,模拟页式内存管理的过程。页式管理是一种内存空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。基本原理是将各进程的虚拟空间划分成若干个长度相等的页,页式管理把内存空间按页的大小划分成片或者页面,然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理。
操作系统课程设计吃水果问题完整版
目录
1 题目内容及要求 (2)
1.1 题目名称 (2)
1.2 题目描述 (2)
1.3 解题思路 (2)
1.4 程序清单 (6)
1.5 提交结果框图 (16)
2 总结 (20)
3 参考文献 (20)
1 题目内容及要求
1.1题目名称
进程同步模拟设计:吃水果问题
1.2题目描述
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.3解题思路
将问题转换为信号量上的资源分配类型问题:
这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。同步的模拟可以类似于函数调用时的前提关系即先决条件。这样进程同步模拟就完全可以通过函数的调用来实现。
具体的每一个操作的对应的函数的关系:
爸爸向盘子中放一个苹果:Father()
妈妈向盘子中放一个橘子:Mother()
儿子1从盘子取一个橘子:Son1()
儿子2从盘子取一个橘子:Son2()
女儿1从盘子取一个苹果:Daugther1()
儿子1从盘子取一个苹果:Daugther2()
具体实现方案:
(1)用一个整型变量Plate_Size表示盘子,初始值为0,当放水果时Plate_Size 加1,取水果时Plate_Size减1。变量Plate_Size的最大值为2,当为2时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状态;为0时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状态。
武汉理工大学c语言实验及答案
实验二 选择结构的程序设计
1.编程计算下面的分段函数。
4x-8 -1≤x <0
y= 3x 2
+10x-1 0≤x <1
8x 3-3x 2
+2x-1 1≤x <2 (1)事先编好程序和流程图。要求用if 语句结构实现,注意数据类型和输入提示语句。
#include <stdio.h> main ( ) {
float x,y;
printf ("input x:\n"); scanf ("%f",&x); if (x>=-1&&x<2) {
if (x>=-1&&x<0)
y=4*x-8;
else if (x>=0&&x<1)
y=3*x*x+10*x-1;
else
y=8*x*x*x-3*x*x+2*x-1;
printf("y=%10.2f",y); } else
printf ("DATA ERROR!"); }
(2)将程序运行六遍,分别从键盘上输入-1,-0.5,0,0.5,1,1.5这六个数,记录下运行结果并核对结果的正确性。
(3)再将程序运行二遍,分别从键盘上输入-3.5和2二个数,记录下运行结果并核对结果的正确性。
键盘的输入 分析结果 运行结果 调试说明
键盘输入-1 键盘输入-0.5 键盘输入0 键盘输入0.5 键盘输入1 键盘输入1.5
键盘的输入
观察到的运行结果
程序的错误之处和调试
④修改程序,使之能正确处理任何数据。当输入数据大于等于2或小于-1时,通知用户“Data Error ”,程序结束。
4.水果店有苹果,一级5.50元/kg ,二级4.20元/kg ,三级3.00元 /kg ,四级2.50/kg ,输入苹果的等级、数量以及顾客的付款数,显示出苹果的等级、数量、应付款数以及找给顾客的钱数。
武汉理工大学《C语言程序设计》实验报告
《C语言程序设计》实验报告
实验课程名称C语言程序设计
开课学院计算机科学与技术学院指导教师姓名
学生姓名X X
学生专业班级信息管理与信息系统1101班2012—2013学年第1学期
实验一顺序结构的程序设计
题目一:
程序代码:
题目二:
程序代码:
实验二:选择结构的程序设计题目一:
程序代码:
运行结果:
题目二
程序代码:
运行结果:
实验三循环结构的程序设计题目一
程序代码:
运行结果:
题目二:程序代码:
运行结果:
实验四数据和指针应用的程序设计题目一
程序代码:
运行结果:
运行结果:
程序代码:
运行结果:
实验五函数应用的程序设计程序代码:
运行结果:
程序代码:
运行结果:
武汉理工大学《C语言程序设计》实验报告答案
注:在Visual C++ 6.0编译环境中亲自调试通过,但不保证在Turbo C 中通过。
实验二 选择结构的程序设计
(题目当初没抄下来,这是根据程序整理的)
1.
编程实现分段函数⎪⎩⎪⎨⎧<≤-+-<≤-+<≤--=2112381011030184242x x x x x x x x x y
#include<stdio.h> main() { float x,y; printf("Please input x:"); scanf("%f",&x); if (x<-1||x>=2) printf("Data Error\n"); else { if (x>=-1&&x<0) y=4*x-8; if (x>=0&&x<1) y=3*x*x+10*x-1; if (x>=1&&x<2) y=8*x*x*x*x-3*x*x+2*x-1; printf("\ny=%f\n",y); } } 2. 苹果有三个等级,一级5.50元/斤,二级3.00元/斤,三级2.50元/斤。
编写程序,输入苹果的等级,购买的数量和所付的钱数,
输出等级,购买的数量、应付钱数和找零。
#include<stdio.h> main() { int level; double weight,pay,money,charge; printf("Please input the level:"); scanf("%d",&level); printf("Please input the weight you want:"); scanf("%lf",&weight); printf("Please input the money you pay:"); scanf("%lf",&pay); if (level<1||level>4||weight<0) printf("Data Error\n"); else{ if (level==1) money=weight*5.50; else if (level==2) money=weight*4.20; else if (level==3) money=weight*3.00; else if (level==4) money=weight*2.50; charge=pay-money; printf("\nLevel:%d\nweight:%g\n",level,weight); printf("money:%g\ncharge:%g\n\n",money,charge); } }
进程同步模拟设计 司机和售票员问题
正常行驶
开车门
到站停车
关车门
(a)司机的工作流程
(b)售票员的工作流程
这样一来的话,仿照书上的 P,V 操作,实现司机和售票员之间的同步的过程 如下:
武汉理工大学《计算机操作系统》课程设计说明书
begin sj,spy;semaphore sj=0;spy=1; cobegin process 司机 begin L1:P(sj); 启动车辆; 正常行驶; 到站停车; V(spy); goto L1; end; process 售票员 begin L2:P(spy); 开车门; 关车门; V(sj); 售票; goto L2; end; coend; end; ⑶ 开发平台及源程序的主要部分; 根据以上的原理,再结合自己所学的程序开发语言,最后得出:本程序的开 发平台是 c++平台,其中源程序的代码如下: //售票员的操作过程; //司机的操作过程; //设置司机和售票员的私有信号量; //设置初始值;
武汉理工大学《计算机操作系统》课程设计说明书
sj++; p1();
//相当于 v 操作
return 0; } 由于要表现出司机和售票员的操作过程,所以,程序是通过乘客的上下 车来实现的,而具体的实现过程对于用户来说是透明的。
⑷ 测试用例,运行结果与运行情况分析;
进程同步模型系统的设计吃水果样本
课程设计
课程设计任务书
学生姓名: Miss屠专业班级: 08计科
指引教师:王海英工作单位:计算机科学与技术学院
题目:进程同步模型系统设计——吃水果问题
初始条件:
1.预备内容:阅读操作系统进程管理章节内容,对进程同步和互斥,以及信号量机制度有进一步理解。
2.实践准备:掌握一种计算机高档语言使用。
规定完毕重要任务:(涉及课程设计工作量及其技术规定,以及阐明书撰写等详细规定)
1.为下面吃水果问题创立进程并运用通信API实现进程之间同步模型。可以解决如下情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中橘子,两个女儿专门等吃盘子中苹果。
2.设计报告内容应阐明:
⑴课程设计目与功能;
⑵需求分析,数据构造或模块阐明(功能与框图);
⑶源程序重要某些;
⑷运营成果与运营状况分析;
⑸自我评价与总结:
i)你以为你完毕设计哪些地方做得比较好或比较出众;
ii)什么地方做得不太好,后来如何改正;
iii)从本设计得到收获(在编写,调试,执行过程中经验和教训);
iv)完毕本题与否有其她其她办法(如果有,简要阐明该办法);
时间安排:
设计安排一周:周1、周2:完毕程序分析及设计。
周2、周3:完毕程序调试及测试。
周4、周5:撰写课程设计报告。
指引教师签名:年月日
系主任(或责任教师)签名:年月日
进程同步模型系统设计
——吃水果问题
1、课程设计目与功能
1.1、目
为下面吃水果问题创立进程并运用通信API实现进程之间同步模型。可以解决如下情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中橘子,两个女儿专门等吃盘子中苹果。
吃水果PV算法
假设计算机系统采用CSCAN(循环扫描)磁盘调度策略
设某单面磁盘旋转速度为每分钟6000转。每个磁道有100个扇区,相临磁道间的平均移动时间为1ms。
若在某时刻,磁头位于100号磁道处,并沿着磁道号大的方向移动(如图所示),磁道号请求队列为50、90、30、120。对请求队列中的每个磁道需读取1个随机分布的扇区,则读完这个扇区点共需要多少时间?要求给出计算过程。
所以,读完这个扇区点共需要170ms+20.4ms=190.4ms
设某计算机的逻辑地址空间和物理地址空间均为64KB,按字节编址。若某进程最多需要6页数据存储空间,页的大小为1KB,操作系统采用固定分配局部置换策略为此进程分配4个物理块。
当该进程执行到时刻260时,要访问逻辑地址为17CAH的数据,请回答下列问题:
每分钟6000转,转一圈的时间为0.01s=10ms
通过一个扇区的时间为0.0001s=0.1ms
根据CSCAN算法,被访问的磁道号顺序为:100、120、30、50、90,因此,寻道时间用去总时间为:(20+90+20+40)*1ms=170ms
总共要随机读取四个扇区,用去的时间为(10ms*0.5+0.1ms)*4=20.4ms
Semaphore empty1=1,full1=full2=0;//full1代表儿子,full2代表女儿
进程同步模拟吃水果,操作系统课程设计
2.3 操作的流程图....................................................................................................................3 第三章详细设计................................................................................................................................4
总成绩
教研室审核意见:
年月
权重 0.1 0.4 0.2 0.3
日
成绩
教研室主任签字:
教学院(系)审核意见:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进程同步模拟设计
——吃水果问题
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模块说明
(1)main函数:用一个随机的函数产生0—5的6个整数,分别对应六个进程的
调用,调用的次数可以自己输入,本程序共产生了10次随机的调用进程。
(2)6个进程函数:爸爸向盘子中放一个苹果操作:Father();妈妈向盘子中放一
个橘子操作:Mother();儿子1从盘子取一个橘子操作:Son1();儿子2从盘子取一个橘子操作:Son2();女儿1从盘子取一个橘子操作:Daugther1();
女儿2从盘子取一个橘子操作:Daugther2()。
(3)Print函数:用于输出盘子中苹果和橘子的个数,水果总个数及有哪些进程处于等待状态。
2.3 操作的流程图
(1)放水果操作
爸爸放苹果进程的操作流程图:
(2)取水果操作
儿子1取橘子的操作流程图
Father 操作:
Plate_Size=2
否
否
Daugther1或Daugher2处于
等待状态
是
按等待先后顺序调用
Daugther1或Daughter2操作
是
Father 进程处于等待状
态
Father 进程调用:orange+1 Plate_Size+1,Print()函数调用
返回
3开发平台及源程序的主要部分
3.1开发平台
(1)使用系统:windows7 (2)使用语言:C++
(3)开发工具:Microsoft Visual C++ 2012 Express
3.2源程序主要部分
(1)Print 函数(打印盘子剩余水果及各进程等待状态)
void Print() {
Son1操作:
Plate_Size=2
否
否
Daugther1或Daugher2处于
等待状态
是
按等待先后顺序调用
Daugther1或Daughter2操作
是
Father 进程处于等待状
Father 进程调用:orange+1 Plate_Size+1,Print()函数调用
返回
cout<<"现在盘子里有"< 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< } (2)各进程调用的函数 void Father() { apple++; Print(); } void Mother(){