版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE1课程设计报告课程名称:操作系统课程设计设计题目:生产者消费者问题系别:计算机系专业:计算机科学与技术组别:第二组学生姓名:学号起止日期:2010年7月18日~2010年7月23日指导教师:
目录TOC\o"1-2"\h\u198221.概述 281471.1问题描述 2225701.2开发计划 217911.3开发环境及开发工具 3326702.需求分析 382802.1设计任务 342482.2设计思想 3128042.3设计要求 3314653.概要设计 4198883.1方法及原理 4281983.2流程图 478894.详细设计 53514.1数据结构及信号量说明 5153514.2部分代码 6260095.测试结果 971436.结果分析 10248467.总结和体会. 105204致谢 10386参考文献 101.概述1.1问题描述以生产者/消费者模型为依据,在WindowsXP环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。1.2开发计划第一天:完成整体的规划工作,用什么方法,能完成什么工作,如何设计构造方法;第二天:完成操作界面的设计与编码,设计一个美观,易于操作的界面;第三天:完成并发设计内核的结构与实现工作;第四天:基本完成程序设计工作;第五天:完成代码的优化工作,添加一些功能;第六天:完成实验报告;第七天:交给老师审核。1.3开发环境及开发工具硬件:普通PC386以上微机;一张软盘或U盘。软件:操作系统:Windows2000/XP。开发工具:VC++6.0。VC是一个集成开发环境,其中包含了WindowsSDK所有工具和定义。2.需求分析2.1设计任务(1)掌握基本的同步与互斥算法,理解生产者消费者模型。(2)学习使用Windows2000/XP中基本的同步对象,掌握相关API使用方法。(3)了解Windows2000/XP中多线程的并发执行机制,实现进程同步与互斥。2.2设计思想生产者—消费者问题是一种同步问题的抽象描述。计算机系统中的每个进程都可以消费或生产某类资源。当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。在同一时刻只能有一个生产者或一个消费者使用缓冲区,有互斥信号量可以控制各个生产者和消费者之间互斥,使得生产和消费的工作能够有序的进行,而不至于发生死锁。通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制有生产者线程和消费者线程之间的互斥关系来实现。2.3设计要求每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符。生产者和消费者各有两个以上。多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。3.概要设计3.1方法及原理1.阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制有深入理解。著名的生产者—消费者问题是典型的进程同步问题,操作系统中实现进程同步的常用机制有信号量和PV操作等。除赋初值外,信号量仅由同步原语P和V对其进行操作,PV操作的不分割性确保执行的原子性及信号量值的完整性。信号量按用途分两种:(1)公用信号量,用于实现进程互斥;(2)私有信号量,多用于并发进程同步。按取值又分两种:(1)两元信号量,主要用于解决进程互斥问题;(2)一般信号量,主要解决进程同步问题。2.掌握VisualC++6.0语言的使用。C++语言是从C语言发展演变的一种面向对象的程序设计语言,主要特点变现在两方面:一是全面兼容C;二是支持面向对象的方法。面向对象的方法将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分割的整体——对象。对同类型对象抽象出共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对象间通过消息进行通信。同时,通过继承与多态性,使程序具有很高的可重用性,使得软件的开发和维护都更为方便。3.2流程图输入数据输入数据创建“生产者”线程缓冲区是否阻塞N创建“消费者”线程Y“生产者”生产产品后被唤醒NY缓冲区是否为空“消费者”阻塞“生产者”等待,“消费者”取出缓冲区数据图3图3-1流程图4.详细设计4.1数据结构及信号量说明(1)程序中的主要的结构voidProduce(void*p);voidConsume(void*p); boolIfInOtherRequest(int);int FindProducePositon();int FindBufferPosition(int);intmain(void)(2)信号量定义如下:#defineMAX_BUFFER_NUM 10//本程序允许的最大临界区数;#defineINTE_PER_SEC1000//秒到微秒的乘法因子;#defineMAX_THREAD_NUM64//本程序允许的生产和消费线程的总数;intBuffer_Critical[MAX_BUFFER_NUM];//缓冲区声明,用于存放产品;HANDLEh_Thread[MAX_THREAD_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];//生产者允许消费者开始消费的信号量;4.2部分代码创建生产者和消费者线程 for(i=0;i<(int)n_Thread;i++){ if(Thread_Info[i].entity=='P') h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),&(Thread_Info[i]),0,NULL); else h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume), &(Thread_Info[i]),0,NULL); }生产者进程voidProduce(void*p){ //局部变量声明; DWORDwait_for_semaphore,wait_for_mutex,m_delay; int m_serial; //获得本线程的信息; m_serial=((ThreadInfo*)(p))->serial; m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC); Sleep(m_delay); //开始请求生产 printf("生产者%d发出生产请求...\n",m_serial); //确认有空缓冲区可供生产,同时将空位置数empty减1;用于生产者和消费者的同步; wait_for_semaphore =WaitForSingleObject(empty_semaphore,-1); //互斥访问下一个可用于生产的空临界区,实现写写互斥; wait_for_mutex=WaitForSingleObject(h_mutex,-1); intProducePos=FindProducePosition(); ReleaseMutex(h_mutex); //生产者在获得自己的空位置并做上标记后,以下的写操作在生产者之间可以并发; //核心生产步骤中,程序将生产者的ID作为产品编号放入,方便消费者识别; printf("生产者%d开始生产,并且把其产品放在位置%2d.\n",m_serial,ProducePos); Buffer_Critical[ProducePos]=m_serial; printf("生产者%2d生产完毕.\n",m_serial); printf("位置[%2d]:%3d\n",ProducePos,Buffer_Critical[ProducePos]); //使生产者写的缓冲区可以被多个消费者使用,实现读写同步; ReleaseSemaphore(h_Semaphore[m_serial],n_Thread,NULL);}消费者进程voidConsume(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(inti=0;i<m_requestNum;i++) m_thread_request[i]=((ThreadInfo*)(p))->thread_request[i];Sleep(m_delay); //循环进行所需产品的消费for(i=0;i<m_requestNum;i++){//请求消费下一个产品printf("消费者%2d要求消费%2d产品.\n",m_serial,m_thread_request[i]);//如果对应生产者没有生产,则等待;如果生产了,允许的消费者数目-1;实现了读写同步;wait_for_semaphore=WaitForSingleObject(h_Semaphore[m_thread_request[i]],-1);//查询所需产品放到缓冲区的号 intBufferPos=FindBufferPosition(m_thread_request[i]); //开始进行具体缓冲区的消费处理,读和读在该缓冲区上仍然是互斥的;//进入临界区后执行消费动作;并在完成此次请求后,通知另外的消费者本处请//求已经满足;同时如果对应的产品使用完毕,就做相应处理;并给出相应动作//的界面提示;该相应处理指将相应缓冲区清空,并增加代表空缓冲区的信号量;EnterCriticalSection(&PC_Critical[BufferPos]);printf("消费者%2d开始消费%2d产品...\n",m_serial,m_thread_request[i]);((ThreadInfo*)(p))->thread_request[i]=-1;if(!IfInOtherRequest(m_thread_request[i])){Buffer_Critical[BufferPos]=-1;//标记缓冲区为空; printf("消费者%2d消费完毕%2d.\n",m_serial,m_thread_request[i]); printf("位置[%2d]:%3d\n",BufferPos,Buffer_Critical[BufferPos]); ReleaseSemaphore(empty_semaphore,1,NULL); } else{printf("消费者%2d消费完毕%2d.\n",m_serial,m_thread_request[i]); }//离开临界区 LeaveCriticalSection(&PC_Critical[BufferPos]); }}5.测试结果图5-1测试结果图图5-1测试结果图其中测试数据是:21P12P23P34C4325C516.结果分析1、在每个程序中坐须先做P(mutex),后做V(mutex),二者要成对出现。夹在二者中间的代码段就是该进程的临界区。2、对同步信号量full和empty的P,V操作同样必须成对出现,但它们分别位于不同的程序中。3、无论在生产者进程中还是在消费者进程中,两个P操作的次序不能颠倒:应先执行同步信号量的P操作,然后执行互斥信号量的P操作。否则可能造成进程死锁。7.总结和体会.此系统中使用的是用VC++6.0实现的,由于我的经验不足及阅历颇浅,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 涉及打胎的孕妇离婚协议书(2025年版)6篇
- 二零二五版居民内地与香港离婚登记手续全程辅导合同3篇
- 2025年度个人养老贷款保证担保合同样本4篇
- 二零二五美容院美容师形象设计与推广服务合同4篇
- 2025年度个人沙石加工及销售一体化合同4篇
- 2025年度虚拟现实内容制作与版权保护合同3篇
- 2025年度露营装备租赁与售后服务合同范本3篇
- 二零二五年度高端U盘定制销售合同范本2篇
- 二零二五版模具制造设备租赁及质量控制协议4篇
- 郑州电力职业技术学院《色彩学》2023-2024学年第一学期期末试卷
- 垃圾处理厂工程施工组织设计
- 天疱疮患者护理
- 2025年蛇年新年金蛇贺岁金蛇狂舞春添彩玉树临风福满门模板
- 四川省成都市青羊区石室联中学2024年八年级下册物理期末学业水平测试试题含解析
- 门诊导医年终工作总结
- 新生物医药产业中的人工智能药物设计研究与应用
- 损失补偿申请书范文
- 压力与浮力的原理解析
- 铁路损伤图谱PDF
- 装修家庭风水学入门基础
- 移动商务内容运营(吴洪贵)任务二 社群的种类与维护
评论
0/150
提交评论