實(shí)驗(yàn)三:生產(chǎn)者與消費(fèi)者_(dá)第1頁
實(shí)驗(yàn)三:生產(chǎn)者與消費(fèi)者_(dá)第2頁
實(shí)驗(yàn)三:生產(chǎn)者與消費(fèi)者_(dá)第3頁
實(shí)驗(yàn)三:生產(chǎn)者與消費(fèi)者_(dá)第4頁
實(shí)驗(yàn)三:生產(chǎn)者與消費(fèi)者_(dá)第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Word文檔實(shí)驗(yàn)三:生產(chǎn)者與消費(fèi)者實(shí)驗(yàn)?zāi)康?. 學(xué)習(xí)和掌握操作系統(tǒng)中進(jìn)程之間的通信;2. 理解和掌握使用信號量機(jī)制來是想進(jìn)程之間的同步和互斥;3. 學(xué)習(xí)使用創(chuàng)建文件對象,并利用文件映射對象來實(shí)現(xiàn)數(shù)據(jù)通信。二、實(shí)驗(yàn)內(nèi)容? 一個大小為 6 的緩沖區(qū),初始為空,每個緩沖區(qū)能存放一個長度若為 個字符的字符串。? 2 個生產(chǎn)者-隨機(jī)等待一段時間,往緩沖區(qū)添加數(shù)據(jù),-若緩沖區(qū)已滿,等待消費(fèi)者取走數(shù)據(jù)后再添加-重復(fù) 12 次? 3 個消費(fèi)者-隨機(jī)等待一段時間,從緩沖區(qū)讀取數(shù)據(jù)-若緩沖區(qū)為空,等待生產(chǎn)者添加數(shù)據(jù)后再讀取-重復(fù) 8 次說明:?顯示每次添加和讀取數(shù)據(jù)的時間及緩沖區(qū)的狀態(tài)?生產(chǎn)者和消費(fèi)者用進(jìn)程模擬,

2、緩沖區(qū)用共享內(nèi)存來實(shí)現(xiàn)10Word文檔三、實(shí)驗(yàn)環(huán)境1. Windows下:Win dows8 ,Visual studio 20132. Linux下:Linux Ubuntu 4,gcc四、程序設(shè)計(jì)與實(shí)現(xiàn)1. Windows下:A.主要函數(shù)說明:(1)PROCESSNF ORMATIONStartClo ne(i ntn Clo nelD)功能:用來創(chuàng)建 5 個相同的進(jìn)程,前兩個為生產(chǎn)者,后 三兩個為消費(fèi)者,賦予其不同的 ID 值,返回進(jìn)程的信 息。(2)CreateSemaphore ();功能:創(chuàng)建 3 個信號量:full,empty,mutex。來互斥 的訪問緩沖區(qū),實(shí)現(xiàn)通信。(3)C

3、reateFileMapping ()功能:在當(dāng)前運(yùn)行的進(jìn)程中創(chuàng)建文件映射對象,來模擬 共享緩沖區(qū)MapViewOfFile()功能:在此文件映射上創(chuàng)建視圖映射到當(dāng)前應(yīng)用程序的 地址空間B 程序流程圖Word文檔開始初始化:創(chuàng)建的子進(jìn)程個數(shù)為 0nClo ne=0;創(chuàng)建 5 個相同的子進(jìn)程nClon e+Word文檔2nClone6申請緩沖區(qū)0 nClo ne3-申請緩沖區(qū)P(empty)._ n Clo ne=?P(full)P(mutex)P(mutex)把產(chǎn)品放入緩沖區(qū):將 0 置為 1創(chuàng)建 3 個信號量:full ,empty,mutex從緩沖區(qū)取產(chǎn) 品:將 1 置為 0釋放緩沖區(qū):V

4、(mutex)V(full)結(jié)束實(shí)驗(yàn)代碼如下:Windows :釋放緩沖區(qū):V(mutex)V(empty)創(chuàng)建共享內(nèi)存結(jié)束每個子進(jìn)程Word文檔/實(shí)驗(yàn)三.cpp :定義控制臺應(yīng)用程序的入口點(diǎn)/#include stdafx.h #include #inelude #inelude static HANDLE hMutexMapping= INVALID HANDLE VALUEint num=O;HANDLE lpHa ndle10;struct bufint num;int read;int write;int buffer5;BOOL StartClone()in t i;BOOL bC

5、reateOK;PROCESSNF ORMATIONpi;TCHAR szFile name MAX PATH;GetModuleFileName (NULL,szFilename,MAX PATH);Word文檔TCHARszCmdLi ne MAX_PATH;for ( i = 0; i (&si), sizeof(si);si.cb二sizeof(si);bCreateOK二CreateProcess(szFile name,szCmdLi ne,NULL,NULL,FALSE,CREATE DEFAULT ERROR MODENULL,NULL,&si,&pi)

6、;if (!bCreateOK) _return false;Word文檔IpHa ndle num =pi.hProcess;nu m+;for ( i = 0; i 2; i+)sprintf(szCmdLine, %s productor %d ,szFilename,i);STARTUPINFOsi;ZeroMemory (reinterpret_cast (&si), sizeof(si);si.cb二sizeof(si);bCreateOK二CreateProcess(szFile name,szCmdLi ne,FALSECREATE_DEFAULT_ERROR_MODE

7、&si,&pi);if (!bCreateOK)Word文檔return false;IpHa ndle num =pi.hProcess;nu m+;return true;void Pare nt()prin tf( Creat ing the child process and waited child process toquit.n);hMutexMapping= CreateMutex (NULL,true,”mutex);HANDLE hMapping二CreateFileMapping (PAGE_READWRITE 0, sizeof(LONG), map);

8、if (hMapping!二INVALID_HANDLE_VALUELPVOID pData二MapViewOfFile(hMapp ing,Word文檔FILE MAP ALL ACCESS0);if (pData!二NULL)ZeroMemory (pData, sizeof(LONG);struct buf *pnData= reinterpret cast vstruct buf *(pData);pn Data-read=O;pn Data-write=0;pn Data-num=0;memset(pnData-buffer,O, sizeof(pnData-buffer);Unm

9、apViewOfFile(pData);CreateSemaphore (NULL,3,3,EMPTY);CreateSemaphore (NULL,0,3,FULLJ;BOOL bCreateOK二StartClo ne();if (!bCreateOK)Word文檔/printf(Create child process failed.n);else/pri ntf(Create child process success. n);ReleaseMutex(hMutexMappi ng); void Productor( int n)printf( Productor is running

10、.n);hMutexMapping= OpenMutex (MUTEX_ALL_ACCES&ue ,mutex);HANDLE hMapping二OpenFileMapping (if (hMapp in g= INVALID HANDLE VALUEprintf( errorn);HANDLE semEmpty =OpenSemaphore (SEMAPHORE ALL ACCESBALSEEMPTY);Word文檔HANDLE semFull =OpenSemaphore (SEMAPHORE ALL ACCESFALSEFULLJ;for (int i = 0; i 6; i+)

11、WaitForSingleObject(semEmpty, INFINITE);SY STEMTIMEst;GetSystemTime(&st);sran d(u nsig ned )time(0);Sleep(ra nd()/6);WaitForSi ngleObject(hMutexMapp in g, INFINITE);LPVOID pFile二MapViewOfFile(hMapp ing,FILE_MAP_ALL_ACCESS0);if (pFile!二NULL)struct buf *pnData二reinterpret cast (pFile); pnData-buff

12、erp nData-write=1;pn Data-write=(p nData-write+1)%3;pn Data-nu m+;printf( %02d:%02d:%02c生產(chǎn)者%d生產(chǎn)成功 緩沖區(qū)中剩Word文檔余%(個”,st.wHour,st.wMinute,st.wSecond, n,pnData-num);for (j = 0; j bufferj);printf( n);Unm apViewOfFile(pFile);pFile二NULL;ReleaseSemaphore(semFull, 1, NULL);ReleaseMutex(hMutexMappi ng);printf

13、(生產(chǎn)者%d生產(chǎn)完畢n ,n);void Consumer(int n)int j;printf( Consumer is running.n);hMutexMapping= OpenMutex (MUTEX_ALL_ACCES&ue ,mutex);HANDLE hMapping二OpenFileMapping (FILE MAP ALL ACCESSNULL,Word文檔map);if (hMapp in g= INVALID HANDLE VALUEprintf( errorn);HANDLE semEmpty =OpenSemaphore (SEMAPHORE_ALL_ACCE

14、SFALSEEMPTY);HANDLE semFull =OpenSemaphore (SEMAPHORE_ALL_ACCESFALSEFULLJ;for (int i = 0; i (pFile); pnData-bufferp nData-read=O;pn Data-read=(p nData-read+1)%3;pnData-nu m-;printf( %02d:%02d:%02c消費(fèi)者%d消費(fèi)成功緩沖區(qū)中剩余%(個”,st.wHour,st.wMinute,st.wSecond, n,pnData-num);for (j = 0; j bufferj);printf( n);Unm

15、apViewOfFile(pFile);pFile=NULL;ReleaseSemaphore(semEmpty,1, NULL);ReleaseMutex(hMutexMappi ng);Word文檔printf(消費(fèi)者%d消費(fèi)完畢n ,n);廠int main(int argc,char *argv)if (argc1 &strcmp( argv1,productor )=0)Productor(atoi( argv2);else if (argc1 &strcmp( argv1,consumer )=0)Consumer(atoi( argv2);elsePare nt(

16、);WaitForMultipleObjects( nu m,lpHa ndle, true,INFINITE);return 0;LLinux下代碼:/主進(jìn)程#in elude #i nclude Word文檔#in elude head.hint mai n()int id = semget(SEM_ALL_KEY, 3, IPC_CREAT|0660); 創(chuàng)建信號量集合/初始化信號量集合semctl(id, SEM_EMPTY, SETVAL, 3);semctl(id, SEM_FULL, SETVAL, 0);semctl(id, SEM_MUTEX, SETVAL, 1);int

17、shmid = createQueue();/ 創(chuàng)建共享主存if(shmid0)perror(create shm error.);exit(1);/生成生產(chǎn)者進(jìn)程if(fork()=0)execl(producer, produced, 0);if(fork()=0)execl(producer, produced, 0);/生成消費(fèi)者進(jìn)程if(fork()=0)execl(c on sumer, con sumer1, 0);if(fork()=0)execl(c on sumer, con sumer2, 0);if(fork()=0)Word文檔execl(c on sumer, co

18、n sumer3, 0);/等待子進(jìn)程int stat,i;for(i=0;i5;i+)wait(&stat);removeQueue(shmid);/ 釋放共享主存 return 0;/*生產(chǎ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+;/ 產(chǎn)品數(shù) +1(buf + buf-buf)

19、-buf = 1;/放入產(chǎn)品后緩沖區(qū)置 1/獲取當(dāng)前時間 struct timeval curtime;gettimeofday(&curtime,NULL);Word文檔/輸出信息printf(No.%s put product %ld:%ld ,argvO,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,即往里面寫了一個數(shù)據(jù)/隨機(jī)

20、sleep 一會int ran=ran dom()%5;sleep(ra n);/*消費(fèi)者*/#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;/取出產(chǎn)品后緩沖區(qū)置 0buf-buf-; / 產(chǎn)品數(shù)-1/獲取當(dāng)前時間struct timeval curtime;gettimeofday

21、(&curtime,NULL);輸出信息printf(No.%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)/隨機(jī)等待一段時間int ran=ran dom()%5;sleep(ra n);Word文檔Windows運(yùn)行截圖:reatingnsurnertlie clild processAR

22、Cuaited child process to.isrunn ing .-nsLimBt*15runn incr.-onsiimer1*0 ductOFduct OF:47:362:47:362:47:41424247474747474747474747474747474G4G46462:47:572;47;572:48:032:48:03功功功功功功功功功-RS 功功功功勵戒成成成芻成戚成成成應(yīng)-產(chǎn)產(chǎn)費(fèi)簷產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)S S產(chǎn)費(fèi)產(chǎn)S S產(chǎn)g g- -n n ngng生生舉皐皐消主舉羣舉消D D 1 1 i i _J_J -J-J _J_J -TJ-TJ -J-J -J-J J J -J-J -

23、 _J_J J J -J-J - inin nB10011Q0011B21001nB10011Q0011B21001吋響嘶荀埶薊專埶荀荀%l%l埶荀筍荀arar埶備暫r r営吝產(chǎn)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)產(chǎn)費(fèi)i i 1,1,1,1,生生墾舉舉舉舉舉舉消區(qū)區(qū)區(qū)區(qū)區(qū)送區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)ATXAITTTXXTXITTTXr1212121212121212112121212121212121110M01110Q0111BUfl01110001110Q111flLinux下截圖:pr odut erprMueer.cetSftSurfier.tWord文檔cqlocalhost:文件(F)編輯舊 查看阿

24、 搜索岡終端cq(flocaLhoT下翁$./mainJo .p rcducrlputp-odutt14GL7213BG! ! 23222 Now thebufferis1G0.p reduce r2putp oduct146L723S6::23349Now thebuffe小Is119. corsume rlgetnnoduct146172330::24防1Now thebuffs lis1G04n . corsigetproduct1461721380: :2403Now thPhuftnisG00Mo .produceriputproducT146L72383;;245垢NJ”rhebufferIs109UQ.p匚ducer2 putp roduct146L72-J1383;Now thetuffs ris110To, corsumcrlgetproduct1461721383;2&S96 Mow thebuffo ris1G0,corsumfir3product146L721?83:264G(3Mow ih*bufforis0G0lo -P reducerputpr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論