苹果桔子问题.docx
- 文档编号:28361831
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:15
- 大小:91.13KB
苹果桔子问题.docx
《苹果桔子问题.docx》由会员分享,可在线阅读,更多相关《苹果桔子问题.docx(15页珍藏版)》请在冰豆网上搜索。
苹果桔子问题
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2009年秋季学期
操作系统原理课程设计
题目:
苹果-桔子问题的实现
专业班级:
计算机
(2)班
******
学号:
0*******
*******
成绩:
_______________
摘要
本设计实际上是生产者-消费者问题的一种变形。
这里,生产者(父亲和母亲)放入缓冲区(盘子)的产品有两类(苹果和桔子),消费者(女儿和儿子)也有两类,每类消费者只消费其中固定的一类产品。
生产者和消费者共享缓冲区,缓冲区中有空时,生产者可放入产品(不许放重),否则等待。
缓冲区中有产品时,消费者可取出产品(不许取重),否则等待。
关键词:
进程同步,PV操作,互斥,信号量
正文
1.问题描述
桌上有一个空盘子,只允许放一个水果。
爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。
规定当盘空时,一次只能放一个水果。
学生通过该题目的设计过程,可以掌握生产者与消费者问题、软件开发方法并提高解决实际问题的能力。
各进程在执行过程中为合作完成一个共同的任务,需要协调步伐,交换信息。
并发进程在一些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通消息,称为进程同步。
利用信号量和PV操作实现进程同步,PV操作是典型的同步机制之一。
用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。
用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
本题实际上是生产者-消费者问题的一种变形。
这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
生产者和消费者共享缓冲区,缓冲区中有空时,生产者可放入产品(不许放重),否则等待。
缓冲区中有产品时,消费者可取出产品(不许取重),否则等待。
2.设计目的
学生通过该题目的设计过程,掌握进程同步问题的原理、软件开发方法并提高解决实际问题的能力。
3.设计要求
1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。
2、设计合适的测试用例,对得到的运行结果要有分析。
3、设计中遇到的问题,设计的心得体会。
4、文档:
课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋前面要贴有学校统一的资料袋封面。
5、光盘:
每个学生文档和程序资料分别建在一个以自己学号和姓名命名的文件夹下,并要求每班负责人汇总每个学生的文件放在以班级姓名命名的文件夹下,刻录成5寸光盘,并复制四份(共五张内容相同的光盘),放在一个专门的资料袋中,不必再装软盘。
4.详细设计
(1)算法设计
1.采用类C语言定义相关的数据类型
intplate=0;
intapple=0;
intorange=0;
intm,n,i,N,p;
2.父亲进程模块
voidfather_put(){
if(plate==1){
printf("platefull,fatherwait...\n");
}
else{
apple=1;
plate=1;
printf("fatherputapple\n");
}
}
3.母亲进程模块
voidmother_put(){
if(plate==1){
printf("platefull,motherwait...\n");
}
else{
orange=1;
plate=1;
printf("motherputorange\n");
}
}
4.儿子进程模块
voidson_get(){
if(plate==0){
printf("plateempty,sonwait...\n");
}
else
if(orange==1){
orange=0;
plate=0;
printf("songetorange\n");
}
else{
printf("plateapple,sonwait...\n");
}
}
5.女儿进程模块
voiddaughter_get(){
if(plate==0){
printf("plateempty,daughtwait...\n");
}
else
if(apple==1){
apple=0;
plate=0;
printf("daughtergetapple\n");
}
else{
printf("plateorange,daughterwait...\n");
}
}
6.主函数模块
main()
{intm,n,i,N,p;
printf("===========MENU===========\n");
printf("1.operatethisprogram\n");
printf("2.quitthisprogram\n");
printf("inputyourchoice:
");
scanf("%d",&N);
if(N==1){
while(p!
=2)
{printf("pleaseinputanynumber:
");
scanf("%d",&i);
n=i%5;
if(n==0)
{m=i%2;
if(m==0){
father_put();
daughter_get();
}
else{
mother_put();
son_get();}
}
else
{
m=i%2;
if(m==0)
son_get();
else
daughter_get();
}
scanf("%d",&p);
}
}
}
7.函数关系调用图:
(2)界面设计
<1>.键入1,执行该程序。
<2>.分别键入四个数,根据判断条件一次输出相应语句。
<3>.键入2,退出该程序。
5.结果分析
进入菜单页面,键入1,执行该程序,键入2退出该程序。
输入一个任意数,根据判断条件输出相应的语句。
(1)键入任意一个既能被5整除,也能被2整除的数时,调用父亲进程,输出fatherputappleplateapple,sonwait...daughtergetapple
(2)键入任意一个能被5整除,但不能被2整除的数时,调用母亲进程,输出motherputorangesongetorange(3)键入任意一个不能被5整除但能被2整除的数时,调用儿子进程,输出plateempty,sonwait...;songetorange或者plateapple,sonwait...(4)键入任意一个既不能被5整除,也不能被2整除的数时,调用女儿进程,输出plateempty,daughtwait...;daughtergetapple或者plateorange,daughter
wait...
该程序设计了一个自动选择的方案,如果想一直运行该程序时,不断的输入一个不再是2的一个数,如果要是想退出时的时候,输入2就可直接退出程序。
设计总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.
此次操作系统课程设计,我的感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,我学到很多的东西;同时不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,所以只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正的服务于社会,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
因此,在以后的学习中要多下苦功,加强基础知识的学习,并且培养自己的动手实践能力。
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.
2.王清,李光明.《计算机操作系统》.冶金工业出版社.
3.孙钟秀等.操作系统教程.高等教育出版社
4.曾明. Linux操作系统应用教程.陕西科学技术出版社.
5.张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.
6.孟静, 操作系统教程--原理和实例分析.高等教育出版社
7.周长林,计算机操作系统教程.高等教育出版社
8.张尧学,计算机操作系统教程,清华大学出版社
9.任满杰,操作系统原理实用教程,电子工业出版社
致谢
这次课程设计培养了我耐心、缜密、全面地思考问题的能力,从而加快了问题解决的速度、提高了个人的工作效率,以及锻炼了使问题在短时间内得以解决的品质。
在编写程序的过程中,我得到了王旭阳老师的孜孜不倦的教诲,在王老师的指导下,我的能力得到了提高,同时养成了科学、严谨的作风和习惯。
为此我要感谢计通学院开设了这门操作系统课程设计,为我们提供了进一步学习算法、操作系统和巩固C语言程序计设这个平台,并对王旭阳老师的耐心讲解和帮助,表示衷心的感谢。
同时还要感谢对同一题目进行攻关的同学们,他们给了我很大的帮助。
如果没有他们的帮助,对于很多问题,仅凭自己是不能进行很好的解决的。
在此,我对他们帮助给予衷心的感谢。
附录:
源程序代码
#include
#include
#include
#include
intplate=0;
intapple=0;
intorange=0;
voidfather_put(){/*父亲进程
if(plate==1){
printf("platefull,fatherwait...\n");
return;
}
else{
apple=1;
plate=1;
printf("fatherputapple\n");
return;
}
}
voidmother_put(){/*母亲进程
if(plate==1){
printf("platefull,motherwait...\n");
return;
}
else{
orange=1;
plate=1;
printf("motherputorange\n");
return;
}
}
voidson_get(){/*儿子进程
if(plate==0){
printf("plateempty,sonwait...\n");
return;
}
else
if(orange==1){
orange=0;
plate=0;
printf("songetorange\n");
return;
}
else{
printf("plateapple,sonwait...\n");
return;
}
}
voiddaughter_get(){/*女儿进程
if(plate==0){
printf("plateempty,daughtwait...\n");
return;
}
else
if(apple==1){son_get();
apple=0;
plate=0;
printf("daughtergetapple\n");
return;
}
else{
printf("plateorange,daughterwait...\n");
return;
}
}
main()/*主函数
{
intm,n,i,N,p;
printf("===========MENU===========\n");
printf("1.operatethisprogram\n");
printf("2.quitthisprogram\n");
printf("inputyourchoice:
");/*进入菜单页面,输入1时执行该程序,输入2时退出该程序
scanf("%d",&N);
if(N==1){
while(p!
=2)/*判断输入的数是否为2,为2时退出程序,不为2时执行程序
{printf("pleaseinputanynumber:
");
scanf("%d",&i);
n=i%5;
if(n==0)
{m=i%2;
if(m==0){
father_put();
/*键入任意一个既能被5整除,也能被2整除的数时,调用父亲进程
daughter_get();
}
else{
mother_put();
/*键入任意一个能被5整除,但不能被2整除的数时,调用母亲进程
son_get();}
}
else
{m=i%2;
if(m==0)
son_get();/*键入任意一个不能被5整除,能被2整除的数时,调用儿子进程
else
daughter_get();/*键入任意一个既不能被5整除,也不能被2整除的数时,调用女儿进程
}
scanf("%d",&p);}}}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 苹果 桔子 问题