




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 操作系统操作系统 实验报告实验报告 生产者和消费者的问题生产者和消费者的问题 一 一 实验目的实验目的 1 掌握基本的同步与互斥的算法 理解基本的生产者与消费者的模型 2 学习使用 Windows 2000 XP 中基本的同步对象 掌握相关的 API 的使用方法 3 了解 Windows 2000 XP 中多线程的并发执行机制 线程间的同步和互斥 二 二 实验的内容及其要求实验的内容及其要求 1 实验内容实验内容 以生产者 消费者模型为根据 在 Windows 2000 环境下创建一个控制台进程 在改进程中创建 n 个线程模 拟生产者和消费者 实现进程 线程 的同步与互斥 2 实验要求实验要求 学习并理解生产者 消费者模型及其同步 互斥规则 学习了解 Windows 同步对象及其特性 熟悉实验环境 掌握相关 API 的使用方法 设计程序 实现生产者 消费者进程 线程 的同步与互斥 提交实验报告 三 三 实验的时间安排实验的时间安排 1 实验前 先到图书馆或上网百度了解有关生产者 消费者模型的相关知识 建立生产者 消费者模型的 基本概念 2 利用 13 周 15 周 17 周的上机时间编写和调试程序代码 3 利用其他课余时间来分析实验的最终结果并完成相关的实验报告 四 四 实验的环境实验的环境 1 硬件条件 普通计算机一台 2 软件条件 操作系统 Windows 2000 XP 开发语言 VC 本实验是在 Windows 2000 VC6 0 环境下实现的 利用 Windows SDK 提供的系统接口 API 完成程序的 功能 实验在 Windows 下安装 VC 后进行 因为 VC 是一个集成开发环境 其中包含了 Windows SDK 所 有工具和定义 所以安装了 VC 后就不用特意安装 SDK 了 实验中所用的 API 应用程序接口 是操作 系统提供的用来进行应用程序设计的系统功能接口 要使用这些 API 需要包含对这些函数进行说明的 SDK 头文件 最常见的就是 windows h 一些特殊的 API 调用还需要包含其他的头文件 五 五 正文正文 1 程序结构图 程序结构图 2 2 数据结构 数据结构 1 用一个整型数组 Buffer Critical 来代表缓冲区 不管是生产产品还是对已有产品的消费都需要访问改 组缓冲区 2 在程序中用一个自定义结构 ThreadInfo 记录一条线程的信息 即将测试用例文件中的一行信息记录 下来 用于程序创建相应的生产者或者消费者 由于要创建多个线程 所以程序中使用了一个 ThreadInfo 结构的数组 Thread Info 3 在实现本程序的消费生产模型时 具体地通过如下同步对象实现互斥 设一个互斥量 h mutex 以实现生产者在查询和保留缓冲区内的下一个空位置时进行互斥 每一个生产 者用一个信号量与其消费者同步 通过设置 h Semaphore MAX THREAD NUM 信号量数组实现 该组信 号量用于表示相应产品已生产 同时用一个表示空缓冲区数目的信号量 empty semaphore 进行类似的同步 指示缓冲区中是否存在空位置 以便开始生产下一个产品 每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥 这通过设置临界区对象数组 PC Critical MAX BUFFER NUM 实现 3 实验步骤 实验步骤 1 打开 VC 选择菜单项 File New 选择 Projects 选项卡并建立一个名为 R WP1 的 win32 console application 工程 创建时注意指定创建该工程的目录 2 在工程中创建源文件 R WP1 cpp 选择菜单项 Project Add to project Files 此时将打开一个新窗口 在其中的 文件名 输入栏中输入自己想要创建的文件名 这里是 R WP1 cpp 接着询问是否创建新文件 时回答 yes 通过 Workspace Source Files 打开该文件 在其中编辑源文件并保存 3 通过调用菜单项 Build Rebuild all 进行编译连接 可以在指定的工程目录下得到 debug R WP1 exe 程序 然后把给定的 test txt 文件存入该 debug 目录下 就可以在控制台进入该 debug 目录运行程序了 需 3 要强调的是 在创建数据文件时 由于涉及文件的格式问题 最好在记事本中手工逐个输入数据 而不要 用复制和粘贴数据 4 实验源代码 实验源代码 R WP1 cpp include include include include include 定义一些常量 本程序允许的最大临界区数 define MAX BUFFER NUM 10 秒到微秒的乘法因子 define INTE PER SEC 1000 本程序允许的生产和消费线程的总数 define MAX THREAD NUM 64 定义一个结构 记录在测试文件中指定的每一个线程的参数 struct ThreadInfo int serial char entity double delay int thread request MAX THREAD NUM int n request CRITICAL SECTION PC Critical MAX BUFFER NUM int Buffer Critical MAX BUFFER NUM HANDLE h Thread MAX BUFFER NUM ThreadInfo Thread Info MAX THREAD NUM HANDLE empty semaphore HANDLE h mutex DWORD n Thread 0 DWORD n Buffer or Critical HANDLE h Semaphore MAX THREAD NUM void Produce void p void Consume void p bool IfInOtherRequest int int FindProducePosition 4 int FindBufferPositon int int main void DWORD wait for all ifstream inFile for int i 0 i MAX THREAD NUM i Buffer Critical i 1 for int j 0 j MAX THREAD NUM j for int k 0 k MAX THREAD NUM k Thread Info j thread request k 1 Thread Info j n request 0 for i 0 i n Buffer or Critical inFile get printf 输出文件是 n printf d n int n Buffer or Critical while inFile inFile Thread Info n Thread serial inFile Thread Info n Thread entity inFile Thread Info n Thread delay char c inFile get c while c n inFile get c n Thread for j 0 j int n Thread j int Temp serial Thread Info j serial 5 char Temp entity Thread Info j entity double Temp delay Thread Info j delay printf n thread 2d c f Temp serial Temp entity Temp delay int Temp request Thread Info j n request for int k 0 k Temp request k printf d Thread Info j thread request k cout endl printf n n empty semaphore CreateSemaphore NULL n Buffer or Critical n Buffer or Critical semaphore for empty h mutex CreateMutex NULL FALSE mutex for update for j 0 j int n Thread j std string lp semaphore for produce int temp j while temp char c char temp 10 lp c temp 10 h Semaphore j 1 CreateSemaphore NULL 0 n Thread lp c str for i 0 i int n Thread i if Thread Info i entity P h Thread i CreateThread NULL 0 LPTHREAD START ROUTINE Produce else h Thread i CreateThread NULL 0 LPTHREAD START ROUTINE Consume wait for all WaitForMultipleObjects n Thread h Thread TRUE 1 printf Press any key to quit n getch return 0 bool IfInOtherRequest int req 6 for int i 0 i n Thread i for int j 0 j Thread Info i n request j if Thread Info i thread request j req return TRUE return FALSE int FindProducePosition int EmptyPosition for int i 0 i n Buffer or Critical i if Buffer Critical i 1 EmptyPosition i Buffer Critical i 2 break return EmptyPosition int FindBufferPosition int ProPos int TempPos for int i 0 iserial m delay DWORD ThreadInfo p delay INTE PER SEC Sleep m delay printf Producer 2d sends the produce require n m serial 7 wait for semaphore WaitForSingleObject h mutex 1 int ProducePos FindProducePosition ReleaseMutex h mutex printf Producer 2d begin to produce at position 2d n m serial ProducePos Buffer Critical ProducePos m serial printf Producer 2d finish producing n m serial printf position 2d 3d n ProducePos Buffer Critical ProducePos ReleaseSemaphore h Semaphore m serial n Thread NULL void Consume void p DWORD wait for semaphore m delay int m serial m requestNum int m thread request MAX THREAD NUM m serial ThreadInfo p serial m delay DWORD ThreadInfo p delay INTE PER SEC m requestNum ThreadInfo p n request for int i 0 ithread request i Sleep m delay for i 0 ithread request i 1 if IfInOtherRequest m thread request i Buffer Critical BufferPos 1 printf position 2d 3d n BufferPos Buffer Critical BufferPos ReleaseSemaphore empty semaphore 1 NULL else 8 printf Consumer 2d finish consuming product 2d n m serial m thread request i LeaveCriticalSection 5 实验运行结果 实验运行结果 其中的实验数据是 3 1 p 5 2 p 4 3 p 2 9 4 c 3 1 3 2 6 实验结果分析 实验结果分析 1 在每个程序中需要先做 P 后做 V 二者要成对出现 夹在二者中间的代码段就是该进程的临界区 2 对同步信号量 full 和 empty 的 P V 操作同样必须成对出现 但它们分别位于不同的程序中 3 无论在生产者进程中还是消费者进程中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 相机租赁合同范本英文
- 食堂员工聘用合同范本
- 塑料成品模具合同范本
- 钢管产品订货合同范本
- 企业招聘中介合同范本
- 众筹合同范本
- 武装押运租车合同范本
- 衣柜拆装服务合同范本
- 单位音响租赁合同范本
- 承包羊舍建设合同范本
- 苏州银行总行信息科技部招聘考试真题2022
- 安装电工电气调试员安全技术操作规程
- 2乳的验收与预处理解析
- 三峡大学级本科电气工程及其自动化二本培养方案
- 柴芍六君子汤加减治疗脾胃病三则
- GB/T 778.1-2018饮用冷水水表和热水水表第1部分:计量要求和技术要求
- GB/T 11547-2008塑料耐液体化学试剂性能的测定
- 伤口造口新进展课件
- (完整版)人工智能介绍课件
- 恶性骨肿瘤化疗及注意事项(58张幻灯片)课件
- 国有企业采购规范和示范文本
评论
0/150
提交评论