




免费预览已结束,剩余9页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 1 操作系统课程设计 生 产 者 和 消 费 者 学生姓名 学生学号 班 级 0311401 02 03 04 班制 二 一三年十二月 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 2 1 课程题目分析 这个题目是生产者向消费者提供商品 消费者消耗商品 并且两组人共用 同一缓冲区 生产者提供了商品之后消费者才能去取商品 消费者若不取走商 品则当缓冲区用完之后生产者则不能再向缓冲区中添加新的商品 思考问题 1 对于生产者进程 每产生一个数据 则需去访问共用缓冲区是否有已 满 未满则可以将该数据存入并通知消费者进程 否则不能 2 对于消费者进程 每当想去消费 取出数据 时 则需访问缓冲区是 否为空 为空则不能消费 取出数据 否则可以取 并通知生产者 3 缓冲区是个临界资源 所有的进程对于该空间都是共享的 所以 还 有互斥问题存在 2 课程设计目的 通过实验模拟生产者与消费者之间的关系 了解并掌握他们之间的关系及 原理 由此增加对进程同步问题的了解 1 掌握基本的同步互斥算法 理解生产者与消费者模型 2 了解 windows 中多线程 多进程 的并发执行机制 线程 进程 间 的同步于互斥 3 学习使用 windows 中基本的同步对象 掌握相应的 API 3 课程设计内容 有 n 个生产者和 m 个消费者 连接在具有 k 个单位缓冲区的有界环转缓冲 上 故又称有界缓冲问题 其中 Pi和 Cj都是并发进程 只要缓冲区未满 生产 者进程 Pi所生产的产品就可投入缓冲区 类似地 只要缓冲区非空 消费者进 程 Cj就可以从缓冲区取走并消耗产品 4 开发环境 操作系统 Windows 系统 编写语言 C 语言 5 系统分析设计 1 算法原理 生产者 消费者问题是典型的进程同步问题 这些进程必须按照一定的 生产率和消费率来访问共享缓冲区 用 P V 操作解决生产者和消费者共享单缓 冲区的问题 可设置两个信号量 empty 和 full 其初值分别为 1 和 0 empty 指示能否向缓冲区放入产品 full 指示能否从缓冲区取出产品 为了使其协调 工作 必须使用一个信号量 mutex 初值为 1 以限制生产者和消费者互斥地 对缓冲区进行存取 另用两个信号量 empty1 初值为缓冲区大小 和 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 3 full1 初值为 0 以保证生产者不向已满的缓冲区中放入产品 消费者不从 空缓冲区中取产品 2 功能描述 生产者功能描述 在同一个进程地址空间内执行两个线程 生产者线程生 产物品 然后将物品放置在一个空缓冲区中供消费者线程消费 当生产者线程 生产物品时 如果没有空缓冲区可用 那么生产者线程必须等待消费者线程释 放出一个空缓冲区 消费者功能描述 消费者线程从缓冲区获得物品 然后释放缓冲区 当消 费者线程消费物品时 如果没有满的缓冲区 那么消费者线程将被阻塞 直到 新的物品被生产出来 3 算法流程图 生产者流程图 消费者流程图 总的流程图 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 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 cout 成功退出程 序 endl i 5 N N delete b 键盘输入数值改变n 的值 b new SeqSquare n YYY N cout 请输入正 确的菜单项进行 操作 P 1 void consumer SeqSquare a 消费者操作 a V 1 缓冲区显示 void showbuf SeqSquare a int i a getSize 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 6 3 在实现本程序的生产者消费者模型时 具体地通过以下同步对象实现互斥 设一个互斥量 Mutex 以实现生产者在查询和保留缓冲区的下一个空位 置时进行互斥 每一个生产者用一个信号量与消费者同步 通过设置 Full 实现 该组信 号量用于表示相应产品以生产 同时用一个表示空缓冲区数目的信号量 Empty 进行类似的同步 指示缓冲区中是否存在空位置 以便开始生产下一个产品 4 调试过程 为解决生产者 消费者问题 应该设置两个资源信号量 其中一个表示空 缓冲区的数目 用 Full 表示 其初值为用户输入的缓冲区的大小 另一个表示 缓冲区中产品的数目 用 Empty 表示 其初值为 0 另外 由于缓冲区是一个临 界资源 必须互斥使用 所以还需要再设置一个互斥信号量 Mutex 其初值为 1 在生产者 消费者问题中 信号量实现两种功能 首先 他是生产产品和 消费产品的计数器 计数器的初值是可使用的资源数目 缓冲区的长度 其次 他是确保产品的生产者和消费者之间的动作同步的同步器 生产者要生产一个产品时 首先对资源信号量 Full 和互斥信号量 Mutex 进 行 P 操作 申请资源 如果可以通过的话 就生产一个产品 并把产品送人缓 冲区 然后对互斥信号量 Mutex 和资源信号量 Empty 进行 V 操作 释放资源 消费者要消费一个产品时 首先对资源信号量 Empty 和互斥信号量 Mutex 进行 P 操作 申请资源 如果可以通过的话就从缓冲区取出一个产品并消费掉 然后对互斥信号量 Mutex 和资源信号量 Full 进行 V 操作 释放资源 如果缓冲区中已经没有可用资源 就把申请资源的进程添加到等待队列的 队尾 如果有一个资源被释放 在等待队列中的第一个进程被唤醒并取得这个 资源的使用权 5 参考资料 操作系统教程 孙钟秀 高等教育出版社 C 程序设计 谭浩强 高等教育出版社 6 运行实例及结果分析 1 运行实例 缓冲区大小为 3 先生产一件产品 显示缓冲区 再接着生产一件产品 消 耗一件产品 显示缓冲区 在消耗两件产品 再生产 4 件产品 改变缓冲区的 大小为 6 显示缓冲区 选择一个未出现的选项 退出程序 2 结果显示 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 7 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 8 3 结果分析 1 在每个程序中需要先做 P 后做 V 二者要成对出现 夹在二者中间 的代码段就是该进程的临界区 2 对同步信号量 full 和 empty 的 P V 操作同样必须成对出现 但它们 分别位于不同的程序中 3 无论在生产者进程中还是消费者进程中 两个 P 操作的次序不能颠倒 应先执行同步信号量的 P 操作 然后执行互斥信号量的 P 操作 否则可能造成 进程死锁 七 个人体验 虽然我也很想用 java 语言写这个程序 但是由于自己学艺不精 所以只能 用 C 写 通过这个实验我发现我以前有很多知识都忘记了 重新拿起课本学 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 9 习时发现原来很多不懂得问题都有了新的认识 有一种豁然开朗的感觉 也为 我考研开了一个好的开头 我认为我完成的这个设计做的比较出色的地方是对 C 语言中类以及数组 的运用 其实这里我对数组的操作是按照 先进先出 的方法进行运作的 这 是参考了栈的工作原理 因为缓冲区一般也是堆栈 比较符合设计要求 这次实验中我感觉做的很粗糙 自己所想的模拟过程的确得到实现了 但 是感觉灵活性不太高 思考还不过全面 应该以后多注意一下 多考虑考虑才 是 在这次实验中我重新将 C 程序设计 和 数据结构 的几个重要章节复 习了一遍 对类 数组 C 的 I O 流类库以及堆栈的语句格式 注意细节都再 一次熟悉 感觉蛮有趣的 不过 在编程过程中许多语句的小问题还真是出现 不少 而且感觉自己对 C 强大丰富的语句方法用得太呆板 不够灵活 总是 想到那些常用的 而忽略了颗粒让语句更简短的方法 以后要多多注意才是 8 附录 生产者消费者1 cpp Defines the entry point for the console application include stdafx h include iostream using namespace std class SeqSquare public SeqSquare int n SeqSquare void P int x p操作 void V int x v操作 bool IsEmpty 判断是否为空 bool IsFull 判断是否已满 void deca void decb int getSize int getmaxSize int gettop int geta int getb protected private int elements int top a b maxSize 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 10 bool SeqSquare IsEmpty 判断是否为空 return top 1 true false bool SeqSquare IsFull 判断是否已满 return top maxSize 1 true false void SeqSquare deca a void SeqSquare decb b int SeqSquare getSize return top 1 int SeqSquare getmaxSize return maxSize int SeqSquare gettop return top int SeqSquare geta return a int SeqSquare getb 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 11 return b SeqSquare SeqSquare int n top 1 a b 0 maxSize n elements new int maxSize void SeqSquare P int x if IsFull true a a 1 else elements top x void SeqSquare V int x if IsEmpty true b b 1 else x elements top 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 12 void producer SeqSquare a 生产者操作 a P 1 void consumer SeqSquare a 消费者操作 a V 1 SeqSquare SeqSquare delete elements 缓冲区显示 void showbuf SeqSquare a int i a getSize int main int i n cout 请输入缓冲区大小 n SeqSquare s s new SeqSquare n while i 4 cout 请选择操作 endl cout 1 生产一件产品 2 消费一件产品 endl cout 3 显示缓冲区 4 退出系统 endl cout 5 需要改变缓冲区大小 i switch i case 1 producer s if s geta 0 湖北民族学院信息工程学院 11 级计算机专业操作系统课程设计 13 cout endl 成功生产一件商品 endl endl else cout endl 没有空间供生产者生产 endl deca break case 2 consumer s if s getb 0 cout endl 成功消费一件商品 endl endl else cout endl 没有产品供消费者消费 endl endl break case 3 showbuf s cout endl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年学历类自考中国行政史-机关管理参考题库含答案解析(5卷)
- 2025年学历类自考中国现代文学作品选-法学概论参考题库含答案解析(5卷)
- 出国正规合同(标准版)
- 教师招聘之《小学教师招聘》考前冲刺练习附答案详解(b卷)
- 2025泰隆银行面试题目及答案
- 2025年学历类自考中国古代文学史(一)-学前儿童保育学参考题库含答案解析(5卷)
- 2025年学历类自考中国古代文学作品选(二)-财务管理学参考题库含答案解析(5卷)
- 2025年学历类自考中国古代文学作品选(二)-学前教育研究方法参考题库含答案解析(5卷)
- 2025思修自考试题及答案
- 2025-2030中国地漏市场供需前景预测及销售渠道规划报告
- 交通运输行业安全生产检查表模板
- 中成药合理使用培训课件
- 贷款熔断管理办法
- 设备设施运行台账教学幻灯片
- 封路店铺经营补偿方案
- 职业病危害事故救援应急预案
- 2025深入贯彻中央八项规定精神学习教育测试题和答案
- 医生进基层活动方案
- 2025-2030年中国蔬果保鲜剂行业市场深度调研及发展趋势与投资价值评估研究报告
- 云南省土地征收农用地转用审批管理细则 (2023年修订)
- 2024年长庆油田分公司招聘考试真题
评论
0/150
提交评论