版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三:生产者与消费者一、 实验目的1.学习和掌握操作系统中进程之间的通信;2.理解和掌握使用信号量机制来是想进程之间的同步和互斥;3.学习使用创建文件对象,并利用文件映射对象来实现数据通信。二、实验内容 一个大小为6的缓冲区,初始为空,每个缓冲区能存放一个长度若为10个字符的字符串。 2个生产者 随机等待一段时间,往缓冲区添加数据, 若缓冲区已满,等待消费者取走数据后再添加 重复12次 3个消费者 随机等待一段时间,从缓冲区读取数据 若缓冲区为空,等待生产者添加数据后再读取 重复8次说明: 显示每次添加和读取数据的时间及缓冲区的状态 生产者和消费者用进程模拟,缓冲区用共享内存来实现三、 实验
2、环境1. Windows下:Windows8 ,Visual studio 20132. Linux下:Linux Ubuntu 4,gcc四、 程序设计与实现1. Windows下:A 主要函数说明:(1) PROCESS_INFORMATIONStartClone(intnCloneID)推荐精选功能:用来创建5个相同的进程,前两个为生产者,后三两个为消费者,赋予其不同的ID值,返回进程的信息。(2) CreateSemaphore();功能:创建3个信号量:full,empty,mutex。来互斥的访问缓冲区,实现通信。(3) CreateFileMapping()功能:在当前运行的进程
3、中创建文件映射对象,来模拟共享缓冲区MapViewOfFile()功能:在此文件映射上创建视图映射到当前应用程序的地址空间B 程序流程图开始推荐精选初始化:创建的子进程个数为0nClone=0;创建5个相同的子进程nClone+2<nClone<60<nClone<3申请缓冲区P(full)P(mutex)申请缓冲区P(empty)P(mutex)nClone=?0从缓冲区取产品:将1置为0创建3个信号量:full ,empty,mutex把产品放入缓冲区:将0置为1释放缓冲区:V(mutex)V(empty)释放缓冲区:V(mutex)V(full)创建共享内存NN随
4、机等待随机等待等待子进程执行完毕12次取完了?12次放完了?YY结束每个子进程结束实验代码如下:Windows:/ 实验三.cpp : 定义控制台应用程序的入口点。推荐精选/#include "stdafx.h"#include <stdio.h> #include <windows.h> #include <time.h> static HANDLE hMutexMapping=INVALID_HANDLE_VALUE; int num=0; HANDLE lpHandle10; struct buf int num; int read
5、; int write; int buffer5; ; BOOL StartClone() int i; BOOL bCreateOK; PROCESS_INFORMATION pi; TCHAR szFilenameMAX_PATH; 推荐精选 GetModuleFileName(NULL,szFilename,MAX_PATH); TCHAR szCmdLineMAX_PATH; for ( i = 0; i < 3; i+) sprintf(szCmdLine,""%s" consumer %d",szFilename,i); STARTUP
6、INFO si; ZeroMemory(reinterpret_cast<void *>(&si),sizeof(si); si.cb=sizeof(si); bCreateOK=CreateProcess( szFilename, szCmdLine, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi); if (!bCreateOK) 推荐精选 return false; lpHandlenum=pi.hProcess; num+; for ( i = 0; i <
7、 2; i+) sprintf(szCmdLine,""%s" productor %d",szFilename,i); STARTUPINFO si; ZeroMemory(reinterpret_cast<void *>(&si),sizeof(si); si.cb=sizeof(si); bCreateOK=CreateProcess( szFilename, szCmdLine, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, 推荐精选 &a
8、mp;pi); if (!bCreateOK) return false; lpHandlenum=pi.hProcess; num+; return true; void Parent() printf("Creating the child process and waited child process to quit.n"); hMutexMapping=CreateMutex(NULL,true,"mutex"); HANDLE hMapping=CreateFileMapping( NULL, NULL, PAGE_READWRITE, 0,
9、 sizeof(LONG), "map"); 推荐精选 if (hMapping!=INVALID_HANDLE_VALUE) LPVOID pData=MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (pData!=NULL) ZeroMemory(pData,sizeof(LONG); struct buf *pnData=reinterpret_cast<struct buf *>(pData); pnData->read=0; pnData->write=0; pnData
10、->num=0; memset(pnData->buffer,0,sizeof(pnData->buffer); UnmapViewOfFile(pData); CreateSemaphore(NULL,3,3,"EMPTY"); CreateSemaphore(NULL,0,3,"FULL"); 推荐精选 BOOL bCreateOK=StartClone(); if (!bCreateOK) /printf("Create child process failed.n"); else /printf("
11、Create child process success.n"); ReleaseMutex(hMutexMapping); void Productor(int n) int j; printf("Productor is running.n"); hMutexMapping=OpenMutex(MUTEX_ALL_ACCESS,true,"mutex"); HANDLE hMapping=OpenFileMapping( FILE_MAP_ALL_ACCESS, NULL, "map"); if (hMapping=IN
12、VALID_HANDLE_VALUE) 推荐精选 printf("errorn"); HANDLE semEmpty = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"EMPTY"); HANDLE semFull = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"FULL"); for (int i = 0; i < 6; i+) WaitForSingleObject(semEmpty, INFINITE); SYSTEMTIME st; GetSy
13、stemTime(&st); srand(unsigned)time(0); Sleep(rand()/6); WaitForSingleObject(hMutexMapping,INFINITE); LPVOID pFile=MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (pFile!=NULL) 推荐精选 struct buf *pnData=reinterpret_cast<struct buf *>(pFile); pnData->bufferpnData->write=1; pnD
14、ata->write=(pnData->write+1)%3; pnData->num+; printf("%02d:%02d:%02d 生产者%d生产成功 缓冲区中剩余%d个 ",st.wHour,st.wMinute,st.wSecond,n,pnData->num); for (j = 0; j < 3; j+) printf("%d ",pnData->bufferj); printf("n"); UnmapViewOfFile(pFile); pFile=NULL; ReleaseSema
15、phore(semFull, 1, NULL); ReleaseMutex(hMutexMapping); printf("生产者%d生产完毕n",n); void Consumer(int n) 推荐精选 int j; printf("Consumer is running.n"); hMutexMapping=OpenMutex(MUTEX_ALL_ACCESS,true,"mutex"); HANDLE hMapping=OpenFileMapping( FILE_MAP_ALL_ACCESS, NULL, "map&
16、quot;); if (hMapping=INVALID_HANDLE_VALUE) printf("errorn"); HANDLE semEmpty = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"EMPTY"); HANDLE semFull = OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"FULL"); for (int i = 0; i < 4; i+) WaitForSingleObject(semFull, INFINITE); SYS
17、TEMTIME st; GetSystemTime(&st); srand(unsigned)time(0); Sleep(rand()/6); 推荐精选 WaitForSingleObject(hMutexMapping,INFINITE); LPVOID pFile=MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (pFile!=NULL) struct buf *pnData=reinterpret_cast<struct buf *>(pFile); pnData->bufferpnData
18、->read=0; pnData->read=(pnData->read+1)%3; pnData->num-; printf("%02d:%02d:%02d 消费者%d消费成功 缓冲区中剩余%d个 ",st.wHour,st.wMinute,st.wSecond,n,pnData->num); for (j = 0; j < 3; j+) printf("%d ",pnData->bufferj); printf("n"); 推荐精选 UnmapViewOfFile(pFile); pFil
19、e=NULL; ReleaseSemaphore(semEmpty,1,NULL); ReleaseMutex(hMutexMapping); printf("消费者%d消费完毕n",n); int main(int argc,char *argv) if (argc>1&&strcmp(argv1,"productor")=0) Productor(atoi(argv2); else if (argc>1&&strcmp(argv1,"consumer")=0) Consumer(atoi
20、(argv2); else Parent(); WaitForMultipleObjects(num,lpHandle,true,INFINITE); 推荐精选return 0; Linux下代码:/主进程#include <unistd.h>#include <stdlib.h>#include "head.h"int main()int id = semget(SEM_ALL_KEY, 3, IPC_CREAT|0660);/创建信号量集合/初始化信号量集合semctl(id, SEM_EMPTY, SETVAL, 3);semctl(id, S
21、EM_FULL, SETVAL, 0);semctl(id, SEM_MUTEX, SETVAL, 1);int shmid = createQueue();/创建共享主存if(shmid<0)perror("create shm error.");exit(1);/生成生产者进程if(fork()=0)execl("producer", "producer1", 0);if(fork()=0)推荐精选execl("producer", "producer2", 0);/生成消费者进程if
22、(fork()=0)execl("consumer", "consumer1", 0);if(fork()=0)execl("consumer", "consumer2", 0);if(fork()=0)execl("consumer", "consumer3", 0);/等待子进程int stat,i;for(i=0;i<5;i+)wait(&stat);removeQueue(shmid);/释放共享主存return 0;/*生产者*/#include &q
23、uot;head.h"main(int argc,char * argv)struct queue *buf,*out;int sem_id = semget(SEM_ALL_KEY,3, IPC_CREAT|0660);int i,j;buf = getQueue();/打开共享主存out = buf;for(i=0;i<6;i+)推荐精选p(sem_id, SEM_EMPTY);/P(EMPTY),EMPTY开始值为3,表明有三个空余,申请一个之后,有两个空余,当为零时,不再往里面写数据p(sem_id, SEM_MUTEX);/P(MUTEX),MUTEX开始值为1,表明
24、一次只能运行一个进程buf->buf+;/产品数+1(buf + buf->buf) ->buf = 1;/放入产品后缓冲区置1/获取当前时间struct timeval curtime;gettimeofday(&curtime,NULL);/输出信息printf("No.%s put product %ld:%ld ",argv0,curtime.tv_sec,curtime.tv_usec);printf("Now the buffer is ");for(j=1;j<=3;j+)printf("%4d",(out+j)->buf);printf("n");v(sem_id, SEM_MUTEX);/V(MUTEX)v(sem_id, SEM_FULL);/V(FULL),释放一个FULL,即往里面写了一个数据/随机 sleep 一会int ran=random()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 领导慰问环卫工人发言稿
- 外企写字楼施工人员安全管理协议书(3篇)
- DB11T 1490-2017 人民防空工程防护设备安装验收技术规程
- 汇报课教案常见的天气系统教案
- 2024年医疗服务项目投资申请报告代可行性研究报告
- 考大学的励志故事
- 上海市市辖区(2024年-2025年小学五年级语文)人教版期末考试(下学期)试卷及答案
- 上海市县(2024年-2025年小学五年级语文)人教版小升初真题(上学期)试卷及答案
- 湘教版三年级上册音乐教学计划教案
- 冷却塔技术规格书
- DB35T 2113-2023 幸福河湖评价导则
- 湖北省武汉市部分重点中学2025届物理高一第一学期期中学业水平测试试题含解析
- 安保工作考核表
- 2024年广西高考生物试卷真题(含答案)
- 2024年国家公务员考试《行测》真题(副省级)
- 2023-2024学年冀教版八年级上册期中复习试卷(含解析)
- 广东省广州市2019年中考英语真题(含答案)
- 期货基础知识真题汇编5
- 税务代理合同模板
- 中国铁路国际有限公司招聘考试试卷2022
- 电子政务概论-形考任务5(在线测试权重20%)-国开-参考资料
评论
0/150
提交评论