


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)三:生產(chǎn)者與消費(fèi)者實(shí)驗(yàn)?zāi)康?. 學(xué)習(xí)和掌握操作系統(tǒng)中進(jìn)程之間的通信;2. 理解和掌握使用信號(hào)量機(jī)制來(lái)是想進(jìn)程之間的同步和互斥;3. 學(xué)習(xí)使用創(chuàng)建文件對(duì)象,并利用文件映射對(duì)象來(lái)實(shí)現(xiàn)數(shù)據(jù)通信。二、實(shí)驗(yàn)容10? 一個(gè)大小為6的緩沖區(qū),初始為空,每個(gè)緩沖區(qū)能存放一個(gè)長(zhǎng)度若為 個(gè)字符的字符串。? 2個(gè)生產(chǎn)者-隨機(jī)等待一段時(shí)間,往緩沖區(qū)添加數(shù)據(jù),-若緩沖區(qū)已滿,等待消費(fèi)者取走數(shù)據(jù)后再添加 -重復(fù)12次? 3個(gè)消費(fèi)者-隨機(jī)等待一段時(shí)間,從緩沖區(qū)讀取數(shù)據(jù)-若緩沖區(qū)為空,等待生產(chǎn)者添加數(shù)據(jù)后再讀取 -重復(fù)8次說明:?顯示每次添加和讀取數(shù)據(jù)的時(shí)間及緩沖區(qū)的狀態(tài)?生產(chǎn)者和消費(fèi)者用進(jìn)程模擬,緩沖區(qū)用共享存來(lái)實(shí)現(xiàn)三
2、、實(shí)驗(yàn)環(huán)境1. Windows下:Win dows8 ,Visual studio 20132. Linux 下:Linux Ubuntu 4,gcc四、程序設(shè)計(jì)與實(shí)現(xiàn)1. Win dows 下:A.主要函數(shù)說明:(1) PROCESSNF ORMATIONStartClo ne(i ntn Clo nelD) 功能:用來(lái)創(chuàng)建5個(gè)相同的進(jìn)程,前兩個(gè)為生產(chǎn)者,后 三兩個(gè)為消費(fèi)者,賦予其不同的ID值,返回進(jìn)程的信 息。(2)CreateSemaphore();功能:創(chuàng)建3個(gè)信號(hào)量:full ,empty,mutex。來(lái)互斥 的訪問緩沖區(qū),實(shí)現(xiàn)通信。(3)CreateFileM appi ng ()
3、功能:在當(dāng)前運(yùn)行的進(jìn)程中創(chuàng)建文件映射對(duì)象,來(lái)模擬共享緩沖區(qū)MapViewOfFile ()功能:在此文件映射上創(chuàng)建視圖映射到當(dāng)前應(yīng)用程序的 地址空間B 程序流程圖開始初始化:創(chuàng)建的子進(jìn)程個(gè)數(shù)為 0nClo ne=0;申請(qǐng)緩沖區(qū)P(empty)P(mutex)0n Clo ne32n Clo ne6申請(qǐng)緩沖區(qū)把產(chǎn)品放入緩沖 區(qū):將0置為1釋放緩沖區(qū):V(mutex)V(full)隨機(jī)等待Y12次放完了?nClone=?P(full)P(mutex)創(chuàng)建3個(gè)信號(hào)量:full ,empty,mutex1創(chuàng)建共享內(nèi)存1T等待子進(jìn)程執(zhí)行 完畢1It釋放緩沖區(qū):V(mutex)V(empty)1隨機(jī)等待N
4、從緩沖區(qū)取產(chǎn) 品:將1置為0Y12次取完了?結(jié)束每個(gè)子進(jìn)程結(jié)束實(shí)驗(yàn)代碼如下:Win dows:/實(shí)驗(yàn)三.cpp :定義控制臺(tái)應(yīng)用程序的入口點(diǎn)創(chuàng)建5個(gè)相同nClon e+司的子進(jìn)程/#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生產(chǎn)者%d生產(chǎn)成功緩沖區(qū)中剩余 %個(gè) ,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(生產(chǎn)者%d生產(chǎn)完畢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消費(fèi)者%d消費(fèi)成功緩沖區(qū)中剩余 %個(gè) ,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( 消費(fèi)者%d消費(fèi)完畢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下代碼:/主進(jìn)程#in elude #i nclude #in elude head.hint mai n()創(chuàng)建信號(hào)量集合int id = semget(SEM_ALL_KEY, 3, IPC_CREAT|0660);/初始化信號(hào)量集合semctl(id, SEM_EMPTY, SETVAL, 3);semctl(id, SEM_FULL, SETVAL, 0);semctl(id, SEM_MUTEX, SETVAL, 1);int shmid = c
17、reateQueue();/ 創(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 sumerl, 0);if(fork()=0)execl(c on sumer, con sumer2, 0);if(fork()=0)execl(c on sumer, con sumer3, 0);/等
18、待子進(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) -buf = 1; /放入產(chǎn)品后緩沖區(qū)
19、置1/獲取當(dāng)前時(shí)間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),釋放一個(gè) FULL,即往里面寫了一個(gè)數(shù)據(jù)/隨機(jī)sleep 一會(huì)int ran=ran dom()%5;sl
20、eep(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)前時(shí)間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)/隨機(jī)等待一段時(shí)間int ran=ran dom()%5; sleep(ra n);Windows運(yùn)行截圖: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$產(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)功功功功功功功功功 成成4成磁成成磁成成成4 :產(chǎn)產(chǎn)WOP產(chǎn)WOP產(chǎn)費(fèi)產(chǎn)賽產(chǎn)費(fèi)產(chǎn)裁 nffng生生墾羣墾消生卑消生卑消1 i _J n n B 1 0 urun嘗穀郭者者書者者書者者書區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)
23、區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)AxlxIXITTXrAXIVATXA!0 1110 0 0Linux下截圖:0111000110 0 0 11100B0111090fTiAinCDfti ufrtitrpradueercqlocalhMt文件舊 編輯舊 查看阿 機(jī)索 終箱 輕叭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. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 作風(fēng)紀(jì)律監(jiān)督管理制度
- 供暖企業(yè)成本管理制度
- 供水公司宿舍管理制度
- 供熱公司外網(wǎng)生產(chǎn)管理制度
- 供熱計(jì)量公司管理制度
- 供電公司動(dòng)態(tài)管理制度
- 供電部門平板管理制度
- 便利超市日常管理制度
- 保利物業(yè)品質(zhì)管理制度
- 保安健康安全管理制度
- 太陽(yáng)系中的有趣科學(xué)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 上海市幼兒園幼小銜接活動(dòng)指導(dǎo)意見(修訂稿)
- 培訓(xùn)學(xué)校收費(fèi)和退費(fèi)管理制度
- 法社會(huì)學(xué)教程(第三版)教學(xué)
- 國(guó)內(nèi)外高等教育教材比較研究課題
- 浙江省紹興市諸暨市2023-2024學(xué)年五年級(jí)下學(xué)期期末數(shù)學(xué)試卷
- 煤礦調(diào)度智能化培訓(xùn)課件
- 基于PLC的啤酒發(fā)酵自動(dòng)控制系統(tǒng)
- 重慶市沙坪壩區(qū)2022-2023學(xué)年八年級(jí)下學(xué)期期末英語(yǔ)試題
- 思辨與創(chuàng)新智慧樹知到期末考試答案章節(jié)答案2024年復(fù)旦大學(xué)
- 手術(shù)室-標(biāo)準(zhǔn)側(cè)臥位擺放
評(píng)論
0/150
提交評(píng)論