




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三:生产者与消费者实验目的1 .学习和掌握操作系统中进程之间的通信;2 .理解和掌握使用信号量机制来是想进程之间的同步和互斥;3 .学习使用创建文件对象,并利用文件映射对象来实现数据通信。、实验内容? 一个大小为6 的缓冲区,初始为空,每个缓冲区能存放一个长度若为10个字符的字符串。? 2 个生产者- 随机等待一段时间,往缓冲区添加数据,- 若缓冲区已满,等待消费者取走数据后再添加- 重复12次? 3 个消费者- 随机等待一段时间,从缓冲区读取数据- 若缓冲区为空,等待生产者添加数据后再读取- 重复8次说明:? 显示每次添加和读取数据的时间及缓冲区的状态? 生产者和消费者用进程模拟,缓冲区
2、用共享内存来实现3、 实验环境1. Windows下:Windows8 ,Visual studio 20132. Linux下:Linux Ubuntu 4, gcc4、 程序设计与实现1. Windows 下:A主要函数说明:( 1) PROCESS_INFORMATIONStartClone(intnCloneID) 功能:用来创建5个相同的进程,前两个为生产者,后 三两个为消费者,赋予其不同的ID值,返回进程的信 息。(2) CreateSemaphore();功能:创建3个信号量:full, empty, mutex。来互斥 的访问缓冲区,实现通信。(3) CreateFileMap
3、ping ()功能:在当前运行的进程中创建文件映射对象,来模拟共享缓冲区MapViewOfFile ()功能:在此文件映射上创建视图映射到当前应用程序的地址空间B.程序流程图开始初始化:创建的子进程个数为0nClone=0;实验代码如下:Windows:/实验三.cpp :定义控制台应用程序的入口点。/#include "stdafx.h"#include <stdio.h>#include <windows.h>#include <time.h>static HANDLE hMutexMapping= INVALID HANDLE VA
4、LUE int num=0;HANDLE lpHandle10;struct buf int num;int read;int write;int buffer5; IBOOL 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+) Isprintf(szCmdLine, "&qu
5、ot;%s" consumer %d” ,szFilename,i); STARTUPINFO si;ZeroMemory (reinterpret cas<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;lpHan
6、dlenum=pi.hProcess; num+;for ( i = 0; i < 2; i+)sprintf(szCmdLine, ""%s" productor %d" ,szFilename,i); STARTUPINFO si;ZeroMemory (reinterpret_cas<void *>(&si), sizeof(si); si.cb=sizeof(si);bCreateOK= CreateProcesSszFilename, szCmdLine, NULL , NULL , FALSE, CREATE_DEF
7、AULT_ERROR_MODE , NULL , NULL , &si, &pi); I,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
8、FileMapping(NULL , NULL , PAGE READWRITE , 0, 一 sizeof(LONG), "map");if (hMapping!= INVALID_HANDLE_VALUE ) c_;,LPVOID pData=MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS , 0, 0, 0);if (pData!=NULL ) ZeroMemory (pData,sizeof(LONG);struct buf *pnData=reinterpret cas<struct buf *>(pData)
9、; pnData->read=0;pnData->write=0;pnData->num=0;memset(pnData->buffer,0,sizeof(pnData->buffer); UnmapViewOfFile(pData); ICreateSemaphoreNULL ,3,3,"EMPTY");CreateSemaphoreNULL ,0,3,"FULL");BOOL bCreateOK=StartClone();if (!bCreateOK) Iprintf("Create child process
10、 failed.n");elseprintf("Create child process success.n"); I.ReleaseMutex(hMutexMapping);void Productor(int n) I,int j;printf( "Productor is running.n");hMutexMapping= OpenMutex(MUTEX_ALL ACCESS ,true,"mutex"); HANDLE hMapping= OpenFileMapping(FILE_MAP_ALL_ACCESS ,N
11、ULL , "map");if (hMapping= INVALID_HANDLE_VALUE ) Iprintf( "errorn"); .HANDLE semEmpty =OpenSemaphoreSEMAPHORE ALL ACCESS ,FALSE,"EMPTY");HANDLE semFull =OpenSemaphoreSEMAPHORE_ALL_ACCESS ,FALSE,"FULL");for (int i = 0; i < 6; i+)WaitForSingleObject(semEmpty
12、, INFINITE );SYSTEMTIME 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_cas<struct buf *>(pFile);pnData->bufferpnD
13、ata->write=1;pnData->write=(pnData->write+1)%3;pnData->num+;printf("%02d:%02d:%02d生产者%d生产成功 缓冲区中剩余个 ”,st.wHour,st.wMinute,st.wSecond,n,pnData->num);for (j = 0; j < 3; j+) printf( "%d " ,pnData->bufferj);printf( "n"); IUnmapViewOfFile(pFile);pFile=NULL ;R
14、eleaseSemaphore(semFull, 1NULL );ReleaseMutex(hMutexMapping);printf("生产者%d生产完毕n",n);厂void ConsumerQnt n) I,int j; Iprintf( "Consumers running.n");hMutexMapping= OpenMutex(MUTEX_ALL_ACCESS ,true,"mutex"); HANDLE hMapping= OpenFileMapping(FILE_MAP_ALL_ACCESS ,NULL , "
15、;map"); if (hMapping= INVALID_HANDLE_VALUE ) printf( "errorn");HANDLE semEmpty =OpenSemaphoreSEMAPHORE_ALL_ACCESS ,FALSE,"EMPTY");HANDLE semFull =OpenSemaphoreSEMAPHORE ALL ACCESS ,FALSE,"FULL");for (int i = 0; i < 4; i+) IWaitForSingleObject(semFull, INFINITE )
16、; SYSTEMTIME 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_cas<struct buf *>(pFile);pnData->bufferpnData-&
17、gt;read=0;pnData->read=(pnData->read+1)%3;pnData->num-;printf("%02d:%02d:%02d消费者%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 ;Release
18、Semaphore(semEmpty,1NULL );ReleaseMutex(hMutexMapping);printf("消费者%d消费完毕n",n);口 .int main(int argc,char * argv) Iif (argc>1&&strcmp( argv1, "productor" )=0)Productor(atoi(argv2); Ielseif (argc>1&&strcmp( argv1,"consumer")=0) ' 一.、一 ,£Consu
19、mer(atoi(argv2);elseParent();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
20、, SEM_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", "produced", 0);if(fork()=0)execl("producer", "producer2”, 0);/生成消费者进程if(fork
21、()=0)execl("consumer", "consumed", 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 "head.h"m
22、ain(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 ,表明一次只能运行一个进程b
23、uf->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
24、+j)->buf);printf("n");v(sem_id, SEM_MUTEX);V(MUTEX)v(sem_id, SEM_FULL); /V(FULL),释放一个 FULL,即往里面写了一个数据/随机sleep 一会int ran=random()%5;sleep(ran);/*消费者*/#include "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;b
25、uf = getQueue(); 打开共享主存out = buf;for(i=0;i<4;i+)p(sem_id, SEM_FULL); /P(FULL) FULL 开始值为0,表明开始的时候没有数据,无法取得, 当producer释放一个数据时,这里开始有数据p(sem_id, SEM_MUTEX); /P(MUTEX)(buf + buf->buf) ->buf = 0;取出产品后缓冲区置0buf->buf-; / 产品数-1/获取当前时间struct timeval curtime;gettimeofday(&curtime,NULL);/输出信息prin
26、tf("No.%s get 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_EMPTY);/V(EMPTY)/随机等待一段时间int ran=random()%5;sleep(ran);W
27、indows运行截图:reading onsumet'the cluld process and waited child process to . is running.nsumek" zls runninsr -_onsumer poduetop poductop_2=47:36 _2:47:362:47:41 =47:41_2=47:41 2:47:46 2:47:4& 2=47=46_2=47=52 B=47=58 2:4?:S2"2=47:5?2;47557 2:48:03"2:48:03 _2:48:03s'i.Z_J_JT-T
28、-_J_JTJ1-TJTJ-J-J_J_JT-J-J n0lslslH200HrlIS2rlL30l W 舒舒舒舒布舒舒斯舒荀司舒ararlr荀 国产产费产费产费产费产费产费产覆产赞功功功功功功功功功功功功功功功功止 成成成成成成成45成成45 -工厂产费产费产费产费产费产费产费产费 ngng生生区区区区区区区区区区区区区区区区区TX1TTXAA1TTTTTTTT12121212 1212 1212 11100 111100 110 11IS 0 0Linux 下截图:produr«rr 上prodiLKer.<:cq localhost: "/下载文件(F)编辑(E
29、)查看(V)搜索(S)终端E帮助似)cq(?loc al host 下教$ ./main Uo .producerl Vo .producer2 slo .consumerl 4o.consumer2 Jo .producerl ducer2 lo .consumerl 4。.consumers ducerl lo .producer2 slo .consume r2 lo .ducerl lo .producer2 4o ,producer2 Uo .consumers lo. consumer! slo .consumer2 Qo .producerl Vo.consumer3 Jo .p roducer2 4o.consumer2 Uo .producer1put product1461724380:23222Now th© bufferisput product1461724380:23349Now the butteri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025系统集成工程师必考试题及答案
- 大学生太极试题及答案
- 事业单位招教试题及答案
- 社会服务的影响评估与实践试题及答案
- 软件评测师考试必考题型共享试题及答案
- 项目管理技能提升的试题及答案
- 民营加油站运营管理制度
- 北京分公司管理制度
- 鞋厂成品库管理制度
- 房屋检测中心管理制度
- 二手设备转让合同(2024版)
- 《低中高频电疗法》课件
- 《印刷工艺及实训》课件-5-平版印刷
- 铁路安全员c证考试题库单选题100道及答案
- 北京通州区大运河博物馆的观后感
- 人音版音乐五年级下册《第五课 京韵》大单元整体教学设计2022课标
- 【MOOC】太阳能电池测试及标准-常熟理工学院 中国大学慕课MOOC答案
- 左肘管综合征的护理查房
- 交通管理扣留车辆拖移保管 投标方案(技术方案)
- 2024年湖南省初中学业水平考试地理试卷含答案
- 八年级生物期中模拟卷(考试版A4)(江苏专用苏科版)
评论
0/150
提交评论