




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操操 作作 系系 统统 设设 计计 报报 告告 姓名 韦李姓名 韦李 学号 学号 5 日期 日期 2013 年年 12 月月 30 日日 武汉理工大学华夏学院 操作系统原理 课程设计说明书 1 目录目录 第 1 章 需求分析 1 1 1 设计题目 1 1 2 设计目的 1 1 3 设计环境与工具 1 1 3 1 设计环境 1 1 3 2 设计工具 1 1 4 设计要求 1 第 2 章 概要设计 2 2 1 设计内容与原理 2 2 1 1 设计内容 2 2 1 2 设计原理 2 2 2 程序流程图 3 第 3 章 详细设计 5 3 1 数据结构 5 3 2 算法说明 5 3 2 1 同步机制原语算法 5 3 2 2 具体算法实现 6 3 3 具体程序实现 7 3 3 1 生产者方法 7 3 3 2 消费者方法 7 3 3 3 多线程实现 8 第 4 章 程序运行结果和分析 10 4 1 运行结果 10 4 2 结果分析 10 第 5 章 总结与体会 11 附录 源程序 14 2 第 1 章 需求分析 1 1 设计题目 用多线程同步方法解决生产者 消费者问题 1 2 设计目的 1 通过编程实现生产者与消费者问题 了解进程同步的概念 理解信号量 机制的原理 2 掌握运用信号量解决进程同步问题的方法 学会运用进程的同步于互斥 结局生产者与消费者的冲突问题 3 通过研究 Linux 的线程机制和信号量实现生产者消费者问题的并发控制 1 3 设计环境与工具 1 3 1 设计环境 Fedora 10 操作系统 1 3 2 设计工具 Vi 编辑器 gcc 编译器 1 4 设计要求 1 有界缓冲区内设有 20 个存储单元 放入 取出的数据项设定为 1 20 这 20 个整型数 2 每个生产者和消费者对有界缓冲区进行操作后 即时显示有界缓冲区的 全部内容 当前指针位置和生产者 消费者线程的标识符 3 生产者和消费者各有两个以上 武汉理工大学华夏学院 操作系统原理 课程设计说明书 3 4 多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码 第 2 章 概要设计 2 1 设计内容与原理 2 1 1 设计内容 在同一个进程地址空间内执行的两个线程 生产者生产物品 然后将物品放 置在一个空缓冲区中供消费者线程消费 消费者线程从缓冲区中获得物品 然 后释放缓冲区 当生产者线程生产物品时 如果没有空缓冲区可用 那么生产 者线程必须等待消费者线程释放出一个空缓冲区 当消费者线程消费物品时 如果没有满的缓冲区 那么消费者线程将被阻塞 知道新的物品被生产出来 我的具体做法也是如此 建立缓冲区 生产者生产的产品放入 消费者从中取 产品 如果没有产品 则等待 2 1 2 设计原理 要实现生产者与消费者的互斥关系 生产者和消费者进程之间必须满足两 个同步条件 1 只有在缓冲池中至少有一个缓冲区已存入消息后 消费者才可 以从中提取消息 否则消费者必须等待 2 只有缓冲池中至少有一个缓冲区 是空时 生产者才可以把消息放入缓冲区中 否则生产者必须等待 要满足第一个同步条件 设置一个同步信号量 full sem 它的值为 20 时 整个缓冲区满 这个资源是消费者进程所拥有 消费者进程可以申请资源 对 它做 P 操作 另外一个信号量 empty sem 它的初值为 20 表示整个缓冲区都 是空的 可以用 full sem 表示空缓冲区数量 empty sem 表示满缓冲区数量 另外有界缓冲区是一个临界资源 必须互斥使用 所以必须再设置一个互斥信 号量 mux 初值为 1 在生产者 消费者问题中 信号量实现两种功能 首先 它是跟踪资源的生 产和消费的计数器 其次 它是协调产品的生产者和消费者之间动作同步的同 4 步器 消费者通过再一指派给它的信号量上做 P 操作来表示消耗资源 而生产 者通过再同一个信号量上做 V 操作来表示生产资源 而这种信号量的实施中 计数在每次 P 操作后减 1 而在每次 V 操作后加 1 这个计数器的初始值是可利 用的资源数目 当资源是不可利用时 将申请资源的进程防止在等待队列中 如果有一个资源释放 在等待队列中的第一个进程被唤醒并得到资源的控制权 假定在生产者和消费者之间的公用缓冲区中 具有 n 个缓冲区 这时可以 利用互斥信号量 mutex 实现诸进程对缓冲区的互斥使用 利用信号量 empty 和 full 分别表示缓冲池中空缓冲区和满缓冲区的数量 又假定这些生产者和消费 者互相等效果 只要缓冲区未满 生产者便可以将消息送入缓冲池 只要缓冲 池未空 消费者便可以从缓冲池中取走一个消息 武汉理工大学华夏学院 操作系统原理 课程设计说明书 5 2 2 程序流程图 生产一条数据 是否可用 存储单元 是否可用 存入一条数据 归还使用权 数据单元加 1 唤醒一个消费者 等待资源 阻塞 被唤醒 等待使用权 阻塞 被唤醒 无 有 否 图 2 1 生产者流程图 6 是否有数 据单元 是否可用 取走一条数据 归还使用权 空单元加 1 唤醒 一个生产者 消费数据 等待资源 阻塞 被唤醒 等待使用权 阻塞 被唤醒 有 是 否 图 2 2 消费者流程图 武汉理工大学华夏学院 操作系统原理 课程设计说明书 7 第 3 章 详细设计 3 1 数据结构 define N 2 消费者或者生产者的数目 define M 10 缓冲数目 int in 0 生产者放置产品的位置 int out 0 消费者取产品的位置 int buff M 0 缓冲初始化为 0 开始时没有产品 sem t empty sem 同步信号量 当满了时阻止生产者放产品 sem t full sem 同步信号量 当没产品时阻止消费者消费 pthread mutex t mutex 互斥信号量 一次只有一个线程访问缓冲 int product id 0 生产者 id int prochase id 0 消费者 id 3 2 算法说明 3 2 1 同步机制原语算法 P 进程不能往 满 的缓冲区中放产品 设置信号量为 sem empty Q 进程不能从 空 的缓冲区中取产品 设置信号量为 sem full 先设置信号量 sem empty 初值为 1 sem full 初值为 0 实现原语如下 P Q While true while true 生产一个产品 P sem full P Sem empty 从缓冲区去产品 送产品到缓冲区 V sem empty V sem full 消费产品 P 原语操作的主要动作是 1 sem 减 1 8 2 若 sem 减 1 后仍大于或等于零 则进程继续执行 3 若 sem 减 1 后仍小于零 则该进程被阻塞后与该信号所对应的队列中 然后 转入进程调度 V 原语操作的主要动作时 1 Sem 加 1 2 若相加结果大于零 3 若相加结果小于或者等于零 则从该信号的等待队列中唤醒一等待队列 然 后再返回原进程继续执行或转入进程调度 3 2 2 具体算法实现 Semaphore mutex 1 定义互斥信号量 Semaphore empty n 定义同步信号量 Semaphore full 0 item n 定义缓冲池 Int in 0 生产者放置位置 Int out 0 消费者放置位置 Producer 生产者 While true Produce an item in next product 生产者产生数据 Swait empty mutex 等待缓冲区空信号量 Array in next product 将数据放入缓冲池 In in 1 n Ssignal mutex full Consumer 消费者 While true Swait full mutex 等待缓冲池满信号量 Next consumer array out 从缓冲池取出数据 Out out 1 n Ssignal mutex empty Consume the product in next consumer 等待下一个消费者取出数 据 武汉理工大学华夏学院 操作系统原理 课程设计说明书 9 3 3 具体程序实现 3 3 1 生产者方法 在生产者方法的实现中 先产生一个数据 然后判断缓冲池空信号量 如 果缓冲池至少有一个为空则将先将缓冲池上锁 然后将数据放入缓冲池 将放 入数据位置指针后移 放入数据后将缓冲池解锁 如果缓冲池为满 则生产者 线程进入阻塞状态 进入进程调度队列 并等待缓冲池空信号量 生产者方法 void product int id product id while 1 用 sleep 的数量可以调节生产和消费的速度 便于观察 sleep 1 sleep 1 sem wait 等待缓冲池空信号量 pthread mutex lock 对缓冲池上锁 in in M printf product d in d like t id in 显示生产者 ID buff in 1 将数据放入缓冲区 print 打印存数结果 in 写入位置指针后移 pthread mutex unlock 对缓冲池解锁 sem post 等待缓冲池满信号量 3 3 2 消费者方法 在消费者方法实现中 首先判断缓冲池满信号量 如果缓冲池中不为空 则进行取数操作 并对缓冲池上锁 取数后 显示消费者 ID 随后对缓冲池解 锁 如果缓冲池为空 则不对缓冲池操作 消费者线程进入阻塞状态 进入线 程调度队列 消费者方法 10 void prochase int id prochase id while 1 用 sleep 的数量可以调节生产和消费的速度 便于观察 sleep 1 sleep 1 sem wait 等待缓冲池满指针 pthread mutex lock 对缓冲池上锁 out out M printf prochase d in d like t id out 答应消费者 ID buff out 0 print 答应信息 out 取数指针后移 pthread mutex unlock 对缓冲池解锁 sem post 3 3 3 多线程实现 在线程的创建时 可以用函数 pthread create 用来创建一个线程 它的原 型为 int pthread create P pthread t thread const pthread attr t attr void start routine void void arg 第一个参数为指向线程标识符的指针 第二个参数用来设置线程属性 第 三个参数是线程运行函数的起始地址 最后一个参数是运行函数的参数 这里 我们的函数 thread 不需要参数 所以最后一个参数设为空指针 第二个参数我 们也设为空指针 这样将生成默认属性的线程 函数 pthread join 用来等待一个线程的结束 函数原型为 extern int pthread join P pthread t th void thread return 第一个参数为被等待的线程标识符 第二个参数为一个用户定义的指针 它可以用来存储被等待线程的返回值 这个函数是一个线程阻塞的函数 调用 它的函数将一直等待到被等待的线程结束为止 当函数返回时 被等待线程的 资源被收回 武汉理工大学华夏学院 操作系统原理 课程设计说明书 11 一个线程的结束有两种途径 一种是象我们上面的例子一样 函数结束了 调用它的线程也就结束了 另一种方式是通过函数 pthread exit 来实现 它的 函数原型为 extern void pthread exit P void retval attribute noreturn 唯一的参数是函数的返回代码 只要 pthread join 中的第二个参数 thread return 不是 NULL 这个值将被传递给 thread return 最后要说明的 是 一个线程不能被多个线程等待 否则第一个接收到信号的线程成功返回 其余调用 pthread join 的线程则返回错误代码 ESRCH 创建 N 个生产者线程 for i 0 i N i ret i pthread create 将生产者方法创建成线程 if ret i 0 printf product d creation failed n i 打印线程创建信息 exit 1 创建 N 个消费者线程 for i 0 i N i ret i pthread create 将消费 者方法创建成线程 if ret i 0 printf prochase d creation failed n i 打印消费者线程创建 信息 exit 1 销毁线程 for i 0 i N i pthread join id1 i NULL pthread join id2 i NULL exit 0 12 第 4 章 程序运行结果和分析 4 1 运行结果 4 2 结果分析 从运行结果截图中可以看到 程序创建了 5 个生产者线程 4 个消费者线 程 每次生产者线程产生一个数据并存入缓冲池中 每次消费者线程从缓冲池 中取出一个数 并且在每次生产者线程产生数据和消费者取出数据后都打印缓 冲区中的数据 武汉理工大学华夏学院 操作系统原理 课程设计说明书 13 第 5 章 总结与体会 经过快一个星期的努力 终于完成了这个课程设计 从刚开始看到这个课 程设计题目时的毫无头绪到最后实现算法和完成课程设计报告 遇到了很多的 困难 在平时操作系统的课上 老师也是主要讲解操作系统的原语算法和实现原 理 没有用具体语言实现 突然要求我们用一门具体语言实现生产者消费者算 法 一时有点举手无措的感觉 但是后来通过自己仔细分析课程设计要求 发 现课程设计的算法其实可以分为几个模块 并且每个模块都有很大的联系 比 如生产者的实现和消费的实现就是信号量的操作不同 于是自己下去后通过仔 细学习关于生产者消费者算法的实现和机制 终于理解了生产者消费者算法实 现的难点和关键 并通过在图书馆和网上查阅资料 也对用 Linux C 实现生产 者消费者算法有了一点大概的思路 在后来的实现算法的过程中也遇到了很多的困难 比如在算法中对两个信 号量的操作和多线程的实现 通过对 Linux C 的学习 我也知道了一些 Linux C 的信号量操作函数和信号量上锁函数 还有多线程操作中的创建线程和销毁 线程的函数 通过认真学习相关函数的调用方法和参数传递方法 终于解决了 设计中的困难 通过这次课程设计 自己也是受益匪浅 因为平时学到的大部分都是理论 知识 而课程设计就是将我们的理论应用到实践的过程 通过这个过程 也让 我们锻炼了自己的动手能力 也加深了我们对理论知识的理解 提高了我们对 操作系统这门课程的认识和理解 也加强了我们的学习效果 14 附录 源程序 include include include include include define N 2 消费者或者生产者的数目 define M 10 缓冲数目 int in 0 生产者放置产品的位置 int out 0 消费者取产品的位置 int buff M 0 缓冲初始化为 0 开始时没有产品 sem t empty sem 同步信号量 当满了时阻止生产者放产品 sem t full sem 同步信号量 当没产品时阻止消费者消费 pthread mutex t mutex 互斥信号量 一次只有一个线程访问缓冲 int product id 0 生产者 id int prochase id 0 消费者 id 打印缓冲情况 void print int i for i 0 i M i printf d buff i printf n 生产者方法 void product int id product id while 1 用 sleep 的数量可以调节生产和消费的速度 便于观察 sleep 1 sleep 1 sem wait pthread mutex lock in in M printf product d in d like t id in buff in 1 print in 武汉理工大学华夏学院
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 感冒中医和西医分类治疗培训课件
- 急救护理核心知识与技能
- 2025年中国液体酒精炉市场调查研究报告
- 2025年中国手动铝棒锯市场调查研究报告
- 2025年中国双模块干线延长放大器市场调查研究报告
- 视光诊所运营管理
- 呼吸内科专科护理课件
- 呵护友谊班会课件
- 生物束带术后护理
- 2025至2030年中国高铝粘土制品行业发展研究报告
- 2022 年全国职业院校技能大赛(中职组)网络安全赛项赛题网络安全竞赛试题9
- 雪地里的小画家说课稿(已经获奖)课件
- 07FD02防空地下室电气设备安装图集
- 2022年北京控股集团有限公司招聘笔试题库及答案解析
- 新生儿预防接种的标准及注意事项
- 手足口病护理查房ppt
- 派出所辖区治安形势分析报告(通用6篇)
- 部编版四年级下册语文第七单元习作指导 课件 (共10张PPT)
- 图书捐赠记录表
- 英文学术报告范例-文档资料
- 广东省广州市天河区人民法院
评论
0/150
提交评论