苹果-桔子问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2009年秋季学期
操作系统原理课程设计
题目:苹果-桔子问题的实现
专业班级:计算机(2)班
姓名:邢博文
学号:07240214
指导教师:王旭阳
成绩:_______________
摘要 (2)
正文 (3)
1.问题描述 (3)
2.设计目的 (4)
3.设计要求 (5)
4.详细设计 (6)
5.结果分析 (12)
设计总结 (13)
参考文献 (14)
致谢 (15)
附录:源程序代码 (16)
本设计实际上是生产者-消费者问题的一种变形。这里,生产者(父亲和母亲)放入缓冲区(盘子)的产品有两类(苹果和桔子),消费者(女儿和儿子)也有两类,每类消费者只消费其中固定的一类产品。生产者和消费者共享缓冲区,缓冲区中有空时,生产者可放入产品(不许放重),否则等待。缓冲区中有产品时,消费者可取出产品(不许取重),否则等待。
关键词:进程同步,PV操作,互斥,信号量
1.问题描述
桌上有一个空盘子,只允许放一个水果。爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时,一次只能放一个水果。
学生通过该题目的设计过程,可以掌握生产者与消费者问题、软件开发方法并提高解决实际问题的能力。各进程在执行过程中为合作完成一个共同的任务,需要协调步伐,交换信息。
并发进程在一些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通消息,称为进程同步。
利用信号量和PV操作实现进程同步,PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
本题实际上是生产者-消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。生产者和消费者共享缓冲区,缓冲区中有空时,生产者可放入产品(不许放重),否则等待。缓冲区中有产品时,消费者可取出产品(不许取重),否则等待。
2.设计目的
学生通过该题目的设计过程,掌握进程同步问题的原理、软件开发方法并提高解决实际问题的能力。
1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。
2、设计合适的测试用例,对得到的运行结果要有分析。
3、设计中遇到的问题,设计的心得体会。
4、文档:课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋前面要贴有学校统一的资料袋封面。
5、光盘:每个学生文档和程序资料分别建在一个以自己学号和姓名命名的文件夹下,并要求每班负责人汇总每个学生的文件放在以班级姓名命名的文件夹下,刻录成5寸光盘,并复制四份(共五张内容相同的光盘),放在一个专门的资料袋中,不必再装软盘。
(1)算法设计
1.采用类C语言定义相关的数据类型
int plate=0;
int apple=0;
int orange=0;
int m,n,i,N,p;
2.父亲进程模块
void father_put(){
i f(plate==1){
printf("plate full,father wait...\n");
}
e lse{
apple=1;
plate=1;
printf("father put apple\n");
}
}
3.母亲进程模块
void mother_put(){
i f(plate==1){
printf("plate full,mother wait...\n");
}
e lse{
orange=1;
plate=1;
printf("mother put orange\n");
}
}
4.儿子进程模块
void son_get(){
i f(plate==0){
printf("plate empty,son wait...\n");
}
e lse
if(orange==1){
orange=0;
plate=0;
printf("son get orange\n");
}
else {
printf("plate apple,son wait...\n");
}
}
5.女儿进程模块
void daughter_get(){
i f(plate==0){
printf("plate empty,daught wait...\n");
}
e lse
if(apple==1){
apple=0;
plate=0;
printf("daughter get apple\n");
}
else{
printf("plate orange,daughter wait...\n");
}
}
6.主函数模块
main()
{ int m,n,i,N,p;
printf("===========MENU===========\n");
printf("1.operate this program\n");
printf("2.quit this program\n");
printf("input your choice:");
scanf("%d",&N);
if(N==1){
while(p!=2)