haihongyuan.com
海量文库 文档专家
全站搜索:
您现在的位置:首页 > 幼儿教育 > 育儿理论经验育儿理论经验

苹果橘子问题

发布时间:2013-12-27 13:50:12  

*******************

实践教学

*******************

兰州理工大学

计算机与通信学院

2013年秋季学期

课程设计

题 目:苹果—桔子问题的实现 专业班级:

姓 名:

学 号:

指导教师:

成 绩:

目 录

摘 要 .................................................................................................. 2

正 文 .................................................................................................. 3

1.问题描述 .................................................................................... 3

2.设计目的 .................................................................................... 3

3.设计要求 .................................................................................... 4

4.详细设计 .................................................................................... 4

4.1界面设计 ........................................................................... 4

4.2算法设计 ........................................................................... 5

4.2.1数据结构 ................................................................. 5

4.2.2模块声明 ................................................................. 6

4.2.3算法设计 ................................................................. 6

4.3流程图 ............................................................................... 8

5.结果分析 .................................................................................. 12

设计总结 ............................................................................................ 16

参考文献 ............................................................................................ 17

致 谢 ................................................................................................ 18

附录:源程序代码 ............................................................................ 19

1

摘 要

本设计实际是生产者—消费者的变形,是典型的进程同步问题。本问题利用C语言实现相应的P、V原语。主要过程可用生产消费者来模拟,这里,生产者(父亲和母亲)放入缓冲区(盘子)的产品有两类(苹果和桔子),消费者(女儿和儿子)也有两类,每类消费者只消费其中固定的一类产品。生产者和消费者共享缓冲区,缓冲区中有空时,生产者可放入产品(不许放重),否则等待。缓冲区中有产品时,消费者可取出产品(不许取重),否则等待。 关键字:进程同步,P、V操作,信号量

2

正 文

1.问题描述

桌上有一个空盘子,只允许放一个水果。爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时,一次只能放一个水果。

这个问题实际上是两个生产者和两个消费者被连接到仅能放一个产品的缓冲器上。生产者各自生产不同的产品,但就其本质而言,他们是同一类生产者。而消费者则各自去需要的产品消费,但消费的方式不同。解决此类问题利用记录型信号量机制和P、V操作来实现进程同步。进程同步是指一个进程的执行依赖于另一个进程的信号或消息,当一个进程没有得到来自与另一个进程的信号或消息时则等待,直到信号或消息到达才被唤醒。

2.设计目的

本实验是典型的进程同步问题。某些进程为了完成同一任务分工合作,由于合作的每一个进程都是独立的不可预知的推进,这就需要相互合作的进程在某些合作点上协调各自的工作。当合作进程中的一个到达合作点后,在尚未得到其他合作进程发来的消息或信号前应阻塞自己,直到其合作进程发来协调信号或消息后才能被唤醒。这就是进程同步要解决的问题。

本实验借助C语言实现进程同步经典问题—苹果-桔子问题,用高级语言编写和调试一个进程同步程序,以加深对进程同步机制的理解。通过用C语言模拟进程同步实现,加深理解有关进程同步机制的概念及P、V操作的应用。通过该题目的设计过程,掌握进程同步问题的原理、软件开发方法并提高解决实际问题的能力。

3

3.设计要求

(1)分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据

结构)。

(2)设计合适的测试用例,对得到的运行结果要有分析。

(3)设计中遇到的问题,设计的心得体会。

(4)文档:课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋

前面要贴有学校统一的资料袋封面。

(5)光盘:每个学生文档和程序资料分别建在一个以自己学号和姓名命名的文

件夹下,并要求每班负责人汇总每个学生的文件放在以班级姓名命名的文件夹下,刻录成5寸光盘,并复制四份(共五张内容相同的光盘),放在一个专门的资料袋中,不必再装软盘。

4.详细设计

4.1界面设计

printf("现在盘子里有 %d个苹果,%d个桔子\n",apple,orange);

printf("father进程处于等待状态\n");

printf("mother进程处于等待状态\n");

printf("son进程处于等待状态\n");

printf("daughter进程处于等待状态

\n");

printf("第%d次操作:

\n",k+1);

printf("处于等待的daughter自动被调用

\n");

printf("处于等待的son自动被调用。

\n");

printf("处于等待的father自动被调用\n");

4

printf("处于等待的mother自动被调用

\n");

printf("处于等待的father自动被调用

\n");

printf("father调用

.\n");

printf("mother调用

.\n");

printf("son调用

.\n");

printf("daughter调用

\n");

4.2算法设计

4.2.1数据结构

(1)用一个整型变量plat_size表示盘子,初始值为0,plat_size=apple+orange,

当放水果plat_size加1,取水果plat_size减1。当plat_size为1时,表示盘子已满,此时若进行放水果操作,放水果将处于等待状态;当为0时,表示盘子已空,此时若进行取水果操作,取水果操作将处于等待状态。

(2)整型变量orang和apple分别表示盘中桔子和苹果的数目,初始值都为0,。

(3)用4个整型变量father_lag、mother_lag、son_lag、daughter_lag表示4个

进程是否处于等待状态,处于等待状态时,变量值为1。

(4)两个水果同时处等待状态时,若有取水果的操作将自动执行等待放水果进

程,执行按等待的先后顺序。

(5)用一个随机函数产生0~3的4个整数,分别对应4个进程调用。 int apple=0; //苹果个数

int orange=0; //桔子个数

int father_lag=1; //father进程标志

int mother_lag=1; //mother进程标志

5

int son_lag=1; // son进程标志

int daughter_lag=1; //女儿进程标志

int plat_size=0; // 盘子中水果数量

int mf=0; //father与mother进程等待先后顺序

4.2.2模块声明

(1)主函数 用一个随机函数产生0~3的4个整数,分别对应4个进程的调用,

调用的次数可以自己输入,本程序共产生10次随机调用过程。

(2)4个进程函数

爸爸向盘中放一个苹果操作:father()

妈妈想盘中放一个桔子造作:mother()

儿子从盘中取一个桔子操作:son()

女儿从盘中取一个苹果操作:daughter()

(3)print()函数 用于输出盘中苹果和桔子的个数及有哪些进程处于等待状态。

4.2.3算法设计

本程序算法较为简单,仅仅使用了大量的if~else结构和一个for循环结构,其算法用P、V原语描述如下:

Semaphore plat_size=1, orange=0, apple=0;

父亲进程

do{

削一个苹果;

p(plat_size);

将苹果放入盘中;

v(apple);

}while(1)

母亲进程

do{

6

剥一个桔子; p(plat_size);

将桔子放入盘中; v(orange); }while(1)

儿子进程

do{

p(oange);

从盘中去桔子; v(plat_size); 吃桔子; }while(1)

女儿进程

do{

p(apple);

从盘中取苹果; v(plat_size); }while(1)

7

4.3流程图

爸爸放苹果进程的操作流程(如图一)

图 一

8

妈妈放桔子进程的操作流程(如图二):

图 二

9

儿子取桔子的操作流程图(如图三):

图 三

10

女儿取苹果的操作流程图(如图四):

图 四

11

5.结果分析

第一次运行结果为(图五、图六):

图 五

12

图 六

13

第二次运行结果(图七、图八):

图 七

14

图 八

15

设计总结

在此次面向对象课程设计中,我的题目是:苹果—桔子问题的实现。刚拿到这个任务时就感觉到了一种困难和挑战!不知道从何下手开始设计程序,经过三天的思考,才有了一定的眉目。最后在老师和同学的帮助下,终于得出了一套可行的方案。依照策划的设计思想,又过了六天的编写和测试,终于实现了进程的同步功能,虽然整体还有待提高,但总算实现了基本功能,还算满意。

通过此次设计实训我对操作系统原理有了更进一步的了解,学会应用进程同步及P、V原语,相信会对以后的课程设计有很大的帮助作用。也体会了到同学之间的相互合作帮助可以克服一切困难,尤其是在理论联系实际的过程中。 我的同学在设计过程中为我发现许多错误,也帮助我解决了很多问题,在此我衷心的感谢他们。在以后的学习中我会更加注意各个方面的能力的协调发展,培养自己的动手能力和拓宽自己的知识面,逐渐提高自己的专业技能。在课程设计时遇到了很多的问题,在老师的帮助,和对各种资料的查阅中,将问题一个一个的解决了,培养了我自主动手,独立研究的能力,为今后在学习工作中能更好的发展打下了坚实的基础。

总的来说这次试验比较成功,加深我对进程的理解,同时也提高了自己编程能力。编程是个长久的过程,平时要多去动手实践,去提高自己的分析问题、发现问题、解决问题的能力。

16

参考文献

1. 汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.

2. 王清,李光明.《计算机操作系统》.冶金工业出版社.

3.孙钟秀等. 操作系统教程. 高等教育出版社

4.曾明. Linux操作系统应用教程. 陕西科学技术出版社.

5. 张丽芬,刘利雄.《操作系统实验教程》. 清华大学出版社.

6. 孟静, 操作系统教程--原理和实例分析. 高等教育出版社

7. 周长林,计算机操作系统教程. 高等教育出版社

8. 张尧学,计算机操作系统教程,清华大学出版社

9. 任满杰,操作系统原理实用教程,电子工业出版社

17

致 谢

首先感谢我的老师和同学们在设计过程中给我提出了许多宝贵的意见和建议,并细心的帮助我解决问题,还在最后的调试程序的过程中帮我找出了一些潜在的错误,没有他们,我也许发现不了这些错误,在此非常感谢他们。

同时也感谢我的操作系统课的王旭阳老师,感谢她在基础课学习中为我打下良好的基础,这是我这次课程设计能够顺利完成的前提。

18

附录:源程序代码

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

int apple=0;

int orange=0;

int father_lag=1;

int mother_lag=1;

int son_lag=1;

int daughter_lag=1;

int plat_size=0;

int mf=0;

void print();

void father() //父进程

{

apple++;

print();

}

void mother() //母进程

{

orange++;

print();

}

void son() //儿子进程

{

orange--;

print();

}

void daughter() //女儿进程

{

apple--;

print();

}

void print()

{

printf("现在盘子里有 %d个苹果,%d个桔子\n",apple,orange); if(father_lag==1)

printf("father进程处于等待状态\n");

if(mother_lag==1)

printf("mother进程处于等待状态\n");

if(son_lag==1)

19

printf("son进程处于等待状态\n");

if(daughter_lag==1)

printf("daughter进程处于等待状态\n");

if((father_lag==0)&&(mother_lag==0)&&(son_lag==0)&&(daughter==0)) printf("\n");

}

void main()

{

int k;

int i;

srand((unsigned)time(NULL)); //随机产生一个以当前时间开始的随机种

for(k=0;k<10;k++)

{

printf("━━━━━━━━━━━━━━━━━━━━━\n");

printf("第%d次操作: \n",k+1);

i=rand()%4; //随机生成1-5

plat_size=apple+orange;

switch(i)

{

case 0:

printf("father调用.\n");

if(plat_size==1)

{

father_lag=1; //father处于等待状态

print();

if(mother_lag==0)

mf=1; // father与mother互斥信号量决定先后顺序 }

else{

father();

if(daughter_lag==1)

{

daughter_lag=0; //等待取消

printf("处于等待的daughter自动被调用\n");

daughter();

}

}

printf("━━━━━━━━━━━━━━━━━━━━\n");

break;

case 1:

printf("mother调用.\n");

if(plat_size==1)

{

20

mother_lag=1; //mother处于等待状态

print();

if(father_lag==0)

mf=2;

}

else{

mother();

// print();

if(son_lag==1) //等待取消

{

son_lag=0;

printf("处于等待的son自动被调用。\n"); son();

}

}

printf("━━━━━━━━━━━━━━━━━━━━\n"); break;

case 2:

printf("son调用.\n");

if(orange==0)

{

son_lag=1; //son处于等待状态

print();

}

else{

son();

if(mother_lag==1&&father_lag==1)

{

if(mf==1)

{

father_lag=0;

printf("处于等待的father自动被调用\n"); father();

mf=2;

}

else{

mother_lag=0;

printf("处于等待的mother自动被调用\n"); mother();

mf=1;

}

}

else {

if(mother_lag==1)

21

{

mother_lag=0;

printf("处于等待的mother自动被调用\n"); mother();

mf=0;

}

else if(father_lag==1)

{

father_lag=0;

printf("处于等待的father自动被调用\n"); father();

mf=0;

}

}

}

printf("━━━━━━━━━━━━━━━━━━━━\n"); break;

case 3:

printf("daughter调用\n");

if(apple==0)

{

daughter_lag=1;

print();

}

else{

daughter();

//print();

if(mother_lag==1&&father_lag==1)

{

if(mf==1)

{

father_lag=0;

printf("处于等待的father自动被调用\n"); father();

mf=2;

}

else{

mother_lag=0;

printf("处于等待的mother自动被调用\n"); mother();

mf=1;

}

}

else {

22

if(mother_lag==1)

{

mother_lag=0;

printf("处于等待的mother自动被调用\n"); mother();

mf=0;

}

else if(father_lag==1)

{

father_lag=0;

printf("处于等待的father自动被调用\n"); father();

mf=0;

}

}

}

printf("━━━━━━━━━━━━━━━━━━━━\n"); break;

}

}

}

23

网站首页网站地图 站长统计
All rights reserved Powered by 海文库
copyright ©right 2010-2011。
文档资料库内容来自网络,如有侵犯请联系客服。zhit326@126.com