苹果-桔子问题的实现 下载本文

摘 要

本设计实际是生产者—消费者的变形,通过有界缓冲区把生产者和消费者联系起。

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

目 录

1.概述 ............................................................................................................................. 1

1.1问题描述 ........................................................................................................... 1 1.2需求分析 ........................................................................................................... 1 1.3设计目的 ........................................................................................................... 1 1.4设计要求 ........................................................................................................... 2 2.概要设计 ..................................................................................................................... 3

2.1数据结构 ........................................................................................................... 3 2.2模块声明 ........................................................................................................... 4 3.详细设计 ..................................................................................................................... 6

3.1界面设计 ........................................................................................................... 6 3.2算法设计 ........................................................................................................... 6 3.3设计流程图 ....................................................................................................... 9

3.3.1爸爸放苹果进程操作流程图 ................................................................. 9 3.3.2妈妈放桔子进程操作流程图 ............................................................... 11 3.3.3儿子取桔子操作流程图 ....................................................................... 12 3.3.4女儿取苹果操作流程图 ....................................................................... 12

4.结果分析 ................................................................................................................... 14 5.设计总结 ................................................................................................................... 18 参考文献 ...................................................................................................................... 19 致 谢 .......................................................................................................................... 19 附录 .............................................................................................................................. 20

1

1.概述

1.1问题描述

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

1.2需求分析

本实验进行操作系统课设的主要任务是模拟生产者与消费者问题的一个衍生,即实现苹果--橘子问题。这个题目有两个生产者,分别生产橘子和苹果。有两个消费者,分别消费苹果和橘子。同时,因为两个生产者和两个消费者同时对一个缓冲区进行操作。所以应互斥的访问的缓冲区以保证程序的正确性。本次进程的目的就是加深个进程之间的正确有效的访问一个存储单元缓冲区,即同步和互斥。也要涉及到信号量在互斥访问中的使用,生产者和消费者问题的实现和流程问题。当计算机中两个或者多个进程在执行时需要使用公用缓冲区,并且对该缓冲区采取了互斥措施,这时如果并发执行这些进程的时候就会造成CPU时间的极大浪费,这是操作系统设计要求不允许的。而这种现象在操作系统和用户进程中大量存在。因此为了解决这一问题,提出了同步的概念,即把异部环境下的一组并发进程,因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。

1.3设计目的

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

借助C语言实现进程同步经典问题—苹果-桔子问题,用高级语言编写和调试一个

2

进程同步程序,以加深对进程同步机制的理解。通过用C语言模拟进程同步实现,加深理解有关进程同步机制的概念及P、V操作的应用。通过该题目的设计过程,掌握进程同步问题的原理、软件开发方法并提高解决实际问题的能力。

1.4设计要求

这是进程同步与互斥问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过编程实践时,实际是随机的调用一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作,这就是互斥的表现。同步的模拟可以类似于函数调用时的前提关系即先决条件。这样进程同步模拟就完全可以通过函数的调用来实现。为下面吃水果的问题创建进程并实现进程之间的同步模型。能够处理以下的情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

(1)分析设计要求,给出解决方案(说明设计所用的原理,采用的数据结构)。 (2)设计合适的测试用例,对得到的运行结果要有分析。 (3)设计中遇到的问题,设计的心得体会。 (4)设计到进程互斥与同步,更深了解操作系统。

3