1、 1 (操作系统课程设计) 生 产 者 和 消 费 者 学生姓名: 学生学号: 班 级: 2 一、课程题目分析 这个题目是生产者向消费者提供商品,消费者消耗商品,并且两组人共用同 一缓冲区。生产者提供了商品之后消费者才能去取商品,消费者若不取走商品则 当缓冲区用完之后生产者则不能再向缓冲区中添加新的商品。 思考问题: (1)对于生产者进程:每产生一个数据,则需去访问共用缓冲区是否有已 满,未满则可以将该数据存入并通知消费者进程,否则不能。 (2)对于消费者进程:每当想去消费(取出数据)时,则需访问缓冲区是 否为空,为空则不能消费(取出数据) ,否则可以取,并通知生产者。 (3)缓冲区是个临界资
2、源,所有的进程对于该空间都是共享的,所以,还 有互斥问题存在。 二、课程设计目的 通过实验模拟生产者与消费者之间的关系, 了解并掌握他们之间的关系及原 理。由此增加对进程同步问题的了解: (1)掌握基本的同步互斥算法,理解生产者与消费者模型 (2)了解 windows 中多线程(多进程)的并发执行机制,线程(进程)间 的同步于互斥 (3)学习使用 windows 中基本的同步对象,掌握相应的 API。 三、 课程设计内容 有n个生产者和m个消费者, 连接在具有k个单位缓冲区的有界环转缓冲上, 故又称有界缓冲问题。其中 Pi和 Cj都是并发进程,只要缓冲区未满,生产者进 程 Pi所生产的产品就可
3、投入缓冲区;类似地,只要缓冲区非空,消费者进程 Cj 就可以从缓冲区取走并消耗产品。 四、开发环境 操作系统:Windows 系统 编写语言:C+语言 五、系统分析设计 (一)算法原理 生产者消费者问题是典型的进程同步问题, 这些进程必须按照一定的生 产率和消费率来访问共享缓冲区,用 P、V 操作解决生产者和消费者共享单缓冲 区的问题,可设置两个信号量 empty 和 full,其初值分别为 1 和 0,empty 指示 能否向缓冲区放入产品,full 指示能否从缓冲区取出产品。为了使其协调工作, 必须使用一个信号量 mutex(初值为 1) ,以限制生产者和消费者互斥地对缓冲区 进行存取,另
4、用两个信号量 empty1(初值为缓冲区大小)和 full1(初值为 0) , 3 以保证生产者不向已满的缓冲区中放入产品,消费者不从空缓冲区中取产品。 (二)功能描述 生产者功能描述:在同一个进程地址空间内执行两个线程。生产者线程生产 物品,然后将物品放置在一个空缓冲区中供消费者线程消费。当生产者线程生产 物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一 个空缓冲区。 消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费 者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的 物品被生产出来。 (三)算法流程图 生产者流程图: 消费者流程图
5、: 总的流程图: 4 开始 Int i=1,n 键盘输入数字, 初始化 n i=0?退出 Y 键盘输入数 字,改变i的值 i=1?i=2? producer(b)consumer(b) i=3? N N YY i=4? showbuf(b) coutV(1); /缓冲区显示 void showbuf(SeqSquare *a) int i=a-getSize(); (3)在实现本程序的生产者消费者模型时, 具体地通过以下同步对象实现互斥: 6 设一个互斥量 Mutex,以实现生产者在查询和保留缓冲区的下一个空位置 时进行互斥。 每一个生产者用一个信号量与消费者同步,通过设置 Full 实现,该
6、组信 号量用于表示相应产品以生产。同时用一个表示空缓冲区数目的信号量 Empty 进行类似的同步,指示缓冲区中是否存在空位置,以便开始生产下一个产品。 (四)调试过程 为解决生产者、消费者问题,应该设置两个资源信号量,其中一个表示空缓 冲区的数目,用 Full 表示,其初值为用户输入的缓冲区的大小,另一个表示缓 冲区中产品的数目,用 Empty 表示,其初值为 0.另外,由于缓冲区是一个临界 资源,必须互斥使用,所以还需要再设置一个互斥信号量 Mutex,其初值为 1. 在生产者、消费者问题中,信号量实现两种功能。首先,他是生产产品和消 费产品的计数器,计数器的初值是可使用的资源数目(缓冲区的长度) 。其次, 他是确保产品的生产者和消费者之间的动作同步的同步器。 生产者要生产一个产品时,首先对资源信号量 Full 和互斥信号量 Mutex 进 行 P 操作,申请资源。如果可以通过的话,就生产一个产品,并把产品送人缓冲 区。然后对互斥信号量 Mutex 和资源信号量 Empty 进行 V 操作,释放资源