版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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; int write;
5、 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); STARTUPINFO si; ZeroMemo
6、ry(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 < 2; i+) sprintf(szCmdL
7、ine,""%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, &pi); if (!bCreateOK) ret
8、urn 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, sizeof(LONG), "map&qu
9、ot;); 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->num=0; memset(pnData->bu
10、ffer,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("Create child process success.n")
11、; 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=INVALID_HANDLE_VALUE) printf("erro
12、rn"); 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; GetSystemTime(&st); srand(unsigned)time(0);
13、 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; pnData->write=(pnData->write+1)%3; pnData-&g
14、t;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; ReleaseSemaphore(semFull, 1, NULL); ReleaseMutex(hMutexMap
15、ping); 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"); if (hMapping=INVALID_HANDLE_VALUE) printf(&q
16、uot;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); SYSTEMTIME st; GetSystemTime(&st); srand(unsigned)t
17、ime(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->read=0; pnData->read=(pnData->read+1)%3; pnDat
18、a->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; ReleaseSemaphore(semEmpty,1,NULL); ReleaseMutex(hMutex
19、Mapping); 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(argv2); else Parent(); WaitForMultipleObjects(num,lpHandle,tr
20、ue,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, SEM_FULL, SETVAL, 0);semctl(id, SEM_MUTEX, SETVAL, 1);int shmid = c
21、reateQueue();/创建共享主存if(shmid<0)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(for
22、k()=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 "head.h"main(int argc,char * argv)struct queue *buf,*out;int s
23、em_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,表明一次只能运行一个进程buf->buf+;/产品数+1(buf + buf->buf) ->buf = 1;/放入产品后缓冲区置1/
24、获取当前时间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,即往里面写了一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广西百色信诚物业服务有限责任公司人才招聘笔试历年参考题库附带答案详解
- 2025年西安航天三沃化学有限公司招聘(3人)笔试历年参考题库附带答案详解
- 2025山东烟台兴润农村供水有限公司招聘3人笔试历年参考题库附带答案详解
- 2025安徽阜阳市阜南齐耀新能源有限公司招聘3人笔试历年参考题库附带答案详解
- 2025安徽安庆市桐城经开区建设投资集团有限公司招聘部分岗位核减笔试历年参考题库附带答案详解
- 2025天津市宝坻经济开发区选聘国企中层管理人员35人笔试历年参考题库附带答案详解
- 2025四川虹信软件股份有限公司招聘项目经理等岗位测试笔试历年参考题库附带答案详解
- 2025云南曲靖市数字交通科技有限公司劳务派遣制员工招聘2人笔试历年参考题库附带答案详解
- 2025中国建筑一局(集团)有限公司西南分局客户/领域专员招聘1人(四川)笔试历年参考题库附带答案详解
- 现代生产管理文员的计划与执行策略
- 2025中国K12课外辅导市场消费特征与行业趋势研究报告
- 2026年北京市高考语文总复习:专题11 文学类文本阅读(选修上册课内阅读)(解析版)
- 医美医疗安全防范课件
- 物业小区电梯故障应急预案
- 2025年烟草制品购销员二级(复核)练习题
- 2021新《安全生产法》培训课件
- 2025年广州公务员行测真题【完整+答案+解析】
- 山脚树煤矿924事故调查报告
- 2025年一级建造师《(机电工程)管理与实务》考试真题及答案
- 2025年食品安全考试试题(答案+解析)
- 高中语文学业水平考试文学常识名句名篇归纳复习(课件)
评论
0/150
提交评论