生产者消费者问题操作系统课程设计.doc

上传人:叶*** 文档编号:35107041 上传时间:2022-08-20 格式:DOC 页数:11 大小:170KB
返回 下载 相关 举报
生产者消费者问题操作系统课程设计.doc_第1页
第1页 / 共11页
生产者消费者问题操作系统课程设计.doc_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《生产者消费者问题操作系统课程设计.doc》由会员分享,可在线阅读,更多相关《生产者消费者问题操作系统课程设计.doc(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、课程设计报告课程名称: 操作系统 专业计算机科学与技术学生姓名班级学号指导教师完成日期信息工程学院题目:生产者-消费者问题的模拟实现 一、设计目的本课程设计是学习完“操作系统原理课程后进展的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统根底理论与重要算法的理解,加强学生的动手能力。二、设计内容1概述设计目的:通过研究Linux 的进程机制与信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。设计要求:(1)每个生产者与消费者对有界缓冲区进展操作后,即时显示有界缓冲区的全部内容,当前指针

2、位置与生产者/消费者县城的标识符。(2)生产者与消费者各有两个以上。(3)多个生产者或多个消费者之间须有共享对缓冲区进展操作的函数代码。2设计原理通过一个有界缓冲区把生产者与消费者联系起来。假定生产者与消费者的优先级是一样的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中取走产品。应该制止生产者向满的缓冲区送入产品,同时也应该制止消费者从空的缓冲区中取出产品,这一机制有生产者线程与消费者线程之间的互斥关系来实现。与计算打印两进程同步关系一样,生产者与消费者两进程P与C之间应满足以下两个同步条件: 只有在缓冲池中至少有一个缓冲区已存入消息后

3、,消费者才能从中提取信息,否那么消费者必须等待。 只有缓冲池中至少有一个缓冲区是空时,生产者才能把消息放入缓冲区,否那么生产者必须等待。为了满足第一个同步条件,设置一个同步信号量full,它代表的资源是缓冲区满,它的初始值为0,它的值为n时整个缓冲池满。这个资源是消费者类进程C所有,C进程可以申请该资源,对它施加P操作,而C进程的合作进程生产者进程P对它施加V操作。同样为了满足第二个同步条件,设置另一个同步信号量empty,它代表的资源是缓冲空区,它的初始值为n,表示缓冲池中所有缓冲区空。信号量full表示可用缓冲区数量,信号量empty表示缓冲区数量,设置整型变量:存入指针in与取出指针ou

4、t。为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另一个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0.另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要在设置一个互斥信号量g_hMutex,初始值为1.P原语的主要动作是: sem减1; 假设sem减一后仍大于或等于零,那么进程继续执行; 假设sem减一后小于零,那么该进程被阻塞后入与该信号相对应的队列中,然后转进程调度。V原语的操作主要动作是: sem加1; 假设相加结果大

5、于零,进程继续执行;假设相加结果小于或等于零,那么从该信号的等待队列中唤醒一等待进程然后再返回原进程继续执行或转进程调度。采用的同步方法:1利用函数CreateMutex(NULL,FALSE,NULL)创立互斥信号量g_hMutex,表示缓冲区当前的状态,假设为true时,那么表示缓冲区正被别的进程使用。三个参数表示的意义分别为:指向平安属性的指针,初始化互斥对象的所有者,指向互斥对象名的指针。2利用函数CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL)创立缓冲区满的信号量g_hFullSemaphore,值为true时表

6、示缓冲区已满。四个参数分别为:表示是否允许继承、设置信号机的初始计数、设置信号机的最大计数、指定信号机对象的名称-1是因为计数从开场。3利用函数CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)创立缓冲区空的信号量g_hEmptySemaphore,该值为true时表示缓冲区为空。5、数据定义及其详细解释const unsigned short SIZE_OF_BUFFER = 20; /缓冲区长度 unsigned short ProductID = 0; /产品号 unsigned short ConsumeID = 0; /将被消耗的产品号 uns

7、igned short in = 0; /产品进缓冲区时的缓冲区下标 unsigned short out = 0; /产品出缓冲区时的缓冲区下标 int g_bufferSIZE_OF_BUFFER; /缓冲区是个循环队列 bool g_continue = true; /使程序跳出循环,控制程序完毕 HANDLE g_hMutex; /用于线程间的互斥 HANDLE g_hFullSemaphore; /当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore; /当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID); /生产者线程 D

8、WORD WINAPI Consumer(LPVOID); /消费者线程 3详细设计及编码流程图生产者:sem=sem-1入口s=0调用进程入等待队列转进程调度返回是否消费者:入 口sem=sem-1 sem=sem-1S=0唤醒等待队列中的一个进程式返回或转进程调度 返回否是程序清单 1.存储构造定义 利用信号量解决生产者消费者问题 const unsigned short SIZE_OF_BUFFER = 10; /缓冲区长度 unsigned short ProductID = 0; /产品号 unsigned short ConsumeID = 0; /将被消耗的产品号 unsigne

9、d short in = 0; /产品进缓冲区时的缓冲区下标 unsigned short out = 0; /产品出缓冲区时的缓冲区下标 int g_bufferSIZE_OF_BUFFER; /缓冲区是个循环队列 bool g_continue = true; /控制程序完毕 HANDLE g_hMutex; /用于线程间的互斥 HANDLE g_hFullSemaphore; /当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore; /当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID); /生产者线程 DWORD WINAPI

10、Consumer(LPVOID); /消费者线程 2.算法相关的函数 1创立各个互斥信号以及生产者线程与消费者线程的函数在如下主函数里面所示: int main() /创立各个互斥信号 g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); /调整下面的数值,可以发现,当生产者个数

11、多于消费者个数时, /生产速度快,生产者经常等待消费者;反之,消费者经常等待。 const unsigned short PRODUCERS_COUNT = 3; /生产者的个数 const unsigned short CONSUMERS_COUNT = 1; /消费者的个数 /总的线程数 const unsigned short THREADS_COUNT PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT; /各线程的handle DWORD producerIDCONSUMERS_COUNT; /生产者线程的标

12、识符 DWORD consumerIDTHREADS_COUNT; /消费者线程的标识符 /创立生产者线程 for (int i=0;i hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /创立消费者线程 for ( i=0;i hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0 &consumerIDi); if (hThreadsi=NULL) return -1; while(g_co

13、ntinue) if(getchar() /按回车后终止程序运行 g_continue = false; return 0; (2) 生产者生产一个产品的函数: /生产一个产品。简单模拟了一下,仅输出新产品的ID号 void Produce() std:cerr Producing +ProductID * ; std:cerr Succeed std:endl; 3把新生产的产品放入缓冲区的函数: /把新生产的产品放入缓冲区 void Append() std:cerr Appending a product * ; g_bufferin = ProductID; in = (in+1)%S

14、IZE_OF_BUFFER; std:cerr Succeed std:endl; 4输出缓冲区当前的状态的函数: /输出缓冲区当前的状态 for (int i=0;i std:cout i : g_bufferi; if (i=in) std:cout - 生产; if (i=out) std:cout - 消费; std:cout std:endl; 从缓冲区中取出一个产品的函数: /从缓冲区中取出一个产品 void Take() std:cerr Taking a product * ; ConsumeID = g_bufferout; out = (out+1)%SIZE_OF_BUF

15、FER; 利用信号量解决生产者消费者问题 std:cerr Succeed std:endl; 5输出缓冲区当前的状态的函数: /输出缓冲区当前的状态 for (int i=0;i std:cout i : g_bufferi; if (i=in) std:cout - 生产; if (i=out) std:cout - 消费; std:cout std:endl; 6消耗一个产品的函数: /消耗一个产品 void Consume() std:cerr Consuming ConsumeID * ; std:cerr Succeed std:endl; 3.生产者与消费者算法 1生产者算法:

16、/生产者 DWORD WINAPI Producer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0; 2消费者算法: /消费者 DWORD WINAPI Consumer(LPVOI

17、D lpPara) while(g_continue) WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0; 4运行结果分析输入输出数据说明与分析:该程序设置的缓冲区数据长度为20,生产者个数为3,消费者个数为1,程序启动后,生产者先进展生产,当3个生产者全

18、部生产完之后,消费者开场从缓冲区中取出产品,当消费者取出一个后,生产者开场继续生产,当生产完3个之后,消费者开场从缓冲池中取产品,依次循环。5设计小结 本次课程设计主要是对操作系统中线程,进程同步互斥等知识的应用,生产者消费者问题是很著名的同步问题,确实是既简单又复杂。此次编写的程序根本实现了设计要求的功能,对于教师提出的关于程序的一点小修改仍未能解答出来,但是给我一点时间,我相信以后定能理解。一个课程设计让我对本学期所学的操作系统课程有了更深刻的理解,加强了对根底的实践运用能力,让我能把所学的知识融会贯穿。6参考文献【1】计算机操作系统(第3版),汤小丹,西安电子科技大学出版社.【2】Visual C+面向对象编程教程,王育坚,清华大学出版社.第 10 页

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

当前位置:首页 > 应用文书 > 工作报告

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com