![生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/2f62fdc8-6906-429a-af07-0f2cbed279b3/2f62fdc8-6906-429a-af07-0f2cbed279b31.gif)
![生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/2f62fdc8-6906-429a-af07-0f2cbed279b3/2f62fdc8-6906-429a-af07-0f2cbed279b32.gif)
![生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/2f62fdc8-6906-429a-af07-0f2cbed279b3/2f62fdc8-6906-429a-af07-0f2cbed279b33.gif)
![生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/2f62fdc8-6906-429a-af07-0f2cbed279b3/2f62fdc8-6906-429a-af07-0f2cbed279b34.gif)
![生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/4/2f62fdc8-6906-429a-af07-0f2cbed279b3/2f62fdc8-6906-429a-af07-0f2cbed279b35.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、生產(chǎn)者和消費(fèi)者實(shí)驗(yàn)報(bào)告【實(shí)驗(yàn)?zāi)康摹?. 加深對(duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。2. 進(jìn)一步認(rèn)識(shí)并發(fā)執(zhí)行的實(shí)質(zhì)。3. 驗(yàn)證用信號(hào)量機(jī)制實(shí)現(xiàn)進(jìn)程互斥的方法。4. 驗(yàn)證用信號(hào)量機(jī)制實(shí)現(xiàn)進(jìn)程同步的方法。【實(shí)驗(yàn)要求】用c語(yǔ)言編程搭建“生產(chǎn)者和消費(fèi)者”經(jīng)典進(jìn)程通信問(wèn)題的環(huán)境。要求程序運(yùn)行時(shí),按任意鍵停止,顯示當(dāng)前系統(tǒng)的各個(gè)參數(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)典同步問(wèn)題“生產(chǎn)者和消費(fèi)者”生產(chǎn)者與消費(fèi)者可以通過(guò)一個(gè)環(huán)形緩沖池聯(lián)系起來(lái),環(huán)形緩沖池由幾個(gè)大小相等的緩沖塊組成,每個(gè)緩沖塊容納一個(gè)產(chǎn)品。每個(gè)生產(chǎn)者可不斷地每次往緩沖池
2、中送一個(gè)生產(chǎn)產(chǎn)品,而每個(gè)消費(fèi)者則可不斷地每次從緩沖池中取出一個(gè)產(chǎn)品。指針i和指針j分別指出當(dāng)前的第一個(gè)空緩沖塊和第一個(gè)滿(mǎn)緩沖塊。2.分析和理解(1)既存在合作同步問(wèn)題,也存在臨界區(qū)互斥問(wèn)題合作同步:當(dāng)緩沖池全滿(mǎn)時(shí),表示供過(guò)于求,生產(chǎn)者必須等待,同時(shí)喚醒消費(fèi)者;當(dāng)緩沖池全空時(shí),表示供不應(yīng)求,消費(fèi)者應(yīng)等待,同時(shí)喚醒生產(chǎn)者?;コ猓壕彌_池顯然是臨界資源,所在生產(chǎn)者與消費(fèi)都要使用它,而且都要改變它的狀態(tài)。(2)基于環(huán)形緩沖區(qū)的生產(chǎn)者與消費(fèi)者關(guān)系形式描述:公用信號(hào)量mutex:初值為1,用于實(shí)現(xiàn)臨界區(qū)互斥生產(chǎn)者私用信號(hào)量empty:初值為n,指示空緩沖塊數(shù)目消費(fèi)者私用信號(hào)量full:初值為0,指示滿(mǎn)緩沖塊
3、數(shù)目整型量i和j初值為0,i指示首空緩沖塊序號(hào),j指示首滿(mǎn)緩沖塊序號(hào)(3)PV原語(yǔ)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;beginP(full);P(mutex);good
4、s:=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ū)長(zhǎng)度unsigned short ProductID = 0; /產(chǎn)品號(hào)unsigned short ConsumeID = 0; /將被消耗的產(chǎn)品號(hào)unsigned short in = 0; /產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)unsigned s
5、hort out = 0; /產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)int g_bufferSIZE_OF_BUFFER; /緩沖區(qū)是個(gè)循環(huán)隊(duì)列bool g_continue = true; /控制程序結(jié)束HANDLE g_hMutex; /用于線(xiàn)程間的互斥HANDLE g_hFullSemaphore; /當(dāng)緩沖區(qū)滿(mǎn)時(shí)迫使生產(chǎn)者等待HANDLE g_hEmptySemaphore; /當(dāng)緩沖區(qū)空時(shí)迫使消費(fèi)者等待DWORD WINAPI Producer(LPVOID); /生產(chǎn)者線(xiàn)程DWORD WINAPI Consumer(LPVOID); /消費(fèi)者線(xiàn)程int main() /創(chuàng)建各個(gè)互斥信號(hào) g_h
6、Mutex = CreateMutex(NULL,FALSE,NULL); g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); /調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當(dāng)生產(chǎn)者個(gè)數(shù)多于消費(fèi)者個(gè)數(shù)時(shí), /生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費(fèi)者;反之,消費(fèi)者經(jīng)常等待 const unsigned short PRODUCERS_COUNT = 3; /生產(chǎn)者的個(gè)數(shù) const
7、 unsigned short CONSUMERS_COUNT = 1; /消費(fèi)者的個(gè)數(shù) /總的線(xiàn)程數(shù) const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT; /各線(xiàn)程的handle DWORD producerIDCONSUMERS_COUNT; /生產(chǎn)者線(xiàn)程的標(biāo)識(shí)符 DWORD consumerIDTHREADS_COUNT; /消費(fèi)者線(xiàn)程的標(biāo)識(shí)符 /創(chuàng)建生產(chǎn)者線(xiàn)程 for (int i=0;i<PRODUCERS_COUNT;+i) h
8、Threadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /創(chuàng)建消費(fèi)者線(xiàn)程 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() /按回車(chē)后終止程序運(yùn)行 g_conti
9、nue = false; return 0;/生產(chǎn)一個(gè)產(chǎn)品。簡(jiǎn)單模擬了一下,僅輸出新產(chǎn)品的ID號(hào)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 = Pr
10、oductID; in = (in+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 (i=in) std:cout << " <- 生產(chǎn)" if (i=out) std:cout << " <- 消費(fèi)
11、" std:cout << std:endl; /從緩沖區(qū)中取出一個(gè)產(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 <<&q
12、uot;: " << g_bufferi; if (i=in) std:cout << " <- 生產(chǎn)" if (i=out) std:cout << " <- 消費(fèi)" std:cout << std:endl; /消耗一個(gè)產(chǎn)品void Consume() std:cerr << "Consuming " << ConsumeID << " . " std:cerr << "Succeed
13、" << std:endl;/生產(chǎn)者DWORD WINAPI Producer(LPVOID 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
14、Consumer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0;【實(shí)驗(yàn)結(jié)果】具體程序見(jiàn)附件(網(wǎng)絡(luò)查找)【實(shí)驗(yàn)反思】本次實(shí)驗(yàn)是關(guān)于生產(chǎn)者和消費(fèi)者之間互斥和同步的問(wèn)題。問(wèn)題的實(shí)質(zhì)是P,V操作
15、,實(shí)驗(yàn)設(shè)一個(gè)共享緩沖區(qū),生產(chǎn)者和消費(fèi)者互斥的使用,當(dāng)一個(gè)線(xiàn)程使用緩沖區(qū)的時(shí)候,另一個(gè)讓其等待知道前一個(gè)線(xiàn)程釋放緩沖區(qū)為止。 通過(guò)本次實(shí)驗(yàn),我們對(duì)操作系統(tǒng)的P,V進(jìn)一步的認(rèn)識(shí),深入的了解P,V操作的實(shí)質(zhì)和其重要性。課本的理論知識(shí)進(jìn)一步闡述了現(xiàn)實(shí)的實(shí)際問(wèn)題。 【實(shí)驗(yàn)思考題】1.思考在“生產(chǎn)者和消費(fèi)者”經(jīng)典同步問(wèn)題中,兩個(gè)P操作是否可以互換位置,以及兩個(gè)V操作是否可以互換位置。在生產(chǎn)者消費(fèi)者問(wèn)題中,如果將兩個(gè)P操作,即P(full)和P(mutex)互換位置,或者P(empty)和P(mutex)互換位置,都可能引起死鎖??紤]系統(tǒng)中緩沖區(qū)全滿(mǎn)前時(shí),若一生產(chǎn)者進(jìn)程先執(zhí)行了P(mutex)操作并獲得成功
16、,當(dāng)再執(zhí)行P(empty)操作時(shí),它將因失敗而進(jìn)入阻塞狀態(tài),它期待消費(fèi)者執(zhí)行V(empty)來(lái)喚醒自己。在此之前,它不可能執(zhí)行V(mutex)操作,從而使企圖通過(guò)P(mutex)進(jìn)入自己的臨界區(qū)的其他生產(chǎn)者和所有的消費(fèi)者進(jìn)程全部進(jìn)入阻塞狀態(tài),從而引起系統(tǒng)死鎖。類(lèi)似地,消費(fèi)者進(jìn)程若先執(zhí)行P(mutex),后執(zhí)行P(full),同樣可能造成死鎖。V(full)和V(mutex)互換位置,或者V(empty)和V(mutcx)互換位置,則不會(huì)引起死鎖,其影響只是使臨界資源的釋放略為推遲一些。2.思考在“哲學(xué)家就餐”經(jīng)典同步問(wèn)題中,如何修改程序,可以保證不會(huì)發(fā)生死鎖現(xiàn)象。(1)至多只允許有四位哲學(xué)家同
17、時(shí)去拿左邊的筷子,最終能保證至少有一位哲學(xué)家能夠進(jìn)餐,并在用畢時(shí)能釋放出他用過(guò)的兩只筷子,從而使更多的哲學(xué)家能夠進(jìn)餐。(2)僅當(dāng)哲學(xué)家的左、右兩只筷子均可用時(shí),才允許他拿起筷子進(jìn)餐。(3)規(guī)定奇數(shù)號(hào)哲學(xué)家先拿他左邊的筷子,然后再去拿右邊的筷子,而偶數(shù)號(hào)哲學(xué)家則相反。按此規(guī)定,將是1、2號(hào)哲學(xué)家競(jìng)爭(zhēng)1號(hào)筷子;3、4號(hào)哲學(xué)家競(jìng)爭(zhēng)3號(hào)筷子。即五位哲學(xué)家都先競(jìng)爭(zhēng)奇數(shù)號(hào)筷子,獲得后,再去競(jìng)爭(zhēng)偶數(shù)號(hào)筷子,最后總會(huì)有一位哲學(xué)家能獲得兩只筷子而進(jìn)餐。5. 思考在“讀者與寫(xiě)者”經(jīng)典同步問(wèn)題中,如何修改程序,變?yōu)椤皩?xiě)者優(yōu)先”的算法。(寫(xiě)者優(yōu)先的算法)var rmutex,wmutex,mutex,s:semaph
18、ore=1,1,1,1;writecount:integer:=0;reader:beginrepeatwait(s);wait(rmutex);if readcount=0 then wait(wmutex);readcount:readcount+1;signal(rmutex);signal(s);perform read operation;wait(rmutex);readcount:=readcount-1;if readcount=0 then signal(wmutex);signal(rmutex);until false ;endwriter:beginrepeatwait(mutex);i
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)墻抹灰工程勞務(wù)分包合同
- 勞務(wù)外包員工合同
- 項(xiàng)目會(huì)議記錄與總結(jié)報(bào)告
- 旅游公司客戶(hù)行程中意外事件處理協(xié)議
- 礦山環(huán)境治理與生態(tài)恢復(fù)合同
- 智慧城市綜合管理平臺(tái)建設(shè)與運(yùn)營(yíng)方案設(shè)計(jì)
- 環(huán)??萍紕?chuàng)新中心合作協(xié)議
- 個(gè)人茶園承包合同
- 蔬菜基地土地承包合同
- 境外投資項(xiàng)目銀行貸款合同
- 小學(xué)二年級(jí)體育課《團(tuán)身滾動(dòng)》教案
- 8.3 摩擦力 同步練習(xí)-2021-2022學(xué)年人教版物理八年級(jí)下冊(cè)(Word版含答案)
- 級(jí)本科診斷學(xué)緒論+問(wèn)診課件
- 初中足球選拔測(cè)試標(biāo)準(zhǔn)
- 《現(xiàn)代漢語(yǔ)詞匯》PPT課件(完整版)
- 法社會(huì)學(xué)(上課)
- 沉積學(xué)與古地理
- 生理學(xué)教學(xué)大綱
- 化工原理課程設(shè)計(jì)(換熱器)
- 環(huán)保鐵1215物質(zhì)安全資料表MSDS
- “君子教育”特色課程的探索
評(píng)論
0/150
提交評(píng)論