版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
肇慶學(xué)院計(jì)算機(jī)學(xué)院實(shí)驗(yàn)報(bào)告專業(yè)網(wǎng)絡(luò)工程班級(jí)10網(wǎng)工1班姓名學(xué)號(hào)課程名稱計(jì)算機(jī)操作系統(tǒng)學(xué)年2011--2012學(xué)期1口/2| 課程類別專業(yè)必修?限選口任選口實(shí)踐口實(shí)驗(yàn)名稱:實(shí)驗(yàn)四生產(chǎn)者一一消費(fèi)者問題算法的實(shí)現(xiàn)(選做)?實(shí)驗(yàn)內(nèi)容:實(shí)驗(yàn)時(shí)間:2012年5月9日?實(shí)驗(yàn)內(nèi)容:問題描述:一組生產(chǎn)者向一組消費(fèi)者提供消息,它們共享一個(gè)有界緩沖池,生產(chǎn)者向其中投放消息,消費(fèi)者從中取得消息。假定這些生產(chǎn)者和消費(fèi)者互相等效,只要緩沖池未滿,生產(chǎn)者可將消息送入緩沖池,只要緩沖池未空,消費(fèi)者可從緩沖池取走一個(gè)消息。功能要求:根據(jù)進(jìn)程同步機(jī)制,編寫一個(gè)解決上述問題的程序,可顯示緩沖池狀態(tài)、放數(shù)據(jù)、取數(shù)據(jù)等過程。n個(gè)緩沖區(qū)n個(gè)緩沖區(qū)(Buffer)?實(shí)驗(yàn)?zāi)康募耙螅阂弧?目的了解信號(hào)量的使用。加深對(duì)信號(hào)量機(jī)制的理解。要求理解生產(chǎn)者與消費(fèi)者問題模型,掌握解決該問題的算法思想。掌握正確使用同步機(jī)制的方法。?實(shí)驗(yàn)內(nèi)容、方法與步驟:(使用附頁(yè)填寫并附在本頁(yè)后)?實(shí)驗(yàn)結(jié)果:(使用附頁(yè)填寫并附在本頁(yè)后)?小結(jié):本次課程設(shè)是關(guān)于生產(chǎn)者與消費(fèi)者之間互斥和同步的問題。問題的實(shí)質(zhì)是P、V操作,實(shí)驗(yàn)設(shè)一個(gè)共享緩沖區(qū),生產(chǎn)者和消費(fèi)者互斥的使用,當(dāng)一個(gè)線程使用緩沖區(qū)的時(shí)候,另一個(gè)讓其等待直到前一個(gè)線程釋放緩沖區(qū)為止。生產(chǎn)者與消費(fèi)者是一個(gè)與現(xiàn)實(shí)有關(guān)的經(jīng)典問題,與“和尚挑水”問題的原理相同,通過此原理舉一反三可以解決其他類似的問題。過本課程設(shè)計(jì),我們對(duì)操作系統(tǒng)的p、v進(jìn)一步的認(rèn)識(shí),深入的了解p、v操作的實(shí)質(zhì)和其重要性。課本的理論知識(shí)進(jìn)一步闡述了現(xiàn)實(shí)中的實(shí)際問題。分?jǐn)?shù):批閱老師:2012年月日
分?jǐn)?shù):批閱老師:2012年月日肇慶學(xué)院計(jì)算機(jī)學(xué)院肇慶學(xué)院計(jì)算機(jī)學(xué)院實(shí)驗(yàn)報(bào)告(附頁(yè))實(shí)驗(yàn)內(nèi)容、方法與步驟:實(shí)驗(yàn)方法與步驟:生產(chǎn)者功能描述:在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行的兩個(gè)線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個(gè)空緩沖區(qū)中供消費(fèi)者線程消費(fèi)。當(dāng)生產(chǎn)者線程生產(chǎn)物品時(shí),如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費(fèi)者線程釋放出一個(gè)空緩沖區(qū)。消費(fèi)者功能描述:消費(fèi)者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當(dāng)消費(fèi)者線程消費(fèi)物品時(shí),如果沒有滿的緩沖區(qū),那么消費(fèi)者線程將被阻塞,直到新的物品被生產(chǎn)出來。程序結(jié)構(gòu)圖:生產(chǎn)指針 浦普指針Consufiier1Consumer2生產(chǎn)指針 浦普指針Consufiier1Consumer2ConsumerNProducer2ProducerM滿/空共享緩沖區(qū)指針移動(dòng)方向數(shù)據(jù)結(jié)構(gòu)分析生產(chǎn)者與消費(fèi)者實(shí)現(xiàn):這其中主要是通過多線程,來實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者之間的協(xié)調(diào)問題。生產(chǎn)者(producer) 消費(fèi)者(consumer):通過一些記錄性變量,來記錄模擬實(shí)現(xiàn)生產(chǎn)者的行為,通過輸入語(yǔ)句的提示程序采用OO設(shè)計(jì)模式,緩存區(qū)采用數(shù)組結(jié)構(gòu)存儲(chǔ)。生產(chǎn)者與消費(fèi)者問題算法的實(shí)現(xiàn)代碼#include<windows.h>#include<iostream>constunsignedshortSIZE_OF_BUFFER=10;//緩沖區(qū)長(zhǎng)度unsignedshortProductID=0; 〃產(chǎn)品號(hào)unsignedshortConsumeID=0; 〃將被消耗的產(chǎn)品號(hào)unsignedshortin=0; 〃產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)unsignedshortout=0; 〃產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)intg_buffer[SIZE_OF_BUFFER]; //緩沖區(qū)是個(gè)循環(huán)隊(duì)列boolg_continue=true; 〃控制程序結(jié)束HANDLEg_hMutex; 〃用于線程間的互斥HANDLEg_hFullSemaphore; 〃當(dāng)緩沖區(qū)滿時(shí)迫使生產(chǎn)者等待HANDLEg_hEmptySemaphore; 〃當(dāng)緩沖區(qū)空時(shí)迫使消費(fèi)者等待DWORDWINAPIProducer(LPVOID); 〃生產(chǎn)者線程DWORDWINAPIConsumer(LPVOID); 〃消費(fèi)者線程intmain(){〃創(chuàng)建各個(gè)互斥信號(hào)g_hMutex=CreateMutex(NULL,FALSE,NULL);g_hFullSemaphoreCreateSemaphore(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)常等待constunsignedshortPRODUCERS_COUNT=3;〃生產(chǎn)者的個(gè)數(shù)constunsignedshortCONSUMERS_COUNT=1;//消費(fèi)者的個(gè)數(shù)〃總的線程數(shù)constunsignedshortTHREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLEhThreads[PRODUCERS_COUNT];/各線程的handleDWORDproducerID[CONSUMERS_COUNT];//生產(chǎn)者線程的標(biāo)識(shí)符DWORDconsumerID[THREADS_COUNT];/艄費(fèi)者線程的標(biāo)識(shí)符〃創(chuàng)建生產(chǎn)者線程for(inti=0;i<PRODUCERS_COUNT;++i){hThreads[i]=CreateThread(NULL,0jProducer,NULL,0,&producerID[i]);if(hThreads[i]==NULL)return-1;}〃創(chuàng)建消費(fèi)者線程for(i=0;i<CONSUMERS_COUNT;++i){hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);if(hThreads[i]==NULL)return-1;}while(g_continue){if(getchar()){//按回車后終止程序運(yùn)行g(shù)_continue=false;}}return0;}//生產(chǎn)一個(gè)產(chǎn)品。簡(jiǎn)單模擬了一下,僅輸出新產(chǎn)品的ID號(hào)voidProduce(){std::cerr<<"Producing"<<++ProductID<<"...";std::cerr<<"Succeed"<<std::endl;}//把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)voidAppend(){std::cerr<<"Appendingaproduct...";g_buffer[in]=ProductID;in=(in+1)%SIZE_OF_BUFFER;std::cerr<<"Succeed"<<std::endl;//輸出緩沖區(qū)當(dāng)前的狀態(tài)for(inti=0;i<SIZE_OF_BUFFER;++i){std::cout<<i<<":"<<g_buffer[i];if(i==in)std::cout<<"<--生產(chǎn)”;if(i==out)std::cout<<”<--消費(fèi)”;std::cout<<std::endl;}}//從緩沖區(qū)中取出一個(gè)產(chǎn)品voidTake(){std::cerr<<"Takingaproduct...”;ConsumeID=g_buffer[out];out=(out+1)%SIZE_OF_BUFFER;std::cerr<<"Succeed"<<std::endl;〃輸出緩沖區(qū)當(dāng)前的狀態(tài)for(inti=0;i<SIZE_OF_BUFFER;++i){std::cout<<i<<":"<<g_buffer[i];if(i==in)std::cout<<"<--生產(chǎn)”;if(i==out)std::cout<<"<--消費(fèi)”;std::cout<<std::endl;}}//消耗一個(gè)產(chǎn)品voidConsume(){std::cerr<<"Consuming"<<ConsumeID<<"...";std::cerr<<"Succeed"<<std::endl;}//生產(chǎn)者DWORDWINAPIProducer(LPVOIDlpPara){while(g_continue){WaitForSingleObject(g_hFullSemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);}return0;}//消費(fèi)者DWORDWINAPIConsumer(LPVOIDlpPara){while(g_continue){WaitForSingleObject(g_hEmptySemaphore,INFINITE);
WaitForSingleObject(g_hMutex,INFINITE);Take();Consume();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL);}return0;}區(qū)區(qū)區(qū)區(qū)區(qū)ffffffffff實(shí)驗(yàn)結(jié)果:1.一個(gè)消費(fèi)者三個(gè)生產(chǎn)者:2ICJW'區(qū)區(qū)區(qū)區(qū)區(qū)ffffffffff實(shí)驗(yàn)結(jié)果:1.一個(gè)消費(fèi)者三個(gè)生產(chǎn)者:2ICJW'?進(jìn)程同步實(shí)驗(yàn)一一生產(chǎn)者與消費(fèi)善問題算法實(shí)現(xiàn)%£消費(fèi)者…BglWW產(chǎn)一個(gè)產(chǎn)品編號(hào)為:3M新生產(chǎn)的產(chǎn)品放入緩神區(qū)..顯示緩神區(qū)當(dāng)前的狀態(tài),號(hào)號(hào)編12品產(chǎn)號(hào)^0123456789區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)ffffffffff抑ffffffffff2.2.三個(gè)生產(chǎn)者三個(gè)消費(fèi)者:圈程同步實(shí)驗(yàn)一生產(chǎn)者與消費(fèi)者問題算法實(shí)現(xiàn)ksx3[打消費(fèi)者…愚回&肖耕產(chǎn)品:-蟲產(chǎn)一個(gè)產(chǎn)品 編號(hào)為&5卜巴新生產(chǎn)的產(chǎn)品放入緩沖區(qū)一屈示緩沖區(qū)當(dāng)前的狀態(tài)二消費(fèi)生產(chǎn)0000消費(fèi)生產(chǎn)00000,押沖沖沖沖沖神戶戶戶外-KEKEKEKEKEKEKEKEKEKE■i<i-_..4I:,;:;:::;:;:;:::3?三個(gè)消費(fèi)者一個(gè)生產(chǎn)者:短口瑪由冀譴程同步實(shí)驗(yàn)一產(chǎn)漕與消費(fèi)者問題管法實(shí)現(xiàn)活x3[3個(gè)消費(fèi)者..H3屈f二不A富 羸尊化新生產(chǎn)的產(chǎn)品放入緩抻
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畫廊周邊綠化施工協(xié)議
- 臨時(shí)校車照管員招聘協(xié)議
- 企業(yè)購(gòu)房合同樣式及注意事項(xiàng)
- 臨時(shí)工使用管理辦法:IT行業(yè)
- 水資源開發(fā)河壩施工合同文本
- 幼兒園進(jìn)出口安全管理協(xié)議
- 師帶徒教學(xué)管理計(jì)劃
- 影視設(shè)備產(chǎn)品認(rèn)證管理辦法
- 環(huán)保工程排柵施工承包合同
- 信息技術(shù)領(lǐng)域合伙協(xié)議
- 餐飲服務(wù)掛靠合同
- 消防工程質(zhì)量保修協(xié)議
- 地貌與公路工程-山嶺地貌(工程地質(zhì)課件)
- 在高中語(yǔ)文課堂中開展愛國(guó)主義教育的策略探究獲獎(jiǎng)科研報(bào)告
- 江蘇省常州市金壇區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期中英語(yǔ)試卷
- 湖北省武漢市2022-2023學(xué)年八年級(jí)上學(xué)期語(yǔ)文期中試卷(含答案)
- 1000字作文稿紙模板(完美修正版)
- 中學(xué)學(xué)生操行等級(jí)評(píng)定表
- 鋼結(jié)構(gòu)施工安全技術(shù)交底
- 體育專業(yè)英語(yǔ)全套教學(xué)課件
- 新時(shí)代女大學(xué)生修養(yǎng)智慧樹知到課后章節(jié)答案2023年下棗莊學(xué)院
評(píng)論
0/150
提交評(píng)論