版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统课程设计报告专业 计算机科学与技术学生姓名丁可班级B计123班学号1210704314指导教师李先锋完成日期2015年11月20日信息工程学院题目:生产者-消费者问题的模拟实现一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。二、设计内容1、概述用进程同步方法解决“生产者-消费者”问题,C或C+语言实现。1、设计目的通过研究进程并发和信号量机制,实现生产者-消费者问题的并发控制。2、设计要求1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓
2、冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。说明:有界缓冲区(提示:有界缓冲区可用数组实现)内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。2)生产者和消费者各有两个以上。3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。2、设计原理在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞
3、,直到新的物品被生产出来。3、详细设计及编码定义两个信号量HANDLE g_hFullSemaphore;/资源信号量:缓冲区满HANDLE g_hEmptySemaphore;/资源信号量:缓冲区空unsigned short in = 0;/用于记录生产者的指针位置unsigned short out = 0;/用于记录消费者的指针位置HANDLE g_hMutex;/线程间的互斥信号量生产者进程while(TRUE) 生产一个产品; P(g_hEmptySemaphore)
4、; P(mutex1); 产品送往buffer(in); in=(in+1)mod n; V(mutex1); V(g_hFullSemaphore); 消费者进程while(TRUE) P(g_hFullSemaphore); &
5、#160; P(mutex2); 从buffer(out)中取出产品; out=(out+1)mod n; V(mutex2); V(g_hEmptySemaphore);(算法流程图、编程及程序注释等)主要的方法:4、运行结果分析1、运行示例在 c+中运行源程序 ,程序主界面截图.按回车及申请资源和缓冲区进行 p 操作和申请互斥(生产者和消费者都是2个)(运行界面截图、界面说明、输入输出数据说明和分析等)附录代码:#include <wind
6、ows.h>#include <iostream>const unsigned short SIZE_OF_BUFFER = 20;/有界缓冲区长度int g_bufferSIZE_OF_BUFFER;/开辟缓冲区?用数组表示?可以看成是一个循环队列unsigned short ProductID = 0;/新生产出来的产品的产品号unsigned short ConsumeID = 0;/被消耗的产品的产品号unsigned short in = 0;/产品进缓冲区时的缓冲区下标?用于记录生产者的指针位置unsigned short out = 0;/产品出缓冲区时的缓冲区
7、下标?用于记录消费者的指针位置 bool g_continue = 1;/控制程序运行:1 表示继续运行?0 表示停止运行HANDLE g_hMutex;/线程间的互斥信号量HANDLE g_hFullSemaphore;/资源信号量:缓冲区满HANDLE g_hEmptySemaphore;/资源信号量:缓冲区空DWORD WINAPI Producer(LPVOID);/生产者线程DWORD WINAPI Consumer(LPVOID);/消费者线程const unsigned short PRODUCERS_COUNT=2;/生产者的个数const unsigned short CON
8、SUMERS_COUNT=2;/消费者的个数const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;/总线程数HANDLE hThreadsPRODUCERS_COUNT;/各线程的 handleDWORD producerIDCONSUMERS_COUNT;/生产者线程的标识符DWORD consumerIDTHREADS_COUNT;/消费者线程的标识符/*-程序提示信息开始-*/void info()/程序提示信息std:cout<<"* - - - - - - - - - - - - -
9、 - - - - - - - - - - *"<<std:endl;std:cout<<"| 课程设计课题 : 生产者-消费者问题的模拟实现 |"<<std:endl;std:cout<<"| 指 导 老 师 : 李先锋 |"<<std:endl;std:cout<<"| 学 生 : 丁可 |"<<std:endl;std:cout<<"| 班 级 : B计123班 |"<<std:endl;std
10、:cout<<"* - - - - - - - - - - - - - - - - - - - - - - - *"<<std:endl;std:cout<<" =按回车开始该程序 "<<std:endl;getchar();/*-程序提示信息结束-*/*-生产一个产品开始-*/生产一个产品:输出其 ID 号void Produce()std:cout<<std:endl;std:cerr<<"生产一个产品: "<<+ProductID;std:cou
11、t<<std:endl;/*-生产一个产品结束-*/*-把新生产的产品放入缓冲区开-*/把新生产的产品放入缓冲区void Append()std:cerr<<"把生产的产品送入缓冲区"g_bufferin=ProductID;in=(in+1)%SIZE_OF_BUFFER;std:cerr<<std:endl;std:cout<<"缓冲区 产品 生产者/消费者"<<std:endl;/新产品放入缓冲区后?输出缓冲区当前的状态for(int i=0;i<SIZE_OF_BUFFER;+i)
12、/输出缓冲区下标if (i<10)std:cout<<i<<" "<<g_bufferi;elsestd:cout<<i<<" "<<g_bufferi;if(i=in)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 生产者"/输出生产者的指针位置if(i=out)if(g_bufferi<1
13、0)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消费者"/输出消费者的指针位置std:cout<<std:endl;/*-把新生产的产品放入缓冲区结-*/*-消费一个产品开始-*/void Consume()/消费一个产品std:cout<<std:endl;std:cerr<<"消费一个产品: "<<ConsumeID;std:cout<<std:endl;/*-消费
14、一个产品结束-*/*-从缓冲区中取出一个产品开始-*/从缓冲区中取出一个产品void Take()std:cout<<std:endl;std:cerr<<"从缓冲区取出一个产品"ConsumeID=g_bufferout;out=(out+1)%SIZE_OF_BUFFER;std:cerr<<std:endl;std:cout<<std:endl;std:cout<<"缓冲区 产品 生产者/消费者"<<std:endl;/取出一个产品后:输出缓冲区当前的状态for(int i=0
15、;i<SIZE_OF_BUFFER;+i)/输出缓冲区下标if(i<10)std:cout<<i<<" "<<g_bufferi;elsestd:cout<<i<<" "<<g_bufferi;if(i=in)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 生产者"/输出生产者的指针位置if(
16、i=out)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消费者"/输出消费者的指针位置std:cout<<std:endl;/*-从缓冲区中取出一个产品结束-*/*-生产者线程开始-*/生产者线程DWORD WINAPI Producer(LPVOID lpPara)while(g_continue)/资源信号量的 P 操作WaitForSingleObject(g_hFullSemaphore,I
17、NFINITE);/互斥信号量的 P 操作WaitForSingleObject(g_hMutex,INFINITE);/生产一个产品Produce();/把新生产的产品放入缓冲区Append();Sleep(2000);/互斥信号量的 V 操作ReleaseMutex(g_hMutex);/资源信号量的 V 操作ReleaseSemaphore(g_hEmptySemaphore,1,NULL);return 0;/*-生产者线程结束-*/*-消费者线程开始-*/消费者线程DWORD WINAPI Consumer(LPVOID lpPara)while(g_continue)/资源信号量的
18、 P 操作WaitForSingleObject(g_hEmptySemaphore,INFINITE);/互斥信号量的 P 操作WaitForSingleObject(g_hMutex,INFINITE);/从缓冲区中取出一个产品Take();/消费一个产品Consume();Sleep(2000);/互斥信号量的 V 操作ReleaseMutex(g_hMutex);/资源信号量的 V 操作ReleaseSemaphore(g_hFullSemaphore,1,NULL);return 0;/*-消费者线程结束-*/*-创建生产者线程开始-*/void createPT()/创建生产者线程for(int i=0;i<PRODUCERS_COUNT;+i)hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi);if(hThreadsi=NULL)g_continue=0;/*-创建生产者线程结束-*/*-创建消费者线程开始-*/void createCT()/创建消费者线程for (int j=0;j<CONSUMERS_COUNT;+j)hThrea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年代理合同签署注意事项
- 2025年商业合作形象授权代理服务协议
- 二零二五版商业地产买卖合同附带抵押权登记0023篇
- 2025年高校与企业联合培养协议教授合作协议9篇
- 二零二五年度出口合同模板(含出口货物仓储与物流服务)4篇
- 2025年度装配式建筑构件生产与施工合同范本4篇
- 2025版水电安装工程新能源并网服务合同集锦3篇
- 二零二五版零担运输合同物流数据安全保护合同4篇
- 二零二五版路演车辆租赁与后勤保障合同4篇
- 二零二五年度家族财产管理及子女成长支持协议
- (一模)临汾市2025年高考考前适应性训练考试(一)语文试卷(含答案)
- 2024-2025学年沪科版数学七年级上册期末综合测试卷(一)(含答案)
- 2023年广东省公务员录用考试《行测》真题及答案解析
- 2024年公证遗产继承分配协议书模板
- 燃气经营安全重大隐患判定标准课件
- 深圳小学英语单词表(中英文)
- 护理质量反馈内容
- 抖音搜索用户分析报告
- 钻孔灌注桩技术规范
- 2023-2024学年北师大版必修二unit 5 humans and nature lesson 3 Race to the pole 教学设计
- 供货进度计划
评论
0/150
提交评论