




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计实验报告实验名称: 生产者消费者问题 姓名/学号: 一、实验目的1.学习和掌握操作系统中进程之间的通信;2.理解和掌握使用信号量机制来实现进程之间的同步和互斥;3.学习使用创建共享内存区,并利用共享内存区来实现数据通信。二、实验内容 一个大小为3的缓冲区,初始为空 2个生产者 随机等待一段时间,往缓冲区添加数据, 若缓冲区已满,等待消费者取走数据后再添加 重复6次 3个消费者 随机等待一段时间,从缓冲区读取数据 若缓冲区为空,等待生产者添加数据后再读取 重复4次说明:显示每次添加和读取数据的时间及缓冲区的状态生产者和消费者用进程模拟,缓冲区用共享内存来实现三、实验环境CPU: Inter 2 2.10GHzRAM: 3.00GBWindows 7 旗舰版四、程序设计与实现4.1程序中使用的数据结构及主要符号说明HANDLE SEM_FULL; /记录已使用的缓冲区数目的信号量HANDLE SEM_EMPTY;/记录空的缓冲区数目的信号量HANDLE SEM_MUTEX;/确保生产者和消费者互斥访问缓冲区的信号量int CreateShareMemory(); /建立共享内存,即缓冲区/创建一个克隆的进程,返回进程和线程信息PROCESS_INFORMATION StartClone(int nCloneID); void Producer(int nClone); /生产者void Consumer(int nClone); /消费者五、实验结果和分析由上图可以看到生产者和消费者的添加或读取数据的时间,并且能看到添加或读取后缓冲区的状态。状态图中1代表已经被使用,0代表未被使用。五、源程序代码#include#include#include#includeusing namespace std;#define BUF_SIZE 256HANDLE hMapFile =NULL; /内存映射文件对象的句柄HANDLE CurrentProcess; /当前进程的句柄int *pBuf,*input,*output =NULL; /共享内存的指针HANDLE SEM_FULL; /记录已使用的缓冲区数目的信号量HANDLE SEM_EMPTY; /记录空的缓冲区数目的信号量HANDLE SEM_MUTEX; /确保生产者和消费者互斥访问缓冲区的信号量int CreateShareMemory(); /建立共享内存,即缓冲区PROCESS_INFORMATION StartClone(int nCloneID); /创建一个克隆的进程,返回进程和线程信息void Producer(int nClone); /生产者void Consumer(int nClone); /消费者int main(int argc, char* argv)int i,nClone=0;/PROCESS_INFORMATION hp5; HANDLE np5; /保存5个进程的句柄/从第二个参数中提取克隆IDif(argc 1)sscanf(argv1,%d,&nClone);if( nClone = 0) /ID=0是主进程,执行以下代码/创建信号量SEM_FULL = CreateSemaphore(NULL, /信号量的安全属性,NULL即使用默认安全属性0, /初始化的信号量3, /许信号量增加到最大值FULL); /信号量的名称SEM_EMPTY = CreateSemaphore(NULL,3,3,EMPTY);SEM_MUTEX = CreateSemaphore(NULL,1,1,MUTEX);if( CreateShareMemory()= -1 ) /创建共享内存return 0;/创建5个进程,先创建两个生产者,再创建两个消费者for(i=0;i5;i+) npi = StartClone(+nClone).hProcess;/等待子进程结束WaitForMultipleObjects(5,np,true,INFINITE);/for(i=0;i5;i+)/WaitForSingleObject(hpi.hProcess,INFINITE);/运行结束后关闭子进程的句柄for (i=0;i0 & nClone2 & nClone6) /nClone=3、4或5的代表消费者Consumer(nClone);return 0;/建立共享内存,即缓冲区int CreateShareMemory()CurrentProcess = GetCurrentProcess();hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, /使用分页文件,创建一个使用来自页文件而非指定磁盘文件存储器的文件映射对象NULL, /使用默认安全属性PAGE_READWRITE, /允许读写操作0, /在DWORD的高位中存放大小 BUF_SIZE, /在DWORD的低位中存放大小buffer); /缓冲区的名字if (hMapFile = NULL) printf(无法创建内存映射文件对象(File Mapping Object)n);return -1;pBuf = (int*)MapViewOfFile(hMapFile, /内存映射文件对象的句柄FILE_MAP_ALL_ACCESS, /允许读写操作0, 0, BUF_SIZE); if (pBuf = NULL) printf(无法映射文件视图n);CloseHandle(hMapFile);return -1;elseZeroMemory(pBuf,BUF_SIZE); /内存清零input = pBuf;return 1;/创建一个克隆的进程,返回进程和线程信息PROCESS_INFORMATION StartClone(int nCloneID)/获得用于当前可执行文件的文件名TCHAR szFilenameMAX_PATH;GetModuleFileName(NULL,szFilename,MAX_PATH);/创建子进程命令行的格式化,获得应用程序的EXE文件名/和克隆进程的ID值TCHAR szCmdLineMAX_PATH;sprintf(szCmdLine,%s %d,szFilename,nCloneID);STARTUPINFO si;/用于子进程的STARTUPINFO结构ZeroMemory(reinterpret_cast(&si),sizeof(si);/reinterpret_cast是C+里的强制类型转换符,只修改了/操作数的类型,但仅是重新解释了给出的对象的比特模型/而没有进行二进制转换si.cb = sizeof(si);PROCESS_INFORMATION pi; /说明一个用于记录子进程的相关信息的结构变量/利用同样的可执行文件和命令行创建进程BOOL bCreateOK = CreateProcess(szFilename, /可执行的应用程序的名称szCmdLine, /指定创建一个子进程的符号标识NULL, /缺省了进程安全性NULL, /缺省了线程安全性FALSE, /不继承打开文件的句柄NULL, /不使用新的控制台NULL, /新的环境NULL, /当前目录&si, /启动信息&pi); /返回进程和线程的信息return pi;/生产者void Producer(int nClone)int i,j,time; /等待的时间for(i=0; i6; i+)/打开信号量SEM_FULL=OpenSemaphore(SEMAPHORE_ALL_ACCESS, /安全属性,NULL,/不继承FULL);/打开的信号量名称SEM_EMPTY=OpenSemaphore(SEMAPHORE_ALL_ACCESS,NULL,EMPTY);SEM_MUTEX=OpenSemaphore(SEMAPHORE_ALL_ACCESS,NULL,MUTEX);hMapFile = OpenFileMapping(FILE_MAP_WRITE,/安全属性FALSE,/不继承buffer);/缓冲区的名称pBuf = (int*)MapViewOfFile(hMapFile,FILE_MAP_WRITE,0,0,BUF_SIZE);input = pBuf;/等待信号量,相对于P(SEM_MUTEX),P(SEM_EMPTY)WaitForSingleObject(SEM_EMPTY,INFINITE);WaitForSingleObject(SEM_MUTEX,INFINITE);/向缓冲区添加产品,将0置为1while(*input=1)input+;*input=1;/获得系统时间SYSTEMTIME curtime;GetSystemTime(&curtime);printf(生产者%d往缓冲区中添加数据,添加时间为:%02d:%02d:%02d:%03dn,nClone,curtime.wHour+8,curtime.wMinute,curtime.wSecond,curtime.wMilliseconds);printf(此时,缓冲区的状态为:n);printf(n);printf(%2d%2d%2dn,*(pBuf),*(pBuf+1),*(pBuf+2);printf(n);/释放信号量,相当于V(SEM_MUTEX),V(SEM_FULL)ReleaseSemaphore(SEM_MUTEX,1,NULL);ReleaseSemaphore(SEM_FULL,1,NULL);/关闭句柄CloseHandle(SEM_MUTEX);CloseHandle(SEM_EMPTY);CloseHandle(SEM_FULL);CloseHandle(hMapFile);/随机等待一段时间time = rand()%1000*5;Sleep(time);/取消文件映射UnmapViewOfFile(pBuf);return;/消费者void Consumer(int nClone)int i,time; /等待的时间for(i=0; i4; i+)/打开信号量SEM_FULL=OpenSemaphore(SEMAPHORE_ALL_ACCESS, /安全属性,NULL,/不继承FULL);/打开的信号量名称SEM_EMPTY=OpenSemaphore(SEMAPHORE_ALL_ACCESS,NULL,EMPTY);SEM_MUTEX=OpenSemaphore(SEMAPHORE_ALL_ACCESS,NULL,MUTEX);hMapFile = OpenFileMapping(FILE_MAP_WRITE,/安全属性FALSE,/不继承buffer);/缓冲区的名称pBuf = (int*)MapViewOfFile(hMapFile,FILE_MAP_WRITE,0,0,BUF_SIZE);output = pBuf;/等待信号量,相对于P(SEM_MUTEX),P(SEM_EMPTY)WaitForSingleObject(SEM_FULL,INFINITE);WaitForSingleObject(SEM_MUTEX,INFINITE);/在缓冲区中取出产品,将1置为0while(*output=0)output+;*output=0;/获得系统时间SYSTEMTIME curtime;GetSystemTime(&curtime);printf(消费者%d往缓冲区中读取数据,读取时间为:%02d:%02d:%02d:%03dn,nClone-2,curtime.wHour+8,curtime.wMinute,curtime.wSecond,curtime.wMilliseconds);printf(此时,缓冲区的状态为:n);printf(n);printf(%2d%2d%2dn,*(pBuf),*(pBuf+1),*(pBuf+2);printf(n);/释放信号量,相当于V(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年试验检测师考试题库(含答案)
- 阿尔山市2024-2025学年八年级下学期语文期中测试试卷
- 2024中国血脂管理指南解读课件
- 2025 年小升初忻州市初一新生分班考试数学试卷(带答案解析)-(冀教版)
- 2025 年小升初杭州市初一新生分班考试语文试卷(带答案解析)-(部编版)
- 中国儿童遗尿症疾病管理专家共识解读课件
- 物业公司2025上半年工作总结
- 普通话推广活动普通话与规范字常见易错字词趣味互动模板
- 四川省泸州市江阳区2022-2023学年八年级下学期期末考试生物试题(试卷)
- 福建省泉州市石狮市中英文实验学校2024-2025学年八年级下学期期中考试数学试卷(含简略答案)
- 2025年安徽省中考历史试卷真题(含答案)
- YY/T 0127.11-2014口腔医疗器械生物学评价第11部分:盖髓试验
- GB/T 3036-1994船用中心型蝶阀
- GB/T 19867.5-2008电阻焊焊接工艺规程
- GB/T 1706-2006二氧化钛颜料
- 2023年安徽省国有金融资本投资管理有限公司招聘笔试题库及答案解析
- 新外研版英语七年级上册单词默写表
- T-CIATCM 002-2019 中医药信息数据元目录
- 特殊教育学校学生管理名师优质课赛课一等奖市公开课获奖课件
- 手术室医院感控制培训
- 广西壮族自治区公共场所卫生许可承诺书
评论
0/150
提交评论