![實驗二生產(chǎn)者和消費者_第1頁](http://file4.renrendoc.com/view/20365894ac6e526fa09d4e1aebdf33ad/20365894ac6e526fa09d4e1aebdf33ad1.gif)
![實驗二生產(chǎn)者和消費者_第2頁](http://file4.renrendoc.com/view/20365894ac6e526fa09d4e1aebdf33ad/20365894ac6e526fa09d4e1aebdf33ad2.gif)
![實驗二生產(chǎn)者和消費者_第3頁](http://file4.renrendoc.com/view/20365894ac6e526fa09d4e1aebdf33ad/20365894ac6e526fa09d4e1aebdf33ad3.gif)
![實驗二生產(chǎn)者和消費者_第4頁](http://file4.renrendoc.com/view/20365894ac6e526fa09d4e1aebdf33ad/20365894ac6e526fa09d4e1aebdf33ad4.gif)
![實驗二生產(chǎn)者和消費者_第5頁](http://file4.renrendoc.com/view/20365894ac6e526fa09d4e1aebdf33ad/20365894ac6e526fa09d4e1aebdf33ad5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1.1實驗?zāi)繕?biāo)掌握操作系統(tǒng)對進程管理的同步和互斥問題,以經(jīng)典同步問題“生產(chǎn)者和消費者”為例, 運用所學(xué)C語言知識,編寫該問題的模擬運行環(huán)境。1.2實驗環(huán)境教學(xué)機房,C語言程序平臺。1.3實驗內(nèi)容及步驟了解經(jīng)典同步問題“生產(chǎn)者和消費者”生產(chǎn)者與消費者可以通過一個環(huán)形緩沖池聯(lián)系起來,環(huán)形緩沖池由幾個大小相等的緩沖 塊組成,每個緩沖塊容納一個產(chǎn)品。每個生產(chǎn)者可不斷地每次往緩沖池中送一個生產(chǎn)產(chǎn)品, 而每個消費者則可不斷地每次從緩沖池中取出一個產(chǎn)品。指針i和指針j分別指出當(dāng)前的第 一個空緩沖塊和第一個滿緩沖塊。分析和理解既存在合作同步問題,也存在臨界區(qū)互斥問題合作同步:當(dāng)緩沖池全滿時,表示供過于求,生產(chǎn)
2、者必須等待,同時喚醒消費者;當(dāng)緩 沖池全空時,表示供不應(yīng)求,消費者應(yīng)等待,同時喚醒生產(chǎn)者?;コ猓壕彌_池顯然是臨界資源,所在生產(chǎn)者與消費都要使用它,而且都要改變它的狀態(tài)?;诃h(huán)形緩沖區(qū)的生產(chǎn)者與消費者關(guān)系形式描述:公用信號量mutex:初值為1,用于實現(xiàn)臨界區(qū)互斥生產(chǎn)者私用信號量empty:初值為n,指示空緩沖塊數(shù)目消費者私用信號量full:初值為0,指示滿緩沖塊數(shù)目整型量i和j初值為0,i指示首空緩沖塊序號,j指示首滿緩沖塊序號PV原語var mutex,empty,full:semaphore;i,j:integer;buffer:array0.n-1 of item;i:=j:=1;Pro
3、cedure 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);goods:=buffer(j);j:=(j+1) mod n;V(mutex);V(empty);consume a product;end;end;用C語言編程搭建“生產(chǎn)者和消費者”經(jīng)典進程通信問題的環(huán)境。要求程序運行時, 按任意鍵停止,顯示當(dāng)前
4、系統(tǒng)的各個參數(shù)的值。提交實驗報告,以及相關(guān)程序列表。打包成 附件上傳。#include #include #include #define P(S) WaitForSingleObject(S,INFINITE)/定義 Windows 下的 P 操作#define V(S) ReleaseSemaphore(S,1,NULL)/定義 Windows 下的 V 操作#define rate 1000#define CONSUMER_NUM 10/*消費者個數(shù)*/#define PRODUCER_NUM 10/*生產(chǎn)者個數(shù)*/#define BUFFER_NUM 4/* 緩沖區(qū)個數(shù)*/typede
5、f HANDLE Semaphore; /信號量的 Windows 原型char *thing10= 物品 1,物品 2,物品 3,物品 4,物品 5,物品6,物品7,物品8,物品9,物品10;struct Bufferint productBUFFER_NUM; /緩沖區(qū)int start,end;/兩個指針g_buf; Semaphore g_semBuffer,g_semProduct,g_mutex;消費者線程DWORD WINAPI Consumer(LPVOID para)int i=*(int *)para; /i表示第i個消費者int ptr,j;/彳寺消費的內(nèi)容的指針Slee
6、p(100);while(1)P(g_semProduct); /有產(chǎn)品,先鎖住緩沖區(qū)P(g_mutex);/記錄消費的物品ptr=g_buf.start;/再移動緩沖區(qū)指針g_buf.start=(g_buf.start+1)%BUFFER_NUM;V(g_mutex);/讓其他消費者或生產(chǎn)者使用g_bufprintf( 消費者 %d: 消費 了 buf%d 里的 =%sn,i,ptr,thingg_ductptr);Sleep(rate*rand()%10+110);消費完畢,并釋放一個緩沖V(g_semBuffer);if(j+30)break;getchar();retu
7、rn 0;/ 生產(chǎn)者線程DWORD WINAPI Producer(LPVOID para)int i=*(int *)para-CONSUMER_NUM;int ptr;int data;/產(chǎn)品Sleep(100);while(1)Sleep(rate*rand()%10+110);data=rand()%10;/等待存放空間P(g_semBuffer); /有地方,先鎖住緩沖區(qū)P(g_mutex);/ 記錄消費的物品ptr=g_buf.end;/ 再移動緩沖區(qū)指針g_buf.end=(g_buf.end+1)%BUFFER_NUM;/讓其他消費者或生產(chǎn)者使用g_bufV(g_mutex);
8、printf( 生產(chǎn)者 %d: 在 buf%d 里放入T%sn,i,ptr,thingdata);g_ductptr=data;Sleep(rate/2*rand()%10+110);放好了完畢,釋放一個產(chǎn)品V(g_semProduct);return 0;int main(int argc,char *argv)線程技術(shù),前面為消費者線程,后面為生產(chǎn)者線程HANDLE hThreadCONSUMER_NUM+PRODUCER_NUM; /線程計數(shù)/srand(time();DWORD tid;int i=0;/ 初始化信號量g_mutex=CreateSemaphore(NUL
9、L,BUFFER_NUM,BUFFER_NUM,mutexOfConsumerAndProducer );g_semBuffer=CreateSemaphore(NULL,BUFFER_NUM,BUFFER_NUM,BufferSemaphone);g_semProduct=CreateSemaphore(NULL,0,BUFFER_NUM,ProductSemaphone);if(!g_semBuffer|!g_semProduct|!g_mutex)printf(Create Semaphone Error!n);return -1;int totalThreads=CONSUMER_NU
10、M+PRODUCER_NUM;/ 開啟消費者線程for(i=0;iCONSUMER_NUM;i+)hThreadi=CreateThread(NULL,0,Consumer,&i,0,&tid);if(hThreadi)WaitForSingleObject(hThreadi,10);開啟生產(chǎn)者線程for(;itotalThreads;i+)hThreadi=CreateThread(NULL,0,Producer,&i,0,&tid);if(hThreadi)WaitForSingleObject(hThreadi,10);生產(chǎn)者和消費者的執(zhí)行WaitForMultipleObjects(t
11、otalThreads,hThread,TRUE,INFINITE);return 0;c: *C : Docti*ents and SettingsStudent桌面D昂口莒,生產(chǎn)者和消貴者-se4 8 9 9一 4 8 9 9=1口=1口 U 口 U 口 2 5 11 品品品品循循循循品品品品 物物物卷辨物物物物00 2 5 11 7 7 7 7.品品品品卻卻卻卻品品品品物物物物婿婿婿普物物物一-哭.昊.昊.哭.-一 了了了了的的的的了了了了的的的的了了了了的的的的 m 一 -m - -m - -H二 H二5一 -m - -H二 Xm 一 -RI 一 -FH 一-m 二?.E- -E- -
12、 MT| tdT| E - -E - -S-B- 一 E - -E - - E- -E-板 1 1 1 1 爭fbfbfbf .斤.斤.斤.E D 1 2 3 .斥.斤D 1 2 3 .斤.n .斤 d 1 2 3a二B-B-a二BB二B-B-B-m 二E-E-E-E- f f f f E-E-E-E- f f f f E-E-E-E- f f f fJJJJUUUUJJJJUUUUJJJJUUUU0123bbbb0123bbbb0123bbbbf了了了了ffff了了了了ffff了了了了bubububu費費費費bubububu費費費費bubububu費費費費:s倦語語 :s:s倦 語:s:s4
13、56745678901890123452345者者者者者者者者者者者者者者者者者者者者者者者者產(chǎn)_.u -Ti -Ti -Ti Eun.-EJI.-Eun.-Eun.Auli rr Tr, rr -ET-.-ET.=ET.,-ET.,r r -Ti rr-T- -EJ.-EJ-E.-Eun.-生生生生生生生生生生生生.產(chǎn)費費費費產(chǎn)產(chǎn).費費費費產(chǎn)產(chǎn)產(chǎn)產(chǎn)費費費費1.4實驗思考題思考在“生產(chǎn)者和消費者”經(jīng)典同步問題中,兩個P操作是否可以互換位置,以及兩 個V操作是否可以互換位置。在生產(chǎn)者-消費者問題中,如果將兩個P操作,即P(full)和P(mutex)互換位置,或者 P(empty)和P(mute
14、x)互換位置,都可能引起死鎖。考慮系統(tǒng)中緩沖區(qū)全滿時,若以生產(chǎn)者 進程先執(zhí)行了 P(mutex)操作并獲得成功,當(dāng)再執(zhí)行P(empty)操作時,他將因失敗而進入阻 塞狀態(tài),它期待消費者執(zhí)行V(empty)來喚醒自己。在此之前,它不可能執(zhí)行V(mutex)操作, 從而使企圖通過P(mutex)進入自己的臨界區(qū)的其他生產(chǎn)者和所有消費者進程全部進入阻塞 狀態(tài),從而引起系統(tǒng)死鎖。類似地,消費者進程若先執(zhí)行P(mutex),后執(zhí)行P(full),同樣 可能造成死鎖。V(full)和V(mutex)互換位置,或者V(empty)和V(mutex)互換位置,則不會 引起死鎖,其影響只是使臨界資源的釋放略微推
15、遲一些。思考在“哲學(xué)家就餐”經(jīng)典同步問題中,如何修改程序,可以保證不會發(fā)生死鎖現(xiàn)象。至多只允許有四位哲學(xué)家同時去拿左邊的筷子,最終能保證至少有一位哲學(xué)家能 夠進餐,并在用畢是能釋放出他用過的兩只筷子,從而使更多的哲學(xué)家能夠進餐。僅當(dāng)哲學(xué)家的左、右兩只筷子均可使用時,才允許他拿起筷子進餐。規(guī)定奇數(shù)號哲學(xué)家先拿他左邊的筷子,然后再去拿右邊的筷子,而偶數(shù)號哲學(xué)家 則相反。按此規(guī)定,將是1、2號哲學(xué)家競爭1號筷子;3、4號哲學(xué)家競爭3號筷子。即五 位哲學(xué)家都先競爭奇數(shù)號筷子,獲得后,再去競爭偶數(shù)號筷子,最后總會有一位哲學(xué)家能獲 得兩只筷子而進餐。思考在“讀者與寫者”經(jīng)典同步問題中,如何修改程序,變?yōu)椤?/p>
16、寫者優(yōu)先”的算法。(寫者優(yōu)先算法)Var rmutex,wmutex,mutex,s:semaphore=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:=readcount-1;If readcount=0 then signal(wmutex);Signal(rmutex);Until false;EndWriter:beginRepeatWait(mutex);If writecount=0 then wait(s);Writecount:writecount+1;Signal(mutex);Wait(wmutex);Perform write operatin;Signal(wmutex);Wait(mutex);Writecount=0 then signal(s);Signal(mutex);Until false;end分析以下進程運行環(huán)境中出現(xiàn)的同步和互斥現(xiàn)象,列出相應(yīng)的變量和參
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年五年級班主任工作總結(jié)下模版(三篇)
- 2025年二手房中介購房合同標(biāo)準(zhǔn)版本(三篇)
- 2025年中外來料加工或來件裝配合同樣本(三篇)
- 住宅小區(qū)石材裝修合同模板
- 2025年度安全風(fēng)險評估與費用預(yù)算合同
- 民航器材物流承攬合同模板
- 貴州球場塑膠跑道施工方案
- 保險公司單項裝修合同
- 寵物醫(yī)院裝飾協(xié)議
- 藝術(shù)顧問提成方案
- 國開行政管理論文行政組織的變革及其現(xiàn)實性研究
- 運動技能學(xué)習(xí)中的追加反饋
- 高中體育與健康-足球-腳內(nèi)側(cè)傳球射門技術(shù)(第二課時)教學(xué)課件設(shè)計
- 《淄博張店區(qū)停車問題治理現(xiàn)狀及優(yōu)化對策分析【開題報告+正文】15000字 》
- 常用電子元器件基礎(chǔ)知識演示
- GB/T 32918.4-2016信息安全技術(shù)SM2橢圓曲線公鑰密碼算法第4部分:公鑰加密算法
- 2023年藥事法規(guī)教學(xué)案例庫及案例分析
- 北京市水務(wù)安全生產(chǎn)風(fēng)險評估指南
- 吸引器教學(xué)講解課件
- 醫(yī)學(xué)心理學(xué)人衛(wèi)八版66張課件
- 仿古建筑施工常見質(zhì)量通病及防治措施
評論
0/150
提交評論