版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026甘肃倚核人力资源有限公司招聘笔试参考题库及答案解析
- 2026广东省公共卫生医学中心泗安院区招聘编外临床工作人员3人笔试备考题库及答案解析
- 2026年四川职业技术学院单招职业倾向性考试题库附答案
- 2026陕西省面向北京航空航天大学招录选调生考试参考题库附答案
- 2026年徽商职业学院单招职业倾向性考试模拟测试卷附答案
- 2026福建福州经济技术开发区粮食收储有限公司招聘2人笔试备考题库及答案解析
- 2026浙江宁波舜瑞产业控股集团有限公司招聘1人补充笔试参考题库及答案解析
- 江投国华信丰发电有限责任公司公开招聘劳务派遣制工作人员笔试备考试题及答案解析
- 2025河南商丘工学院教师招聘备考题库附答案
- 2026青海西宁国有企业招聘4人笔试参考题库及答案解析
- 【MOOC】通信原理-北京交通大学 中国大学慕课MOOC答案
- 科研设计及研究生论文撰写智慧树知到期末考试答案章节答案2024年浙江中医药大学
- 2024年江苏省普通高中学业水平测试小高考生物、地理、历史、政治试卷及答案(综合版)
- 土力学与地基基础(课件)
- 精神分裂症等精神病性障碍临床路径表单
- 提捞采油安全操作规程
- 管道安全检查表
- DB3211-T 1048-2022 婴幼儿日间照料托育机构服务规范
- 电缆井砌筑工序报验单检验批
- SB/T 11137-2015代驾经营服务规范
- 癌症肿瘤患者中文版癌症自我管理效能感量表
评论
0/150
提交评论