实验三_生产者与消费者_第1页
实验三_生产者与消费者_第2页
实验三_生产者与消费者_第3页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论