


版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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次說(shuō)明:?顯示每次添加和讀取數(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ù)說(shuō)明:(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)互斥 的訪問(wèn)緩沖區(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 程序流程圖開(kāi)始初始化:創(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();/ 打開(kāi)共享主存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();打開(kāi)共享主存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嘗穀郭者者書(shū)者者書(shū)者者書(shū)區(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ú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 衛(wèi)士俱樂(lè)部活動(dòng)方案
- 參加培訓(xùn)活動(dòng)方案
- 吉林衛(wèi)生月宣傳活動(dòng)方案
- 單位助學(xué)活動(dòng)方案
- 廠區(qū)除雪活動(dòng)方案
- 葉縣全民閱讀活動(dòng)方案
- 廈門全民捐血活動(dòng)方案
- 單位中秋節(jié)活動(dòng)方案
- 雙十一公司活動(dòng)方案
- 家庭食品儲(chǔ)存安全管理制度與操作流程
- 華東師大版七年級(jí)數(shù)學(xué)上冊(cè)教學(xué)課件
- 中國(guó)航天(航天科普知識(shí))PPT
- GB/T 27806-2011環(huán)氧瀝青防腐涂料
- GB/T 17949.1-2000接地系統(tǒng)的土壤電阻率、接地阻抗和地面電位測(cè)量導(dǎo)則第1部分:常規(guī)測(cè)量
- 夢(mèng)幻西游古龍服務(wù)端安裝教程
- 《出生醫(yī)學(xué)證明》單親母親情況聲明
- 4配電柜安全風(fēng)險(xiǎn)點(diǎn)告知牌
- 旋挖機(jī)操作手知識(shí)試卷含參考答案
- GB∕T 22590-2021 軋鋼加熱爐用耐火澆注料
- Q∕GDW 11445-2015 國(guó)家電網(wǎng)公司管理信息系統(tǒng)安全基線要求
- 材料科學(xué)基礎(chǔ) 第2章 晶體結(jié)構(gòu)
評(píng)論
0/150
提交評(píng)論