操作系統(tǒng)實驗報告 生產(chǎn)者_第1頁
操作系統(tǒng)實驗報告 生產(chǎn)者_第2頁
操作系統(tǒng)實驗報告 生產(chǎn)者_第3頁
操作系統(tǒng)實驗報告 生產(chǎn)者_第4頁
操作系統(tǒng)實驗報告 生產(chǎn)者_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

肇慶學院計算機學院實驗報告專業(yè)網(wǎng)絡(luò)工程班級10網(wǎng)工1班姓名學號課程名稱計算機操作系統(tǒng)學年2011--2012學期1口/2| 課程類別專業(yè)必修?限選口任選口實踐口實驗名稱:實驗四生產(chǎn)者一一消費者問題算法的實現(xiàn)(選做)?實驗內(nèi)容:實驗時間:2012年5月9日?實驗內(nèi)容:問題描述:一組生產(chǎn)者向一組消費者提供消息,它們共享一個有界緩沖池,生產(chǎn)者向其中投放消息,消費者從中取得消息。假定這些生產(chǎn)者和消費者互相等效,只要緩沖池未滿,生產(chǎn)者可將消息送入緩沖池,只要緩沖池未空,消費者可從緩沖池取走一個消息。功能要求:根據(jù)進程同步機制,編寫一個解決上述問題的程序,可顯示緩沖池狀態(tài)、放數(shù)據(jù)、取數(shù)據(jù)等過程。n個緩沖區(qū)n個緩沖區(qū)(Buffer)?實驗?zāi)康募耙螅阂弧?目的了解信號量的使用。加深對信號量機制的理解。要求理解生產(chǎn)者與消費者問題模型,掌握解決該問題的算法思想。掌握正確使用同步機制的方法。?實驗內(nèi)容、方法與步驟:(使用附頁填寫并附在本頁后)?實驗結(jié)果:(使用附頁填寫并附在本頁后)?小結(jié):本次課程設(shè)是關(guān)于生產(chǎn)者與消費者之間互斥和同步的問題。問題的實質(zhì)是P、V操作,實驗設(shè)一個共享緩沖區(qū),生產(chǎn)者和消費者互斥的使用,當一個線程使用緩沖區(qū)的時候,另一個讓其等待直到前一個線程釋放緩沖區(qū)為止。生產(chǎn)者與消費者是一個與現(xiàn)實有關(guān)的經(jīng)典問題,與“和尚挑水”問題的原理相同,通過此原理舉一反三可以解決其他類似的問題。過本課程設(shè)計,我們對操作系統(tǒng)的p、v進一步的認識,深入的了解p、v操作的實質(zhì)和其重要性。課本的理論知識進一步闡述了現(xiàn)實中的實際問題。分數(shù):批閱老師:2012年月日

分數(shù):批閱老師:2012年月日肇慶學院計算機學院肇慶學院計算機學院實驗報告(附頁)實驗內(nèi)容、方法與步驟:實驗方法與步驟:生產(chǎn)者功能描述:在同一個進程地址空間內(nèi)執(zhí)行的兩個線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。當生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一個空緩沖區(qū)。消費者功能描述:消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產(chǎn)出來。程序結(jié)構(gòu)圖:生產(chǎn)指針 浦普指針Consufiier1Consumer2生產(chǎn)指針 浦普指針Consufiier1Consumer2ConsumerNProducer2ProducerM滿/空共享緩沖區(qū)指針移動方向數(shù)據(jù)結(jié)構(gòu)分析生產(chǎn)者與消費者實現(xiàn):這其中主要是通過多線程,來實現(xiàn)生產(chǎn)者和消費者之間的協(xié)調(diào)問題。生產(chǎn)者(producer) 消費者(consumer):通過一些記錄性變量,來記錄模擬實現(xiàn)生產(chǎn)者的行為,通過輸入語句的提示程序采用OO設(shè)計模式,緩存區(qū)采用數(shù)組結(jié)構(gòu)存儲。生產(chǎn)者與消費者問題算法的實現(xiàn)代碼#include<windows.h>#include<iostream>constunsignedshortSIZE_OF_BUFFER=10;//緩沖區(qū)長度unsignedshortProductID=0; 〃產(chǎn)品號unsignedshortConsumeID=0; 〃將被消耗的產(chǎn)品號unsignedshortin=0; 〃產(chǎn)品進緩沖區(qū)時的緩沖區(qū)下標unsignedshortout=0; 〃產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標intg_buffer[SIZE_OF_BUFFER]; //緩沖區(qū)是個循環(huán)隊列boolg_continue=true; 〃控制程序結(jié)束HANDLEg_hMutex; 〃用于線程間的互斥HANDLEg_hFullSemaphore; 〃當緩沖區(qū)滿時迫使生產(chǎn)者等待HANDLEg_hEmptySemaphore; 〃當緩沖區(qū)空時迫使消費者等待DWORDWINAPIProducer(LPVOID); 〃生產(chǎn)者線程DWORDWINAPIConsumer(LPVOID); 〃消費者線程intmain(){〃創(chuàng)建各個互斥信號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),當生產(chǎn)者個數(shù)多于消費者個數(shù)時,//生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費者;反之,消費者經(jīng)常等待constunsignedshortPRODUCERS_COUNT=3;〃生產(chǎn)者的個數(shù)constunsignedshortCONSUMERS_COUNT=1;//消費者的個數(shù)〃總的線程數(shù)constunsignedshortTHREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLEhThreads[PRODUCERS_COUNT];/各線程的handleDWORDproducerID[CONSUMERS_COUNT];//生產(chǎn)者線程的標識符DWORDconsumerID[THREADS_COUNT];/艄費者線程的標識符〃創(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)建消費者線程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()){//按回車后終止程序運行g(shù)_continue=false;}}return0;}//生產(chǎn)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的ID號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ū)當前的狀態(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<<”<--消費”;std::cout<<std::endl;}}//從緩沖區(qū)中取出一個產(chǎn)品voidTake(){std::cerr<<"Takingaproduct...”;ConsumeID=g_buffer[out];out=(out+1)%SIZE_OF_BUFFER;std::cerr<<"Succeed"<<std::endl;〃輸出緩沖區(qū)當前的狀態(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<<"<--消費”;std::cout<<std::endl;}}//消耗一個產(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;}//消費者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實驗結(jié)果:1.一個消費者三個生產(chǎn)者:2ICJW'區(qū)區(qū)區(qū)區(qū)區(qū)ffffffffff實驗結(jié)果:1.一個消費者三個生產(chǎn)者:2ICJW'?進程同步實驗一一生產(chǎn)者與消費善問題算法實現(xiàn)%£消費者…BglWW產(chǎn)一個產(chǎn)品編號為:3M新生產(chǎn)的產(chǎn)品放入緩神區(qū)..顯示緩神區(qū)當前的狀態(tài),號號編12品產(chǎn)號^0123456789區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)區(qū)ffffffffff抑ffffffffff2.2.三個生產(chǎn)者三個消費者:圈程同步實驗一生產(chǎn)者與消費者問題算法實現(xiàn)ksx3[打消費者…愚回&肖耕產(chǎn)品:-蟲產(chǎn)一個產(chǎn)品 編號為&5卜巴新生產(chǎn)的產(chǎn)品放入緩沖區(qū)一屈示緩沖區(qū)當前的狀態(tài)二消費生產(chǎn)0000消費生產(chǎn)00000,押沖沖沖沖沖神戶戶戶外-KEKEKEKEKEKEKEKEKEKE■i<i-_..4I:,;:;:::;:;:;:::3?三個消費者一個生產(chǎn)者:短口瑪由冀譴程同步實驗一產(chǎn)漕與消費者問題管法實現(xiàn)活x3[3個消費者..H3屈f二不A富 羸尊化新生產(chǎn)的產(chǎn)品放入緩抻

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論