




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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) Create()功能:在当前运行的进程中创建文件映射对象,来模拟共
3、享缓冲区MapViewOfFile()功能:在此文件映射上创建视图映射到当前应用程序的地址空间B 程序流程图开始初始化:创建的子进程个数为0nClone=0;创建5个相同的子进程nClone+2nClone60nClone3申请缓冲区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随机等待随机等待等待子进程执行完毕12次取完了?12次放完了?YY结束
4、每个子进程结束实验代码如下:Windows:/ 实验三.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include static HANDLE hMutexMapping=INVALID_HANDLE_VALUE; int num=0; HANDLE lpHandle10; struct buf int num; int read; int write; int buffer5; ; BOOL StartClone() int i; BOOL bCreateOK; PROCESS_INFORMATION pi; TCHAR
5、szMAX_PATH; GetModule(NULL,sz,MAX_PATH); TCHAR szCmdLineMAX_PATH; for ( i = 0; i 3; i+) sprintf(szCmdLine,%s consumer %d,sz); STARTUPINFO si; ZeroMemory(reinterpret_cast(&si),sizeof(si); si.cb=sizeof(si); bCreateOK=CreateProcess( sz, szCmdLine, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NUL
6、L, &si, &pi); if (!bCreateOK) return false; lpHandlenum=pi.hProcess; num+; for ( i = 0; i 2; i+) sprintf(szCmdLine,%s productor %d,sz); STARTUPINFO si; ZeroMemory(reinterpret_cast(&si),sizeof(si); si.cb=sizeof(si); bCreateOK=CreateProcess( sz, szCmdLine, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE,
7、 NULL, NULL, &si, &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=Create( NULL, NULL, PAGE_READWRITE, 0, sizeof(LONG), map)
8、; if (hMapping!=INVALID_HANDLE_VALUE) LPVOID pData=MapViewOfFile( hMapping, , 0, 0, 0); if (pData!=NULL) ZeroMemory(pData,sizeof(LONG); struct buf *pnData=reinterpret_cast(pData); pnData-read=0; pnData-write=0; pnData-num=0; memset(pnData-buffer,0,sizeof(pnData-buffer); UnmapViewOf); CreateSemaphore
9、(NULL,3,3,EMPTY); CreateSemaphore(NULL,0,3,FULL); BOOL bCreateOK=StartClone(); if (!bCreateOK) /printf(Create child process failed.n); else /printf(Create child process success.n); ReleaseMutex(hMutexMapping); void Productor(int n) int j; printf(Productor is running.n); hMutexMapping=OpenMutex(MUTEX
10、_ALL_ACCESS,true,mutex); HANDLE hMapping=Open( , NULL, map); 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 6; i+) WaitForSingleObject(semEmpty, I
11、NFINITE); SYSTEMTIME st; GetSystemTime(&st); srand(unsigned)time(0); Sleep(rand()/6); WaitForSingleObject(hMutexMapping,INFINITE); LPVOID p( hMapping, , 0, 0, 0); if (p) struct buf *pnData=reinterpret_cast(pFile); pnData-bufferpnData-write=1; pnData-write=(pnData-write+1)%3; pnData-num+; printf(%02d
12、:%02d:%02d 生产者%d生产成功 缓冲区中剩余%d个 ,st.wHour,st.wMinute,st.wSecond,n,pnData-num); for (j = 0; j bufferj); printf(n); UnmapViewOf); p; ReleaseSemaphore(semFull, 1, NULL); ReleaseMutex(hMutexMapping); printf(生产者%d生产完毕n,n); void Consumer(int n) int j; printf(Consumer is running.n); hMutexMapping=OpenMutex(
13、MUTEX_ALL_ACCESS,true,mutex); HANDLE hMapping=Open( , NULL, map); 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(semFul
14、l, INFINITE); SYSTEMTIME st; GetSystemTime(&st); srand(unsigned)time(0); Sleep(rand()/6); WaitForSingleObject(hMutexMapping,INFINITE); LPVOID p( hMapping, , 0, 0, 0); if (p) struct buf *pnData=reinterpret_cast(pFile); pnData-bufferpnData-read=0; pnData-read=(pnData-read+1)%3; pnData-num-; printf(%02
15、d:%02d:%02d 消费者%d消费成功 缓冲区中剩余%d个 ,st.wHour,st.wMinute,st.wSecond,n,pnData-num); for (j = 0; j bufferj); printf(n); UnmapViewOf); p; ReleaseSemaphore(semEmpty,1,NULL); ReleaseMutex(hMutexMapping); printf(消费者%d消费完毕n,n); int main(int argc,char *argv) if (argc1&strcmp(argv1,productor)=0) Productor(atoi(a
16、rgv2); else if (argc1&strcmp(argv1,consumer)=0) Consumer(atoi(argv2); else Parent(); WaitForMultipleObjects(num,lpHandle,true,INFINITE); return 0; Linux下代码:/主进程#include #include #include head.hint main()int id = semget(SEM_ALL_KEY, 3, IPC_CREAT|0660);/创建信号量集合/初始化信号量集合semctl(id, SEM_EMPTY, SETVAL, 3)
17、;semctl(id, SEM_FULL, SETVAL, 0);semctl(id, SEM_MUTEX, SETVAL, 1);int shmid = createQueue();/创建共享主存if(shmid0)perror(create shm error.);exit(1);/生成生产者进程if(fork()=0)execl(producer, producer1, 0);if(fork()=0)execl(producer, producer2, 0);/生成消费者进程if(fork()=0)execl(consumer, consumer1, 0);if(fork()=0)exe
18、cl(consumer, consumer2, 0);if(fork()=0)execl(consumer, consumer3, 0);/等待子进程int stat,i;for(i=0;i5;i+)wait(&stat);removeQueue(shmid);/释放共享主存return 0;/*生产者*/#include head.hmain(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;ibuf+;/产品数+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;jbuf);printf(n);v(sem_id, SEM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保安用人合同范本
- 债权居间协议合同范本
- 2024年寒假幼儿园工作社会实践报告样本(3篇)
- 公司水电改造合同范例
- 冷库批发转让合同范本
- 公司融资合同范本餐饮
- 债务融资顾问合同范本
- 共享酒店项目合同范本
- 科技引领下医疗产业升级的战略布局
- 科技助力绿色建筑电气节能技术创新
- 小儿急性中毒的处理与急救
- 涂装工技能鉴定考试题库汇总-下(多选、判断题部分)
- 非遗传统文化课件
- 桥梁施工常见问题及预防控制要点(PPT,46)
- 中俄文一般贸易合同范本
- 知情同意书核查要点课件
- 广东省深圳市2021-2022学年高二下学期期末考试 语文 Word版含解析
- 专项施工方案专家论证意见回复表
- 《医古文》教学全套课件580页
- 水电厂计算机监控系统改造技术要求
- 胜利油田压驱技术工艺研究进展及下步工作方向
评论
0/150
提交评论