1、 操操 作作 系系 统统 设设 计计 报报 告告 姓名:姓名: 学号:学号: 日期:日期:2013 年年 12 月月 30 日日 1 目录目录 第 1 章 需求分析 . 2 1.1 设计题目 2 1.2 设计目的 2 1.3 设计环境与工具 2 1.3.1 设计环境 . 2 1.3.2 设计工具 . 2 1.4 设计要求 2 第 2 章 概要设计 . 3 2.1 设计内容与原理 3 2.1.1 设计内容 . 3 2.1.2 设计原理 . 3 2.2 程序流程图 . 4 第 3 章 详细设计 . 6 3.1 数据结构 6 3.2 算法说明 6 3.2.1 同步机制原语算法 . 6 3.2.2 具
2、体算法实现 7 3.3 具体程序实现 . 8 3.3.1 生产者方法 . 8 3.3.2 消费者方法 . 8 3.3.3 多线程实现 . 9 第 4 章 程序运行结果和分析 .11 4.1 运行结果 .11 4.2 结果分析 .11 第 5 章 总结与体会 12 附录:源程序. 13 2 第 1 章 需求分析 1.1 设计题目 用多线程同步方法解决生产者消费者问题 1.2 设计目的 1.通过编程实现生产者与消费者问题,了解进程同步的概念,理解信号量机 制的原理。 2.掌握运用信号量解决进程同步问题的方法, 学会运用进程的同步于互斥结 局生产者与消费者的冲突问题。 3.通过研究 Linux 的线
3、程机制和信号量实现生产者消费者问题的并发控制。 1.3 设计环境与工具 1.3.1 设计环境 Fedora 10 操作系统 1.3.2 设计工具 Vi 编辑器,gcc 编译器 1.4 设计要求 1.有界缓冲区内设有 20 个存储单元,放入/取出的数据项设定为 1-20 这 20 个整型数。 2.每个生产者和消费者对有界缓冲区进行操作后, 即时显示有界缓冲区的全 部内容、当前指针位置和生产者/消费者线程的标识符。 3.生产者和消费者各有两个以上。 4.多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。 3 第 2 章 概要设计 2.1 设计内容与原理 2.1.1 设计内容 在同一个进程
4、地址空间内执行的两个线程,生产者生产物品,然后将物品放 置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后 释放缓冲区,当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线 程必须等待消费者线程释放出一个空缓冲区,当消费者线程消费物品时,如果没 有满的缓冲区,那么消费者线程将被阻塞,知道新的物品被生产出来,我的具体 做法也是如此,建立缓冲区,生产者生产的产品放入,消费者从中取产品,如果 没有产品,则等待。 2.1.2 设计原理 要实现生产者与消费者的互斥关系, 生产者和消费者进程之间必须满足两个 同步条件: 1.只有在缓冲池中至少有一个缓冲区已存入消息后,消费者才可以
5、 从中提取消息,否则消费者必须等待。 2.只有缓冲池中至少有一个缓冲区是空 时,生产者才可以把消息放入缓冲区中,否则生产者必须等待。 要满足第一个同步条件,设置一个同步信号量 full_sem,它的值为 20 时整 个缓冲区满,这个资源是消费者进程所拥有,消费者进程可以申请资源,对它做 P 操作;另外一个信号量 empty_sem,它的初值为 20,表示整个缓冲区都是空的。 可以用 full_sem 表示空缓冲区数量,empty_sem 表示满缓冲区数量,另外有界 缓冲区是一个临界资源,必须互斥使用,所以必须再设置一个互斥信号量 mux, 初值为 1。 在生产者/消费者问题中,信号量实现两种功
6、能,首先,它是跟踪资源的生 产和消费的计数器,其次,它是协调产品的生产者和消费者之间动作同步的同步 器。消费者通过再一指派给它的信号量上做 P 操作来表示消耗资源,而生产者通 过再同一个信号量上做 V 操作来表示生产资源。而这种信号量的实施中,计数在 4 每次 P 操作后减 1,而在每次 V 操作后加 1。这个计数器的初始值是可利用的资 源数目,当资源是不可利用时,将申请资源的进程防止在等待队列中,如果有一 个资源释放,在等待队列中的第一个进程被唤醒并得到资源的控制权。 假定在生产者和消费者之间的公用缓冲区中,具有 n 个缓冲区,这时可以利 用互斥信号量 mutex 实现诸进程对缓冲区的互斥使用, 利用信号量 empty 和 full 分别表示缓冲池中空缓冲区和满缓冲区的数量, 又假定这些生产者和消费者互相 等效果,只要缓冲区未满,生产者便可以将消息送入缓冲池,只要缓冲池未空, 消费者便可以从缓冲池中取走一个消息。 2.2 程序流程图 图 2.1 生产者流程图 生产一条数据 是否可用 存储单元 是否可用 存入一条数据 归还使用权 数据单元加 1, 唤醒一个消费者 等待资源,阻塞