操作系统生产者与消费者问题实验报告材料.pdf

上传人:l*** 文档编号:80848625 上传时间:2023-03-23 格式:PDF 页数:6 大小:174.45KB
返回 下载 相关 举报
操作系统生产者与消费者问题实验报告材料.pdf_第1页
第1页 / 共6页
操作系统生产者与消费者问题实验报告材料.pdf_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《操作系统生产者与消费者问题实验报告材料.pdf》由会员分享,可在线阅读,更多相关《操作系统生产者与消费者问题实验报告材料.pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、.操作系统实验报告 生产者和消费者的问题 一、实验目的 1.掌握根本的同步与互斥的算法,理解根本的生产者与消费者的模型.2.学习使用 Windows 2000/XP 中根本的同步对象,掌握相关的 API 的使用方法.3.了解 Windows 2000/XP 中多线程的并发执行机制,线程间的同步和互斥.二、实验的内容与其要求 1.实验内容 以生产者/消费者模型为根据,在 Windows 2000 环境下创建一个控制台进程,在改良程中创建 n 个线程模拟生产者和消费者,实现进程线程的同步与互斥.2实验要求 学习并理解生产者/消费者模型与其同步/互斥规如此 学习了解 Windows 同步对象与其特性

2、 熟悉实验环境,掌握相关 API 的使用方法 设计程序,实现生产者/消费者进程线程的同步与互斥 提交实验报告 三、实验的时间安排 1 实验前,先到图书馆或上网百度了解有关生产者/消费者模型的相关知识,建立生产者/消费者模型的根本概念.2 利用 13 周、15 周、17 周的上机时间编写和调试程序代码.3 利用其他课余时间来分析实验的最终结果并完成相关的实验报告.四、实验的环境 1.硬件条件:普通计算机一台 2.软件条件:操作系统:Windows 2000/XP 开发语言:VC+本实验是在 Windows 2000+VC6.0 环境下实现的,利用 Windows SDK 提供的系统接口API完成

3、程序的功能.实验在 Windows 下安装 VC 后进展,因为 VC 是一个集成开发环境,其中包含了 Windows SDK 所有工具和定义,所以安装了 VC 后就不用特意安装 SDK 了.实验中所用的 API应用程序接口,是操作系统提供的用来进展应用程序设计的系统功能接口.要使用这些 API,需要包含对这些函数进展说明的 SDK 头文件,最常见的就是 windows.h.一些特殊的 API 调用还需要包含其他的头文件.五、正文 1 程序结构图:2.数据结构:1用一个整型数组Buffer_Critical 来代表缓冲区.不管是生产产品还是对已有产品的消费都需要访问改组缓冲区.2在程序中用一个自

4、定义结构 ThreadInfo 记录一条线程的信息,即将测试用例文件中的一行信息记录下来,用于程序创建相应的生产者或者消费者.由于要创建多个线程,所以程序中使用了一个 ThreadInfo 结构的数组 Thread_Info.在实现本程序的消费生产模型时,具体地通过如下同步对象实现互斥:设一个互斥量h_mutex,以实现生产者在查询和保存缓冲区内的下一个空位置时进展互斥.每一个生产者.用一个信号量与其消费者同步,通过设置 h_SemaphoreMAX_THREAD_NUM信号量数组实现,该组信号量用于表示相应产品已生产.同时用一个表示空缓冲区数目的信号量empty_semaphore进展类似的

5、同步,指示缓冲区中是否存在空位置,以便开始生产下一个产品.每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥,这通过设置临界区对象数组PC_CriticalMAX_BUFFER_NUM实现.3.实验步骤:1 打开VC,选择菜单项File-New,选择Projects 选项卡并建立一个名为 R_WP1的win32 console application工程,创建时注意指定创建该工程的目录.2在工程中创建源文件 R_WP1.cpp:选择菜单项 Project-Add to project-Files,此时将打开一个新窗口,在其中的文件名输入栏中输入自己想要创建的文件名,这里是 R_WP1.c

6、pp;接着询问是否创建新文件时回答yes.通过 Workspace-Source Files 打开该文件,在其中编辑源文件并保存.3 通过调用菜单项 Build-Rebuild all 进展编译连接,可以在指定的工程目录下得到 debug-R_WP1.exe 程序,然后把给定的 test.txt 文件存入该 debug 目录下,就可以在控制台进入该 debug 目录运行程序了.需要强调的是:在创建数据文件时,由于涉与文件的格式问题,最好在记事本中手工逐个输入数据,而不要用复制和粘贴数据.4.实验源代码:/*R_WP1.cpp*#include#include#include#include#i

7、nclude/定义一些常量/本程序允许的最大临界区数#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_requestMAX_THREAD_NUM;int n_request;CRITICAL_SECTION PC_CriticalMAX_BUFFER_NUM;

8、int Buffer_CriticalMAX_BUFFER_NUM;HANDLE h_ThreadMAX_BUFFER_NUM;ThreadInfo Thread_InfoMAX_THREAD_NUM;HANDLE empty_semaphore;HANDLE h_mutex;.DWORD n_Thread=0;DWORD n_Buffer_or_Critical;HANDLE h_SemaphoreMAX_THREAD_NUM;void Produce;void Consume;bool IfInOtherRequest;int FindProducePosition;int FindBuf

9、ferPositon;int main DWORD wait_for_all;ifstream inFile;forint i=0;i Buffer_Criticali=-1;forint j=0;j forint k=0;k Thread_Infoj.thread_requestk=-1;Thread_Infoj.n_request=0;fori=0;i InitializeCriticalSection;inFile.open;inFilen_Buffer_or_Critical;inFile.get;printf;printf%dn,n_Buffer_or_Critical;while

10、inFileThread_Infon_Thread.serial;inFileThread_Infon_Thread.entity;inFileThread_Infon_Thread.delay;char c;inFile.get;whilec!=n&!inFile.eof inFile Thread_Infon_Thread.thread_requestThread_Infon_Thread.n_request+;inFile.get;n_Thread+;forj=0;jn_Thread;j+int Temp_serial=Thread_Infoj.serial;char Temp_enti

11、ty=Thread_Infoj.entity;double Temp_delay=Thread_Infoj.delay;printf;.int Temp_request=Thread_Infoj.n_request;forint k=0;k printf;coutendl;printf;empty_semaphore=CreateSemaphore ;h_mutex=CreateMutex;forj=0;jn_Thread;j+std:string lp=semaphore_for_produce_;int temp=j;while char c=;lp+=c;temp/=10;h_Semap

12、horej+1=CreateSemaphoreNULL,0,n_Thread,lp.c_str;fori=0;in_Thread;i+if h_Threadi=CreateThreadNULL,0,&,0,NULL;else h_Threadi=CreateThreadNULL,0,&,0,NULL;wait_for_all=WaitForMultipleObjects;printf;_getch;return 0;bool IfInOtherRequest forint i=0;i forint j=0;j if return TRUE;return FALSE;int FindProduc

13、ePosition int EmptyPosition;forint i=0;i.if EmptyPosition=i;Buffer_Criticali=-2;break;return EmptyPosition;int FindBufferPosition int TempPos;forint i=0;i if TempPos=i;break;return TempPos;void Produce DWORD wait_for_semaphore,wait_for_mutex,m_delay;int m_serial;m_serial=-serial;m_delay=-delay *INTE

14、_PER_SEC;Sleep;printf;wait_for_semaphore=WaitForSingleObject;int ProducePos=FindProducePosition;ReleaseMutex;printf;Buffer_CriticalProducePos=m_serial;printf;printf;ReleaseSemaphore;void Consume DWORD wait_for_semaphore,m_delay;int m_serial,m_requestNum;int m_thread_requestMAX_THREAD_NUM;m_serial=-s

15、erial;m_delay=-delay*INTE_PER_SEC;m_requestNum=-n_request;forint i=0;i.m_thread_requesti=-thread_requesti;Sleep;fori=0;i printf;wait_for_semaphore=WaitForSingleObject;int BufferPos=FindBufferPosition;EnterCriticalSection;printf;-thread_requesti=-1;if!IfInOtherRequest Buffer_CriticalBufferPos=-1;prin

16、tf;ReleaseSemaphore;else printf;LeaveCriticalSection;5.实验运行结果:其中的实验数据是:3 1 p 5 2 p 4 3 p 2 4 c 3 1 3 2 6.实验结果分析:1在每个程序中需要先做 P,后做 V,二者要成对出现,夹在二者中间的代码段就是该进程的临界区.2对同步信号量 full 和 empty 的 P,V 操作同样必须成对出现,但它们分别位于不同的程序中.3无论在生产者进程中还是消费者进程中,两个 P 操作的次序不能颠倒:应先执行同步信号量的P 操作,然后执行互斥信号量的 P 操作.否如此可能造成进程死锁.六、实验总结 1.通过本次实验,了解到生产者/消费者问题是一个经典的进程同步问题,以与在其中使用信号量机制,生产者与消费者问题要求我们设计在同一个进程地址空间内执行的两个线程.2.通过本次实验,加深了我对操作系统中多线程机制的理解和认识,更让我认识到知识的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能更好地理解和分析问题.3通过本次实验,发现自己在编程上与一些函数的认识仍存在较大的问题,日后会不断加深各方面知识的学习,弥补自己的不足.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁