生產者與消費者實驗報告_第1頁
生產者與消費者實驗報告_第2頁
生產者與消費者實驗報告_第3頁
生產者與消費者實驗報告_第4頁
生產者與消費者實驗報告_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、塊數目整型量i和j初值為0,i指示首空緩沖塊序號,j指示首滿緩沖塊序號3 3)PV原語varmutex,empty,full:semaphore;i,j:integer;buffer:array0.n-1ofitem;i:=j:=1;Procedureproducer;beginwhiletruedobeginproduceaproduct;P(empty);P(mutex);buffer(i):=product;i:=(i+1)modn;V(mutex);V(full);end;end;Procedureconsumer;beginP(full);P(mutex);goods:=buffer

4、(j);j:=(j+1)modn;V(mutex);V(empty);consumeaproduct;end;end;【實驗源程序代碼】#include#includeconstunsignedshortSIZE_OF_BUFFER=10;/緩沖區(qū)長度unsignedshortProductID=0;/產品號unsignedshortConsumeID=0;/將被消耗的產品號unsignedshortin=0;/產品進緩沖區(qū)時的緩沖區(qū)下unsignedshortout=0;標intg_bufferSIZE_OF_BUFFER;boolg_continue=true;HANDLEg_hMutex

5、;HANDLEg_hFullSemaphore;HANDLEg_hEmptySemaphore;DWORDWINAPIProducer(LPVOID);DWORDWINAPIConsumer(LPVOID);/ 產品出緩沖區(qū)時的緩沖區(qū)下/ 緩沖區(qū)是個循環(huán)隊列/ 控制程序結束/ 用于線程間的互斥/ 當緩沖區(qū)滿時迫使生產者等待/ 當緩沖區(qū)空時迫使消費者等待/ 生產者線程/ 消費者線程intmain()/創(chuàng)建各個互斥信號g_hMutex=CreateMutex(NULL,FALSE,NULL);g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-

6、1,SIZE_OF_BUFFER-1,NULL);g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);/調整下面的數值,可以發(fā)現,當生產者個數多于消費者個數時,/生產速度快,生產者經常等待消費者;反之,消費者經常等待constunsignedshortPRODUCERS_COUNT=3;/生產者的個數constunsignedshortCONSUMERS_COUNT=1;/消費者的個數/總的線程數constunsignedshortTHREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUN

7、T;HANDLEhThreadsPRODUCERS_COUNT;/各線程的handleDWORDproducerIDCONSUMERS_COUNT;/生產者線程的標識符DWORDconsumerIDTHREADS_COUNT;/消費者線程的標識符/創(chuàng)建生產者線程for(inti=0;iPRODUCERS_COUNT;+i)hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi);if(hThreadsi=NULL)return-1;/創(chuàng)建消費者線程for(i=0;iCONSUMERS_COUNT;+i)hThreadsPRODUCE

8、RS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi);if(hThreadsi=NULL)return-1;while(g_continue)if(getchar()/按回車后終止程序運行g_continue=false;return0;/生產一個產品。簡單模擬了一下,僅輸出新產品的ID號voidProduce()std:cerrProducing+ProductID.;std:cerrSucceedstd:endl;/把新生產的產品放入緩沖區(qū)voidAppend()-std:cerrAppendingaproduct.;g_

9、bufferin=ProductID;in=(in+1)%SIZE_OF_BUFFER;std:cerrSucceedstd:endl;/輸出緩沖區(qū)當前的狀態(tài)for(inti=0;iSIZE_OF_BUFFER;+i)std:couti:g_bufferi;if(i=in)std:cout-生產;if(i=out)std:cout-消費;std:coutstd:endl;/從緩沖區(qū)中取出一個產品voidTake()std:cerrTakingaproduct.;ConsumeID=g_bufferout;out=(out+1)%SIZE_OF_BUFFER;std:cerrSucceedstd

10、:endl;/輸出緩沖區(qū)當前的狀態(tài)for(inti=0;iSIZE_OF_BUFFER;+i)std:couti:g_bufferi;if(i=in)std:cout-生產;if(i=out)std:cout-消費;std:coutstd:endl;/消耗一個產品voidConsume()std:cerrConsumingConsumeID.;std:cerrSucceedo ailc iny 1 impending a 一一通1: & 生2; Bp B4: 05: 0一.Succe&d product .產Succeed7:H2 .Su.c a product消費Succeed0 0it4

11、5Pr-a due in 3 Ippendin生產8; HUsersAdminis4ratorDesklopXDebugVK-W. eye*AU入出deMistratcrDe5ktopDebu或肖凄君exe0:11:2消費2- 3L0J生產4:05:0&:0pi8S:0?!0Cansunin1SucceedProdueingf4SucceedAppendingapadutet*.Succeed0:L1=24一消費2:344:0生產5:0Gi8P:08:09:0具體程序見附件(網絡查找)【實驗反思】本次實驗是關于生產者和消費者之間互斥和同步的問題。問題的實質是P,V操作,實驗設一個共享緩沖區(qū),生

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

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

14、證至少有一位哲學家能夠進餐,并在用畢時能釋放出他用過的兩只筷子,從而使更多的哲學家能夠進餐。(2)僅當哲學家的左、右兩只筷子均可用時,才允許他拿起筷子進餐。(3)規(guī)定奇數號哲學家先拿他左邊的筷子,然后再去拿右邊的筷子,而偶數號哲學家則相反。按此規(guī)定,將是1、2號哲學家競爭1號筷子;3、4號哲學家競爭3號筷子。即五位哲學家都先競爭奇數號筷子,獲得后,再去競爭偶數號筷子,最后總會有一位哲學家能獲得兩只筷子而進餐。5.思考在“讀者與寫者”經典同步問題中,如何修改程序,變?yōu)椤皩懻邇?yōu)先”的算法。(寫者優(yōu)先的算法)varrmutex,wmutex,mutex,s:semaphore=1,1,1,1;wri

15、tecount:integer:=0;reader:beginrepeatwait(s);wait(rmutex);ifreadcount=0thenwait(wmutex);readcount:readcount+1;signal(rmutex);signal(s);performreadoperation;wait(rmutex);readcount:=readcount-1;ifreadcount=0thensignal(wmutex);signal(rmutex);untilfalse;endwriter:beginrepeatwait(mutex);ifwritecount=0thenwait(s);writecount:writecount+1;signal(mutex);wait(wmutex);performwriteoperation;signal(wmutex);wait(mutex);writecount:=writecount-1;ifwritecount=0thensignal(s);signal(mutex);untilfalse;end4.分析以下進程運行環(huán)境中出現的同步和互斥現象,列出相應的變量和參數。理發(fā)店理有一位理發(fā)師、一把

溫馨提示

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

評論

0/150

提交評論