版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验三:生产者与消费者实验目的1. 学习和掌握操作系统中进程之间的通信;2. 理解和掌握使用信号量机制来是想进程之间的同步和互斥;3. 学习使用创建文件对象,并利用文件映射对象来实现数据通信。二、实验容10? 一个大小为6的缓冲区,初始为空,每个缓冲区能存放一个长度若为 个字符的字符串。? 2个生产者-随机等待一段时间,往缓冲区添加数据,-若缓冲区已满,等待消费者取走数据后再添加 -重复12次? 3个消费者-随机等待一段时间,从缓冲区读取数据-若缓冲区为空,等待生产者添加数据后再读取 -重复8次说明:?显示每次添加和读取数据的时间及缓冲区的状态?生产者和消费者用进程模拟,缓冲区用共享存来实现三
2、、实验环境1. Windows下:Win dows8 ,Visual studio 20132. Linux 下:Linux Ubuntu 4,gcc四、程序设计与实现1. Win dows 下:A.主要函数说明:(1) PROCESSNF ORMATIONStartClo ne(i ntn Clo nelD) 功能:用来创建5个相同的进程,前两个为生产者,后 三两个为消费者,赋予其不同的ID值,返回进程的信 息。(2)CreateSemaphore();功能:创建3个信号量:full ,empty,mutex。来互斥 的访问缓冲区,实现通信。(3)CreateFileM appi ng ()
3、功能:在当前运行的进程中创建文件映射对象,来模拟共享缓冲区MapViewOfFile ()功能:在此文件映射上创建视图映射到当前应用程序的 地址空间B 程序流程图开始初始化:创建的子进程个数为 0nClo ne=0;申请缓冲区P(empty)P(mutex)0n Clo ne32n Clo ne6申请缓冲区把产品放入缓冲 区:将0置为1释放缓冲区:V(mutex)V(full)随机等待Y12次放完了?nClone=?P(full)P(mutex)创建3个信号量:full ,empty,mutex1创建共享内存1T等待子进程执行 完毕1It释放缓冲区:V(mutex)V(empty)1随机等待N
4、从缓冲区取产 品:将1置为0Y12次取完了?结束每个子进程结束实验代码如下:Win dows:/实验三.cpp :定义控制台应用程序的入口点创建5个相同nClon e+司的子进程/#i nclude stdafx.h #i nclude #in elude #in elude static HANDLEMutexMappi ng=INVALID HANDLE VAL;UEint num=O;HANDLBpHa ndle10;struct bufint num;int read;int write;int buffer5;BOOIStartClo ne()int i;BOOlbCreateOK;
5、PROCESS_INFORMATpONTCHAzFilename MAX PATHGetModuleFileName(NULLszFilename, MAX PAT)HTCHARzCmdLine MAX_PATHfor ( i = 0; i 3; i+)spri ntf(szCmdL ine,%s con sumer %d ,szFile name,i);STARTUPINFO;ZeroMemory( reinterpret cast(&si), sizeof (si);si.cb=sizeof (si);bCreateOK二CreateProcess (szFile name,szCmdLi
6、 ne,NULLNULLFALSE,CREATE_DEFAULT_ERROR_MODENULLNULL&si,&pi);if (!bCreateOK)return false ;IpHa ndle num =pi.hProcess;nu m+;for ( i = 0; i 2; i+)spri ntf(szCmdL ine,%s productor %d ,szFile name,i);STARTUPINFO;ZeroMemo以 re in terpret_cast(&si), sizeof (si);si.cb= sizeof (si);bCreateOK二CreateProcess (sz
7、File name,szCmdLi ne,FALSECREATE_DEFAULT_ERROR_MODE&si,&pi);if (!bCreateOK)return falseIpHa ndle num =pi.hProcess;nu m+;return true ;void Parent()printf( Creati ng the child process and waited child process to quit.n );hMutexMapping二 CreateMutex (NULL true , mutex);HANDLEMapping二 CreateFileMapping (
8、NULLNULLPAGE_READWRITE0,sizeof (LONG map);if (hMapping!二 INVALID_HANDLE_VAL)JELPVOIDpData二MapViewOfFile(hMapp ing,FILE_MAP_ALL_ACCESS0);if (pData!二 NULLZeroMemory(pData, sizeof (LONG;struct buf *pn Data= rein terpret castvstruct buf*(pData);pn Data-read=O;pn Data-write=0;pn Data-num=0;memset(pnData-
9、buffer,O,sizeof (pnData-buffer);Unm apViewOfFile(pData);CreateSemaphore( NULL3,3, EMPTY);CreateSemaphore( NULL0,3, FULL);BOOlbCreateOK二StartClo ne();if (!bCreateOK)/pri ntf(Create child process failed. n);elsepri ntf(Create child process success. n);ReleaseMutex(hMutexMappi ng);void Productor( int n
10、)int j;printf( Productor is runnin g.n);hMutexMapping= OpenMuteX MUTEX_ALL_ACCEST8e , mutex);HANDLEMapping=OpenFileMapping (FILE MAP ALL ACCESSNULL map);if (hMapping二二 INVALID HANDLE VAL)JEprin tf(error n );HANDLEemEmpty =Ope nSemaphoreSEMAPHORE_ALL_ACCEASSEEMPTY);HANDLEemFull =Ope nSemaphoreSEMAPHO
11、RE ALL ACCEASSEFULL);for ( int i = 0; i 6; i+)WaitForSi ngleObject(semEmpty,INFINITE);SY STEMTIMSt;GetSystemTime(&st);srand(unsigned )time(0);Sleep(ra nd()/6);WaitForSi ngleObject(hMutexMappi ng,INFINITE);LPVOIDpFile二MapViewOfFile(hMapp ing,FILE_MAP_ALL_ACCESS0);if (pFile!二 NULLstruct buf *pn Data=
12、rein terpret_cast (pFile);pn Data-bufferp nData-write=1;pn Data-write=(p nData-write+1)%3;pn Data-nu m+;printf(%02d:%02d:%02d生产者%d生产成功缓冲区中剩余 %个 ,st.wHour,st.wMinute,st.wSecond,n,pnData-num);for (j = 0; j bufferj);printf(n);匸Unm apViewOfFile(pFile);pFile=NULLReleaseSemaphore(semFull, 1,NULL;ReleaseMu
13、tex(hMutexMappi ng);printf(生产者%d生产完毕n , n);void Consumer( int n)int j;printf(Con sumer is runnin g.n);hMutexMapping= OpenMuteX MUTEX ALL ACCESr8e , mutex);HANDLEMapping=OpenFileMapping (FILE MAP ALL ACCESSNULLmap);if (hMapping二二 INVALID_HANDLE_VAL)JEprintf( error n );HANDLEemEmpty =Ope nSemaphoreSEM
14、APHORE ALL ACCESSSEEMPTY);HANDLEemFull =Ope nSemaphoreSEMAPHORE_ALL_ACCEASSEFULL);for ( int i = 0; i (pFile);pn Data-bufferp nData-read=O;pn Data-read=(p nData-read+1)%3;pnData-num-;printf(%02d:%02d:%02d消费者%d消费成功缓冲区中剩余 %个 ,st.wHour,st.wMinute,st.wSecond,n,pnData-num);for (j = 0; j bufferj);printf(n)
15、;Unm apViewOfFile(pFile);pFile= NULLReleaseSemaphore(semEmpty,1, NULL;ReleaseMutex(hMutexMappi ng);printf( 消费者%d消费完毕n , n);匚int main( int argc , char * argv)if ( argc1 &strcmp(argv1, productor )=0)Productor(atoi(argv 2);else if ( argc 1 &strcmp(argv 1, consumer )=0)Consumer(atoi(argv 2);elsePare nt(
16、);WaitForMultipleObjects(num,lpHandle,true , INFINITE); return 0;Linux下代码:/主进程#in elude #i nclude #in elude head.hint mai n()创建信号量集合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
17、reateQueue();/ 创建共享主存if(shmid0)perror(create shm error.);exit(1);/生成生产者进程if(fork()=0)execl(producer, produced, 0);if(fork()=0)execl(producer, produced, 0);/生成消费者进程if(fork()=0)execl(c on sumer, con sumerl, 0);if(fork()=0)execl(c on sumer, con sumer2, 0);if(fork()=0)execl(c on sumer, con sumer3, 0);/等
18、待子进程int stat,i;for(i=0;i5;i+)wait(&stat);removeQueue(shmid);/ 释放共享主存return 0;/*生产者*/#in clude head.hmain (i nt argc,char * argv)struct queue *buf,*out;int semd = 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; /放入产品后缓冲区
19、置1/获取当前时间struct timeval curtime;gettimeofday(&curtime,NULL);/输出信息printf(No.%s put product %ld:%ld ,argv0,curtime.tv_sec,curtime.tv_usec);prin tf(Now the buffer is );for(j=1;jbuf);prin tf(n);v(semd, SEM_MUTEX); /V(MUTEX)v(semd, SEM_FULL); /V(FULL),释放一个 FULL,即往里面写了一个数据/随机sleep 一会int ran=ran dom()%5;sl
20、eep(ra n);/*消费者*/#in clude head.hmain (i nt argc,char * argv)struct queue *buf,*out;int semd = semget(SEM_ALL_KEY, 3, IPC_CREAT|0660);int i,j;buf = getQueue();打开共享主存out = buf;for(i=0;ibuf) -buf = 0; /取出产品后缓冲区置0buf-buf-; / 产品数-1/获取当前时间struct timeval curtime;gettimeofday(&curtime,NULL);/输出信息printf(No.
21、%s get product %ld:%ld ,argv0,curtime.tv_sec,curtime.tv_usec);prin tf(Now the buffer is );for(j=1;jbuf);prin tf(n);v(semd, SEM_MUTEX);/V(MUTEX)v(sem_id, SEM_EMPTY);/V(EMPTY)/随机等待一段时间int ran=ran dom()%5; sleep(ra n);Windows运行截图:reating nsutmertlie cliild process is running.and ualted clkild process t
22、o qruxtconsume i* jonsumer oductor toductar 2;-17:36 2;47;3& 2:47:41 2:47:41 2:47:1 2:47:4& 2:47:46 2:47:46 2:47:52 2:47:52 2:47:52 2:47:57 2:47:57 2:47:57 2:48:03 2:48:03 2:48:03$产产费产费产费产费产费产费产费产费功功功功功功功功功 成成4成磁成成磁成成成4 :产产WOP产WOP产费产赛产费产裁 nffng生生垦羣垦消生卑消生卑消1 i _J n n B 1 0 urun嘗穀郭者者書者者書者者書区区区区区区区区区区区
23、区区区区区区AxlxIXITTXrAXIVATXA!0 1110 0 0Linux下截图:0111000110 0 0 11100B0111090fTiAinCDfti ufrtitrpradueercqlocalhMt文件旧 编辑旧 查看阿 機索 终箱 輕叭H)cqloc al host 下 K$ . /nain ducorl 4o .prod Mo . consiiie rl slo .consumers Un prndijrrl Jo produce r2 4q,consumerl,consumer3 4a ,producerl lo .p r uJ匚总2 lo . consn
24、总 rz Jo . consno rl Mo.p roducerl Uo JprodijGer2 Mo p roducor2. consi jfiqH g cpnsLiinml,consumer? Jo .producrl 4o.consumers Mop roduce rz lo. consume r2 ln prndurrlput pur get get put put get got put put get got pJt put put 沪t qat gmt put gst pjt get putproduct produci p roduct p roduc: p rnduc- producr p roducT produc: produc: p i uduc 1 p roduct p roduc : prcxjucl p roducT product prnduc p roducl pro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园系铃强制报告制度
- 服务员用餐制度
- 河北省邯郸市永年县第一中学2025-2026学年高三下学期零诊测试生物试题试卷含解析
- 福建省政和一中2025-2026学年高三第二次适应性测试生物试题含解析
- 云南省永胜县第二中学2026年高三第三次联考(三模)生物试题含解析
- 北京海淀北京科技大学附属中学2026届高三下学期5月月考化学试题理试题含解析
- 湖北省东风高级中学2026届高考化学试题1-4月复习专号含解析
- 河北衡水中学2025-2026学年高考模拟考试试题生物试题试卷含解析
- 广东省汕头市潮阳区2026年高三1月教学质量监测化学试题含解析
- 2024-2025学年广东省湛江市雷州五校一年级(上)期中语文试卷
- 气管套管脱管的应急处理
- 汽轮机ETS保护传动试验操作指导书
- 法社会学教程(第三版)教学
- (高清版)DZT 0208-2020 矿产地质勘查规范 金属砂矿类
- 2024磷石膏道路基层材料应用技术规范
- 北京中医药大学东方学院教案
- 问卷设计-问卷分析(社会调查课件)
- 2023年四川高考英语试卷(含答案)
- 刮痧法中医操作考核评分标准
- GB/T 31057.3-2018颗粒材料物理性能测试第3部分:流动性指数的测量
- GB/T 2624.1-2006用安装在圆形截面管道中的差压装置测量满管流体流量第1部分:一般原理和要求
评论
0/150
提交评论