生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第1頁
生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第2頁
生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第3頁
生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第4頁
生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余11頁可下載查看

下載本文檔

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

文檔簡介

1、生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告【實(shí)驗(yàn)?zāi)康摹?. 加深對進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。2. 進(jìn)一步認(rèn)識并發(fā)執(zhí)行的實(shí)質(zhì)。3. 驗(yàn)證用信號量機(jī)制實(shí)現(xiàn)進(jìn)程互斥的方法。4. 驗(yàn)證用信號量機(jī)制實(shí)現(xiàn)進(jìn)程同步的方法。【實(shí)驗(yàn)要求】用 c 語言編程搭建“生產(chǎn)者和消費(fèi)者”經(jīng)典進(jìn)程通信問題的環(huán)境。要求程序運(yùn)行時,按任意鍵停止,顯示當(dāng)前系統(tǒng)的各個參數(shù)的值。提交實(shí)驗(yàn)報(bào)告,以及相關(guān)程序列表。打包成附件上傳。【實(shí)驗(yàn)環(huán)境】Visual C+6.0【實(shí)驗(yàn)內(nèi)容】1 .了解經(jīng)典同步問題“生產(chǎn)者和消費(fèi)者”生產(chǎn)者與消費(fèi)者可以通過一個環(huán)形緩沖池聯(lián)系起來,環(huán)形緩沖池由幾個大小相等的緩沖塊組成,每個緩沖塊容納一個產(chǎn)品。每個生產(chǎn)者可不斷地每次往

2、緩沖池中送一個生產(chǎn)產(chǎn)品,而每個消費(fèi)者則可不斷地每次從緩沖池中取出一個產(chǎn)品。指針 i 和指針 j 分別指出當(dāng)前的第一個空緩沖塊和第一個滿緩沖塊。2 .分析和理解3 1 )既存在合作同步問題,也存在臨界區(qū)互斥問題合作同步:當(dāng)緩沖池全滿時,表示供過于求,生產(chǎn)者必須等待,同時喚醒消費(fèi)者;當(dāng)緩沖池全空時,表示供不應(yīng)求,消費(fèi)者應(yīng)等待,同時喚醒生產(chǎn)者?;コ猓?緩沖池顯然是臨界資源,所在生產(chǎn)者與消費(fèi)都要使用它,而且都要改變它的狀態(tài)。( 2)基于環(huán)形緩沖區(qū)的生產(chǎn)者與消費(fèi)者關(guān)系形式描述:公用信號量mutex :初值為1,用于實(shí)現(xiàn)臨界區(qū)互斥生產(chǎn)者私用信號量empty:初值為n,指示空緩沖塊數(shù)目消費(fèi)者私用信號量ful

3、l:初值為0,指示滿緩沖塊數(shù)目整型量 i 和 j 初值為0, i 指示首空緩沖塊序號,j 指示首滿緩沖塊序號4 3) PV 原語var mutex,empty,full:semaphore;i,j:integer;buffer:array0.n-1 of item;i:=j:=1;Procedure producer;beginwhile true dobeginproduce a product;P(empty);P(mutex);buffer(i):=product;i:=(i+1) mod n;V(mutex);V(full);end;end;Procedure consumer;beg

4、inP(full);P(mutex);goods:=buffer(j);j:=(j+1) mod n;V(mutex);V(empty);consume a product;end;end;【實(shí)驗(yàn)源程序代碼】#include <windows.h>#include <iostream>const unsigned short SIZE_OF_BUFFER = 10;/緩沖區(qū)長度unsigned short ProductID = 0;/產(chǎn)品號/將被消耗的產(chǎn)品號unsigned short ConsumeID = 0;unsigned short in = 0;unsig

5、ned short out = 0;int g_bufferSIZE_OF_BUFFER;bool g_continue = true;HANDLE g_hMutex;HANDLE g_hFullSemaphore;HANDLE g_hEmptySemaphore;DWORD WINAPI Producer(LPVOID);DWORD WINAPI Consumer(LPVOID);/產(chǎn)品進(jìn)緩沖區(qū)時的緩沖區(qū)下標(biāo)/產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標(biāo)/緩沖區(qū)是個循環(huán)隊(duì)列/控制程序結(jié)束/用于線程間的互斥/當(dāng)緩沖區(qū)滿時迫使生產(chǎn)者等待/當(dāng)緩沖區(qū)空時迫使消費(fèi)者等待/生產(chǎn)者線程/消費(fèi)者線程int main()/創(chuàng)建

6、各個互斥信號g_hMutex = CreateMutex(NULL,FALSE,NULL);g_hFullSemaphore =CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NU LL);g_hEmptySemaphore =CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);/調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當(dāng)生產(chǎn)者個數(shù)多于消費(fèi)者個數(shù)時,/生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費(fèi)者;反之,消費(fèi)者經(jīng)常等待const unsigned short PRODUCERS_COUNT = 3;/生產(chǎn)者的個數(shù)cons

7、t unsigned short CONSUMERS_COUNT = 1;/消費(fèi)者的個數(shù)/總的線程數(shù)const unsigned short THREADS_COUNT =PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLE hThreadsPRODUCERS_COUNT;/各線程的handleDWORD producerIDCONSUMERS_COUNT;/生產(chǎn)者線程的標(biāo)識符DWORD consumerIDTHREADS_COUNT; /消費(fèi)者線程的標(biāo)識符/創(chuàng)建生產(chǎn)者線程for (int i=0;i<PRODUCERS_COUNT;+i)hThreadsi=Cr

8、eateThread(NULL,0,Producer,NULL,0,&producerIDi);if (hThreadsi=NULL) return -1;/創(chuàng)建消費(fèi)者線程for (i=0;i<CONSUMERS_COUNT;+i)hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi);if (hThreadsi=NULL) return -1;while(g_continue)if(getchar() /按回車后終止程序運(yùn)行g(shù)_continue = false;return

9、0;/生產(chǎn)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的ID 號void Produce()std:cerr << "Producing " << +ProductID << " . "std:cerr << "Succeed" << std:endl;/把新生產(chǎn)的產(chǎn)品放入緩沖區(qū) void Append()std:cerr << "Appending a product . "g_bufferin = ProductID;in = (in+1)%SI

10、ZE_OF_BUFFER;std:cerr << "Succeed" << std:endl;/輸出緩沖區(qū)當(dāng)前的狀態(tài)for (int i=0;i<SIZE_OF_BUFFER;+i)std:cout << i <<": " << g_bufferi;if (i=in) std:cout << " <- 生產(chǎn) "if (i=out) std:cout << " <- 消費(fèi) "std:cout << std

11、:endl;/從緩沖區(qū)中取出一個產(chǎn)品void Take()std:cerr << "Taking a product . "ConsumeID = g_bufferout;out = (out+1)%SIZE_OF_BUFFER;std:cerr << "Succeed" << std:endl;/輸出緩沖區(qū)當(dāng)前的狀態(tài)for (int i=0;i<SIZE_OF_BUFFER;+i)std:cout << i <<": " << g_bufferi;if (

12、i=in) std:cout << " <- 生產(chǎn) "if (i=out) std:cout << " <-消費(fèi) "std:cout << std:endl;/消耗一個產(chǎn)品void Consume()std:cerr << "Consuming " << ConsumeID << std:cerr << "Succeed" << std:endl;/生產(chǎn)者DWORD WINAPI Producer(LPVOI

13、D lpPara)while(g_continue)WaitForSingleObject(g_hFullSemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);return 0;/消費(fèi)者DWORD WINAPI Consumer(LPVOID lpPara)while(g_continue)WaitForSingleObject(g_hEm

14、ptySemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Take();Consume();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL);return 0;【實(shí)驗(yàn)結(jié)果】TCAUser=;Adnnfnisti-3tr Deskto :?' .D?bugy ,京看"口 : 8«- «4 94<56 7 8 9Pf-o due io y 1 Succe&d impending

15、a product «. Succeed"Use rsAd m r nis t ral n r D e kt o|!i Debu g,W. 'Pro d.uc in g- 2 . Succe&d Appending a priodu.ct Succeed 叫i一消費(fèi)1 : 2產(chǎn)0 <生產(chǎn)4: 05: a&: a?: a8: &H"C:Use rsAd m r ni5t ra to r D e s kt o!:i Debu gWW. exe'Prod.uc in g- 3 , , . SucceedAppcndina p

16、i*oduct Succeed曲一嗜費(fèi)±- 22: 3"陳一生產(chǎn)4: a5: 06: 07: o8 : 99 : 01 1 Succeed 4 _ _ n Succeed a prndnGt .".消費(fèi)S= B ?; 0 Consumingf Producing AppendingSucceed_ : 11:2 <一消費(fèi)2: 3a= 0 <生產(chǎn)4: &P= 07: 8具體程序見附件(網(wǎng)絡(luò)查找)【實(shí)驗(yàn)反思】本次實(shí)驗(yàn)是關(guān)于生產(chǎn)者和消費(fèi)者之間互斥和同步的問題。問題的實(shí)質(zhì)是P,V當(dāng)一個線程使用緩操作,實(shí)驗(yàn)設(shè)一個共享緩沖區(qū),生產(chǎn)者和消費(fèi)者互斥的使用, 沖

17、區(qū)的時候,另一個讓其等待知道前一個線程釋放緩沖區(qū)為止0通過本次實(shí)驗(yàn),我們對操作系統(tǒng)的P,V 進(jìn)一步的認(rèn)識,深入的了解P,V 操作的實(shí)質(zhì)和其重要性。課本的理論知識進(jìn)一步闡述了現(xiàn)實(shí)的實(shí)際問題?!緦?shí)驗(yàn)思考題】1 . 思考在“生產(chǎn)者和消費(fèi)者”經(jīng)典同步問題中,兩個P 操作是否可以互換位置,以及兩個 V 操作是否可以互換位置。在生產(chǎn)者 消費(fèi)者問題中,如果將兩個P 操作,即P(full) 和 P(mutex) 互換位置,或者P(empty) 和 P(mutex) 互換位置,都可能引起死鎖??紤]系統(tǒng)中緩沖區(qū)全滿前時,若一生產(chǎn)者進(jìn)程先執(zhí)行了P(mutex) 操作并獲得成功,當(dāng)再執(zhí)行P(empty) 操作時,它將

18、因失敗而進(jìn)入阻塞狀態(tài),它期待消費(fèi)者執(zhí)行V(empty) 來喚醒自己。在此之前,它不可能執(zhí)行V(mutex) 操作,從而使企圖通過P(mutex)進(jìn)入自己的臨界區(qū)的其他生產(chǎn)者和所有的消費(fèi)者進(jìn)程全部進(jìn)入阻塞狀態(tài),從而引起系統(tǒng)死鎖。類似地,消費(fèi)者進(jìn)程若先執(zhí)行P(mutex),后執(zhí)行P(full),同樣可能造成死鎖。V(full)和V(mutex)互換位置,或者 V(empty)和V(mutcx)互換位置,則不會引起死鎖,其影響只是使臨界資源的釋放略為推遲一些。2 .思考在“哲學(xué)家就餐”經(jīng)典同步問題中,如何修改程序,可以保證不會發(fā)生死鎖現(xiàn)象。( 1)至多只允許有四位哲學(xué)家同時去拿左邊的筷子,最終能保證

19、至少有一位哲學(xué)家能夠進(jìn)餐,并在用畢時能釋放出他用過的兩只筷子,從而使更多的哲學(xué)家能 夠進(jìn)餐。2)僅當(dāng)哲學(xué)家的左、右兩只筷子均可用時,才允許他拿起筷子進(jìn)餐。( 3)規(guī)定奇數(shù)號哲學(xué)家先拿他左邊的筷子,然后再去拿右邊的筷子,而偶數(shù)號哲學(xué)家則相反。按此規(guī)定,將是1、 2 號哲學(xué)家競爭1 號筷子;3、 4 號哲學(xué)家競爭 3 號筷子。 即五位哲學(xué)家都先競爭奇數(shù)號筷子,獲得后, 再去競爭偶數(shù)號筷子,最后總會有一位哲學(xué)家能獲得兩只筷子而進(jìn)餐。5. 思考在“讀者與寫者”經(jīng)典同步問題中, 如何修改程序,變?yōu)椤皩懻邇?yōu)先”的算法。(寫者優(yōu)先的算法)var rmutex,wmutex,mutex,s:semaphore=1,1,1,1;writecount:integer:=0;reader:begin repeat wait(s);wait(rmutex);if readcount=0 then wait(wmutex);readcount:readcount+1;signal(rmutex);signal(s);perform read operation;wait(rm

溫馨提示

  • 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

提交評論