实验三生产者与消费者.docx
- 文档编号:15533597
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:13
- 大小:138.07KB
实验三生产者与消费者.docx
《实验三生产者与消费者.docx》由会员分享,可在线阅读,更多相关《实验三生产者与消费者.docx(13页珍藏版)》请在冰点文库上搜索。
实验三生产者与消费者
实验三:
生产者与消费者
一、实验目的
1.学习和掌握操作系统中进程之间的通信;
2.理解和掌握使用信号量机制来是想进程之间的同步和互斥;
3.学习使用创建文件对象,并利用文件映射对象来实现数据通信。
二、实验内容
•一个大小为6的缓冲区,初始为空,每个缓冲区能存放一个长度若为10个字符的字符串。
•2个生产者
–随机等待一段时间,往缓冲区添加数据,
–若缓冲区已满,等待消费者取走数据后再添加
–重复12次
•3个消费者
–随机等待一段时间,从缓冲区读取数据
–若缓冲区为空,等待生产者添加数据后再读取
–重复8次
说明:
•显示每次添加和读取数据的时间及缓冲区的状态
•生产者和消费者用进程模拟,缓冲区用共享内存来实现
三、实验环境
1.Windows下:
Windows8,Visualstudio2013
2.Linux下:
LinuxUbuntu4,gcc
四、程序设计与实现
1.Windows下:
A.主要函数说明:
(1)PROCESS_INFORMATIONStartClone(intnCloneID)
功能:
用来创建5个相同的进程,前两个为生产者,后三两个为消费者,赋予其不同的ID值,返回进程的信息。
(2)CreateSemaphore();
功能:
创建3个信号量:
full,empty,mutex。
来互斥的访问缓冲区,实现通信。
(3)CreateFileMapping()
功能:
在当前运行的进程中创建文件映射对象,来模拟共享缓冲区
MapViewOfFile()
功能:
在此文件映射上创建视图映射到当前应用程序的地址空间
B.程序流程图
开始
初始化:
创建的子进程个数为0
nClone=0;
创建3个信号量:
full,empty,mutex
创建共享内存
创建5个相同的子进程
nClone++
nClone=
申请缓冲区
P(empty)
P(mutex)
把产品放入缓冲区:
将0置为1
释放缓冲区:
V(mutex)
V(full)
随机等待
12次放完了
申请缓冲区
P(full)
P(mutex)
从缓冲区取产品:
将1置为0
释放缓冲区:
V(mutex)
V(empty)
随机等待
12次取完了
等待子进程执行完毕
结束每个子进程
结束
0 2 0 N Y Y N 实验代码如下: Windows: pp: 定义控制台应用程序的入口点。 n"); hMutexMapping=CreateMutex(NULL,true,"mutex"); HANDLEhMapping=CreateFileMapping( NULL, NULL, PAGE_READWRITE, 0, sizeof(LONG), "map"); if(hMapping! =INVALID_HANDLE_VALUE) { LPVOIDpData=MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if(pData! =NULL) { ZeroMemory(pData,sizeof(LONG)); } structbuf*pnData=reinterpret_cast pnData->read=0; pnData->write=0; pnData->num=0; memset(pnData->buffer,0,sizeof(pnData->buffer)); UnmapViewOfFile(pData); } CreateSemaphore(NULL,3,3,"EMPTY"); CreateSemaphore(NULL,0,3,"FULL"); BOOLbCreateOK=StartClone(); if(! bCreateOK) { n"); } else { n"); } ReleaseMutex(hMutexMapping); } voidProductor(intn) { intj; printf("Productorisrunning.\n"); hMutexMapping=OpenMutex(MUTEX_ALL_ACCESS,true,"mutex"); HANDLEhMapping=OpenFileMapping( FILE_MAP_ALL_ACCESS, NULL, "map"); if(hMapping==INVALID_HANDLE_VALUE) { printf("error\n"); } HANDLEsemEmpty=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"EMPTY"); HANDLEsemFull=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"FULL"); for(inti=0;i<6;i++) { WaitForSingleObject(semEmpty,INFINITE); SYSTEMTIMEst; GetSystemTime(&st); srand((unsigned)time(0)); Sleep(rand()/6); WaitForSingleObject(hMutexMapping,INFINITE); LPVOIDpFile=MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if(pFile! =NULL) { structbuf*pnData=reinterpret_cast pnData->buffer[pnData->write]=1; pnData->write=(pnData->write+1)%3; pnData->num++; printf("%02d: %02d: %02d生产者[%d]生产成功缓冲区中剩余%d个",,,,n,pnData->num); for(j=0;j<3;j++) { printf("%d",pnData->buffer[j]); } printf("\n"); } UnmapViewOfFile(pFile); pFile=NULL; ReleaseSemaphore(semFull,1,NULL); ReleaseMutex(hMutexMapping); } printf("生产者[%d]生产完毕\n",n); } voidConsumer(intn) { intj; printf("Consumerisrunning.\n"); hMutexMapping=OpenMutex(MUTEX_ALL_ACCESS,true,"mutex"); HANDLEhMapping=OpenFileMapping( FILE_MAP_ALL_ACCESS, NULL, "map"); if(hMapping==INVALID_HANDLE_VALUE) { printf("error\n"); } HANDLEsemEmpty=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"EMPTY"); HANDLEsemFull=OpenSemaphore(SEMAPHORE_ALL_ACCESS,FALSE,"FULL"); for(inti=0;i<4;i++) { WaitForSingleObject(semFull,INFINITE); SYSTEMTIMEst; GetSystemTime(&st); srand((unsigned)time(0)); Sleep(rand()/6); WaitForSingleObject(hMutexMapping,INFINITE); LPVOIDpFile=MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if(pFile! =NULL) { structbuf*pnData=reinterpret_cast pnData->buffer[pnData->read]=0; pnData->read=(pnData->read+1)%3; pnData->num--; printf("%02d: %02d: %02d消费者[%d]消费成功缓冲区中剩余%d个",,,,n,pnData->num); for(j=0;j<3;j++) { printf("%d",pnData->buffer[j]); } printf("\n"); } UnmapViewOfFile(pFile); pFile=NULL; ReleaseSemaphore(semEmpty,1,NULL); ReleaseMutex(hMutexMapping); } printf("消费者[%d]消费完毕\n",n); } intmain(intargc,char**argv) { if(argc>1&&strcmp(argv[1],"productor")==0) { Productor(atoi(argv[2])); } elseif(argc>1&&strcmp(argv[1],"consumer")==0) { Consumer(atoi(argv[2])); } else { Parent(); WaitForMultipleObjects(num,lpHandle,true,INFINITE); } return0; } Linux下代码: ; exit (1); } sputproduct%ld: %ld" argv[0],,; printf("Nowthebufferis"); for(j=1;j<=3;j++) printf("%4d",(out+j)->buf); printf("\n"); v(sem_id,SEM_MUTEX); sgetproduct%ld: %ld" argv[0],,; printf("Nowthebufferis"); for(j=1;j<=3;j++) printf("%4d",(out+j)->buf); printf("\n"); v(sem_id,SEM_MUTEX);//V(MUTEX) v(sem_id,SEM_EMPTY);//V(EMPTY) //随机等待一段时间 intran=random()%5; sleep(ran); } } Windows运行截图: Linux下截图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 生产者 消费者