操作系統(tǒng)實驗報告經(jīng)典生產(chǎn)者-消費者問題范文大全修改版_第1頁
操作系統(tǒng)實驗報告經(jīng)典生產(chǎn)者-消費者問題范文大全修改版_第2頁
操作系統(tǒng)實驗報告經(jīng)典生產(chǎn)者-消費者問題范文大全修改版_第3頁
操作系統(tǒng)實驗報告經(jīng)典生產(chǎn)者-消費者問題范文大全修改版_第4頁
操作系統(tǒng)實驗報告經(jīng)典生產(chǎn)者-消費者問題范文大全修改版_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第一篇:操作系統(tǒng)實驗報告經(jīng)典生產(chǎn)者—消費者問題實驗二經(jīng)典的生產(chǎn)者—消費者問題一、目的實現(xiàn)對經(jīng)典的生產(chǎn)者—消費者問題的模擬,以便更好的理解經(jīng)典進程同步問題。二、實驗內容及要求編制生產(chǎn)者—消費者算法,模擬一個生產(chǎn)者、一個消費者,共享一個緩沖池的情形。1、實現(xiàn)對經(jīng)典的生產(chǎn)者—消費者問題的模擬,以便更好的理解此經(jīng)典進程同步問題。生產(chǎn)者-消費者問題是典型的PV操作問題,假設系統(tǒng)中有一個比較大的緩沖池,生產(chǎn)者的任務是只要緩沖池未滿就可以將生產(chǎn)出的產(chǎn)品放入其中,而消費者的任務是只要緩沖池未空就可以從緩沖池中拿走產(chǎn)品。緩沖池被占用時,任何進程都不能訪問。2、每一個生產(chǎn)者都要把自己生產(chǎn)的產(chǎn)品放入緩沖池,每個消費者從緩沖池中取走產(chǎn)品消費。在這種情況下,生產(chǎn)者消費者進程同步,因為只有通過互通消息才知道是否能存入產(chǎn)品或者取走產(chǎn)品。他們之間也存在互斥,即生產(chǎn)者消費者必須互斥訪問緩沖池,即不能有兩個以上的進程同時進行。三、生產(chǎn)者和消費者原理分析在同一個進程地址空間內執(zhí)行兩個線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放一個空緩沖區(qū)。當消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻擋,直到新的物品被生產(chǎn)出來。四、生產(chǎn)者與消費者功能描述:生產(chǎn)者功能描述:在同一個進程地址空間內執(zhí)行兩個線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。當生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一個空緩沖區(qū)。消費者功能描述:消費者線程從緩沖區(qū)獲得物品,然后釋放緩沖區(qū),當消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產(chǎn)出來。五、實驗環(huán)境操作系統(tǒng)環(huán)境:Windows系統(tǒng)。編程語言:C#。六、生產(chǎn)者與消費者的思路和設計1、程序流程圖(1)生產(chǎn)者開始生產(chǎn)產(chǎn)品Waitempty≤0YNWait緩沖區(qū)內已滿,已無可用緩沖區(qū)NMutex=1Y緩沖區(qū)正被其他程占用進存入緩沖區(qū)empty=empty-1SignalSignal(full)結束(2)消費者開始Wait(full)消費請求full≤0YNWait緩沖區(qū)內產(chǎn)品已空,不能進行消費NMutex=1Y消費緩沖區(qū)正被其他程占用進full=full-1SignalSignal結束2、主要程序代碼//初始化變量privatevoidForm1_Load(objectsender,EventArgse){mutex=1;//互斥信號量full=0;//緩沖池中滿緩沖區(qū)的數(shù)量empty=5;//緩沖池中空緩沖區(qū)的數(shù)量count1=0;//生產(chǎn)的產(chǎn)品數(shù)目i=0;="1";="0";="5";}//消費者從緩沖區(qū)中消費一個產(chǎn)品privatevoidconsumer_Click(objectsender,EventArgse){if(full>0){//消費者已進入互斥臨界區(qū)if(mutex==1)//申請進入臨界區(qū){mutex=0;//消費者已進入互斥臨界區(qū)="0";=true;//啟動消費者消費緩沖區(qū)產(chǎn)品}else{("緩沖區(qū)被占用,請等待。。。","信息提";}}else{("緩沖區(qū)為空,不能消費!","信息提示",;}}//生產(chǎn)者向緩沖區(qū)中存入一個產(chǎn)品privatevoidproducer_Click(objectsender,EventArgse){count1=count1+if(empty>0){1;////生產(chǎn)一個產(chǎn)品有緩沖區(qū)可放產(chǎn)品if(mutex==1){//申請進入臨界區(qū)mutex=0;//生產(chǎn)者已進入臨界區(qū)="0";();//啟動生產(chǎn)者將產(chǎn)品放入緩沖區(qū)}else{//不能進入臨界區(qū)count1=count1-1;("緩沖區(qū)被占用,請等待。。。","信息提示",;}}else{("緩沖區(qū)已滿!","信息提示",;//無緩沖區(qū)可放產(chǎn)品count1=count1-1;}}//生產(chǎn)者privatevoidtimer1_Tick_1(objectsender,EventArgse){if(bool1){switch(count1){case1:=true;break;case2:=true;break;case3:=true;break;case4:=true;break;case5:=true;break;}="生產(chǎn)者進程占用緩沖區(qū),請等待。。。。";bool1=false;}else{switch(count1){case1:=false;break;case2:=false;break;case3:=false;break;case4:=false;break;case5:=false;break;}="生產(chǎn)者進程占用緩沖區(qū),請等待。。。。";bool1=true;}i=i+1;if(i==5){//循環(huán)緩沖區(qū),首尾相接i=0;=false;mutex=1;="1";switch(count1){case1:=true;break;case2:=true;break;case3:=true;break;case4:=true;break;case5:=true;break;}full=full+1;=();empty=empty-1;=();="生產(chǎn)結束!";}}//消費者privatevoidtimer_consumer_Tick(objectsender,EventArgse){if(bool1){switch(count1){case1:=true;break;case2:=true;break;case3:=true;break;case4:=true;break;case5:=true;break;}="消費者進程占用緩沖區(qū),請等待。。。。";bool1=false;}else{switch(count1){case1:=false;break;case2:=false;break;case3:=false;break;case4:=false;break;case5:=false;break;}="消費者進程占用緩沖區(qū),請等待。。。。";bool1=true;}i=i+1;if(i==5){i=0;=false;mutex=1;="1";switch(count1){case1:=false;break;case2:=false;break;case3:=false;break;case4:=false;break;case5:=false;break;}count1=count1-1;full=full-1;=();empty=empty+1;=();="消費結束!";}3、運行界面和運行結果一般情況下,點一次生產(chǎn)者按紐,mutex由1變?yōu)?,緩沖區(qū)呈現(xiàn)閃爍狀態(tài)(表示正在存儲),此時不可以再進行緩沖區(qū)操作,否則將顯示“生產(chǎn)者進程正在占用緩沖區(qū),請等待”。閃爍約秒后,mutex由0變?yōu)?,閃爍停止,表示存儲過程結束;點一次消費者按紐,mutex由1變?yōu)?,緩沖區(qū)呈現(xiàn)閃爍狀態(tài)(表示正在消費),此時不可以再進行緩沖區(qū)操作,否則將顯示“消費者進程正在占用緩沖區(qū),請等待”。閃爍約秒后,mutex由0變?yōu)?,閃爍停止,表示消費過程結束。緩沖池滿后,若再點生產(chǎn)者按紐,會給出信息提示:“緩沖區(qū)已滿!”。緩沖池空后,若再點消費者按紐,也會給出信息提示:“緩沖區(qū)為空,不能消費!”。在存儲狀態(tài)或消費狀態(tài)(閃爍狀態(tài)),無論是點生產(chǎn)者按紐還是消費者按紐都會給出“緩沖區(qū)被占用,請等待。。”信息提示。七、心得體會本次實驗是關于生產(chǎn)者與消費者之間互斥和同步的問題。問題的是指是P、V操作,實驗設一個共享緩沖區(qū),生產(chǎn)者和消費者互斥的使用,當一個線程使用緩沖區(qū)的時候,另一個讓其等待直到前一個線程釋放緩沖區(qū)為止。生產(chǎn)者與消費者是一個與現(xiàn)實有關的經(jīng)驗問題,通過此原理舉一反三可以解決其他類似的問題。通過本實驗設計,我們對操作系統(tǒng)的P、V進一步的認識,深入的了解P、V操作的實質和其重要性。課本的理論知識進一步闡述了現(xiàn)實中的實際問題。實驗中,我們小組分工合作,共同學習,雖然在實驗中遇到了一些問題,但在老師和同學的細心指導和熱心幫助下解決了。同時,了解到團隊精神的重要性,也為以后的學習和工作打下了堅實的基礎,同時積累了寶貴的經(jīng)驗。第二篇:實驗4生產(chǎn)者消費者問題報告南京信息工程大學實驗(實習)報告實驗(實習)名稱生產(chǎn)者-消費者問題的模擬實現(xiàn)實驗(實習)日期2014.11.30得分指導教師陳遙系計算機專業(yè)計科年級12級班次2姓名唐薇學號20122308061一、實驗目的本實驗的目的是通過編寫和調試一個解決生產(chǎn)者–消費者問題的簡單模擬程序,進一步深入理解課堂教學中講授的進程同步問題,以及用于解決同步問題的信號量機制的基本思想,即通過研究進程同步和信號量機制實現(xiàn)生產(chǎn)者消費者問題的并發(fā)控制,以便階段性地鞏固學習成果。二、實驗內容(1)概述說明:有界緩沖區(qū)內設有20個存儲單元,放入/取出的數(shù)據(jù)項設定為1-20這20個整型數(shù)。編制程序模擬解決生產(chǎn)者-消費者同步問題。具體設計要求:(1)每個生產(chǎn)者和消費者對有界緩沖區(qū)進行操作后,即時顯示有界緩沖區(qū)的全部內容,當前指針位置和生產(chǎn)者/消費線程的標識符。(2)生產(chǎn)者和消費者各有兩個以上。(3)多個生產(chǎn)者或多個消費者之間須有共享對緩沖區(qū)進行操作的函數(shù)代碼。(2)設計原理通過一個有界緩沖區(qū)把生產(chǎn)者和消費者聯(lián)系起來。假定生產(chǎn)者和消費者的優(yōu)先級是相同的,只要緩沖區(qū)未滿,生產(chǎn)者就可以生產(chǎn)產(chǎn)品并將產(chǎn)品送入緩沖區(qū)。類似地,只要緩沖區(qū)未空,消費者就可以從緩沖區(qū)中取走產(chǎn)品。應該禁止生產(chǎn)者向滿的緩沖區(qū)送入產(chǎn)品,同時也應該禁止消費者從空的緩沖區(qū)中取出產(chǎn)品,這一機制由生產(chǎn)者線程和消費者線程之間的互斥關系來實現(xiàn)。與計算打印兩進程同步關系相同,生產(chǎn)者和消費者兩進程Producer和Consumer之間應滿足下列兩個同步條件:?只有在緩沖池中至少有一個緩沖區(qū)已存入消息后,消費者才能從中提取信息,否則消費者必須等待。?只有緩沖池中至少有一個緩沖區(qū)是空時,生產(chǎn)者才能把消息放入緩沖區(qū),否則生產(chǎn)者必須等待。為了滿足第一個同步條件,設置一個同步信號量full,它代表的資源是緩沖區(qū)滿,它的初始值為0,它的值為n時整個緩沖池滿。這個資源是消費者進程Consumer所有,Consumer進程可以申請該資源,對它施加P操作,而Consumer進程的合作進程生產(chǎn)者進程Producer對它施加V操作。同樣為了滿足第二個同步條件,設置另一個同步信號量empty,它代表的資源是緩沖空區(qū),它的初始值為n,表示緩沖池中所有緩沖區(qū)空。信號量full表示可用緩沖區(qū)數(shù)量,信號量empty表示緩沖區(qū)數(shù)量,設置整型變量:存入指針in和取出指針out。為解決生產(chǎn)者/消費者問題,應該設置兩個資源信號量,其中一個表示空緩沖區(qū)的數(shù)目,用g_hFullSemaphore表示,其初始值為有界緩沖區(qū)的大小SIZE_OF_BUFFER;另一個表示緩沖區(qū)中產(chǎn)品的數(shù)目,用g_hEmptySemaphore表示,其初始值為0。另外,由于有界緩沖區(qū)是一個臨界資源,必須互斥使用,所以還需要在設置一個互斥信號量g_hMutex,初始值為1.P原語的主要動作是:?sem(信號量)減1;?若sem減一后仍大于或等于零,則進程繼續(xù)執(zhí)行;?若sem減一后小于零,則該進程被阻塞后入與該信號相對應的隊列中,然后轉進程調度。V原語的操作主要動作是:?sem加1;?若相加結果大于零,進程繼續(xù)執(zhí)行;③若相加結果小于或等于零,則從該信號的等待隊列中喚醒一等待進程然后再返回原進程繼續(xù)執(zhí)行或轉進程調度。采用的同步方法:1)利用函數(shù)CreateMutex(NULL,FALSE,NULL)創(chuàng)建互斥信號量g_hMutex,表示緩沖區(qū)當前的狀態(tài),若為true時,則表示緩沖區(qū)正被別的進程使用。三個參數(shù)表示的意義分別為:指向安全屬性的指針,初始化互斥對象的所有者,指向互斥對象名的指針。2)利用函數(shù)CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL)創(chuàng)建緩沖區(qū)空的信號量g_hFullSemaphore,值為true時表示緩沖區(qū)已滿。四個參數(shù)分別為:表示是否允許繼承、設置信號機的初始計數(shù)、設置信號機的最大計數(shù)、指定信號機對象的名稱(-1是因為計數(shù)從開始)。3)利用函數(shù)CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)創(chuàng)建緩沖區(qū)滿的信號量g_hEmptySemaphore,該值為true時表示緩沖區(qū)為空。程序清單1.存儲結構定義利用信號量解決生產(chǎn)者消費者問題constunsignedshortSIZE_OF_BUFFER=20;//緩沖區(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;//控制程序結束HANDLEg_hMutex;//用于線程間的互斥HANDLEg_hFullSemaphore;//當緩沖區(qū)滿時迫使生產(chǎn)者等待HANDLEg_hEmptySemaphore;//當緩沖區(qū)空時迫使消費者等待DWORDWINAPIProducer(LPVOID);//生產(chǎn)者線程DWORDWINAPIConsumer(LPVOID);//消費者線程2.算法相關的函數(shù)(1)創(chuàng)建各個互斥信號以及生產(chǎn)者線程和消費者線程的函數(shù)在如下主函數(shù)里面所示:intmain(){//創(chuàng)建各個互斥信號g_hMutex=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);//調整下面的數(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[THREADS_COUNT];//各線程的handleDWORDproducerID[PRODUCERS_COUNT];//生產(chǎn)者線程的標識符DWORDconsumerID[CONSUMERS_COUNT];//消費者線程的標識符//創(chuàng)建生產(chǎn)者線程for(inti=0;i<PRODUCERS_COUNT;++i){hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);if(hThreads[i]==NULL)return-1;}//創(chuàng)建消費者線程for(i=0;i//生產(chǎn)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的ID號voidProduce(){std::cerrfor(inti=0;ifor(inti=0;iDWORDWINAPIProducer(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;}(2)消費者算法://消費者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;}?運行結果分析輸入輸出數(shù)據(jù)說明和分析:該程序設置的緩沖區(qū)數(shù)據(jù)長度為20,生產(chǎn)者個數(shù)為3,消費者個數(shù)為1,程序啟動后,生產(chǎn)者先進行生產(chǎn),當3個生產(chǎn)者全部生產(chǎn)完之后,消費者開始從緩沖區(qū)中取出產(chǎn)品,當消費者取出一個后,生產(chǎn)者開始繼續(xù)生產(chǎn),當生產(chǎn)完3個之后,消費者開始從緩沖池中取產(chǎn)品,依次循環(huán)。三、小結通過本次試驗,我對操作系統(tǒng)中線程,進程同步互斥等知識的應用有了更深的了解,我知道了生產(chǎn)者—消費者問題是很著名的同步問題,的確是既簡單又復雜。第三篇:操作系統(tǒng)課程設計生產(chǎn)者消費者湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計(操作系統(tǒng)課程設計)生產(chǎn)者和消費1湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計者學生姓名:學生學號:班級:0311401、02、03、04班制二〇一三年十二月一、課程題目分析這個題目是生產(chǎn)者向消費者提供商品,消費者消耗商品,并且兩組人共用同一緩沖區(qū)。生產(chǎn)者提供了商品之后消費者才能去取商品,消費者若不取走商品則當緩沖區(qū)用完之后生產(chǎn)者則不能再向緩沖區(qū)中添加新的商品。思考問題:(1)對于生產(chǎn)者進程:每產(chǎn)生一個數(shù)據(jù),則需去訪問共用緩沖區(qū)是否有已滿,未滿則可以將該數(shù)據(jù)存入并通知消費者進程,否則不能。(2)對于消費者進程:每當想去消費(取出數(shù)據(jù))時,則需訪問緩沖區(qū)是否為空,為空則不能消費(取出數(shù)據(jù)),否則可以取,并通知生產(chǎn)者。(3)緩沖區(qū)是個臨界資源,所有的進程對于該空間都是共享的,所以,還有互斥問題存在。二、課程設計目的通過實驗模擬生產(chǎn)者與消費者之間的關系,了解并掌握他們之間的關系及原理。由此增加對進程同步問題的了解:(1)掌握基本的同步互斥算法,理解生產(chǎn)者與消費者模型(2)了解windows中多線程(多進程)的并發(fā)執(zhí)行機制,線程(進程)間的同步于互斥(3)學習使用windows中基本的同步對象,掌握相應的API。三、課程設計內容有n個生產(chǎn)者和m個消費者,連接在具有k個單位緩沖區(qū)的有界環(huán)轉緩沖上,2湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計故又稱有界緩沖問題。其中Pi和Cj都是并發(fā)進程,只要緩沖區(qū)未滿,生產(chǎn)者進程Pi所生產(chǎn)的產(chǎn)品就可投入緩沖區(qū);類似地,只要緩沖區(qū)非空,消費者進程Cj就可以從緩沖區(qū)取走并消耗產(chǎn)品。四、開發(fā)環(huán)境操作系統(tǒng):Windows系統(tǒng)編寫語言:C++語言五、系統(tǒng)分析設計(一)算法原理生產(chǎn)者——消費者問題是典型的進程同步問題,這些進程必須按照一定的生產(chǎn)率和消費率來訪問共享緩沖區(qū),用P、V操作解決生產(chǎn)者和消費者共享單緩沖區(qū)的問題,可設置兩個信號量empty和full,其初值分別為1和0,empty指示能否向緩沖區(qū)放入產(chǎn)品,full指示能否從緩沖區(qū)取出產(chǎn)品。為了使其協(xié)調工作,必須使用一個信號量mutex(初值為1),以限制生產(chǎn)者和消費者互斥地對緩沖區(qū)進行存取,另用兩個信號量empty1(初值為緩沖區(qū)大小)和full1(初值為0),以保證生產(chǎn)者不向已滿的緩沖區(qū)中放入產(chǎn)品,消費者不從空緩沖區(qū)中取產(chǎn)品。(二)功能描述生產(chǎn)者功能描述:在同一個進程地址空間內執(zhí)行兩個線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。當生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一個空緩沖區(qū)。消費者功能描述:消費者線程從緩沖區(qū)獲得物品,然后釋放緩沖區(qū),當消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產(chǎn)出來。(三)算法流程圖生產(chǎn)者流程圖:消費者流程圖:3湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計總的流程圖:湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計開始Inti=1,n鍵盤輸入數(shù)字,初始化nSeqSquare*b;b=newSeqSquare(n);鍵盤輸入數(shù)字,改變i的值i==0?Y退出Ncout(四)數(shù)據(jù)結構及部分函數(shù)描述(1)類SeqSquare:對類SeqSquare的聲明及其中一些函數(shù)classSeqSquare{public:SeqSquare(intn);~SeqSquare();voidP(intx);//p操作voidV(intx);//v操作boolIsEmpty();//判斷是否為空5湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計boolIsFull();//判斷是否已滿voiddeca();voiddecb();intgetSize();intgetmaxSize();intgettop();intgeta();intgetb();protected:private:};說明:①用動態(tài)整型數(shù)組*elements來代表緩沖區(qū),不管是生產(chǎn)產(chǎn)品還是對已有產(chǎn)品的消費都需要訪問該緩沖區(qū)。②函數(shù)IsFull()用于判斷緩沖區(qū)是否已滿,生產(chǎn)者能否使用緩沖區(qū)。③函數(shù)IsEmpty()用于判斷緩沖區(qū)是否為空,消費者能否使用緩沖區(qū)。(2)生產(chǎn)者和消費者操作及顯示函數(shù)showbuf:voidproducer(SeqSquare*a)//生產(chǎn)者操作{}voidconsumer(SeqSquare*a)//消費者操作{}//緩沖區(qū)顯示voidshowbuf(SeqSquare*a){}(3)在實現(xiàn)本程序的生產(chǎn)者消費者模型時,具體地通過以下同步對象實現(xiàn)互斥:6int*elements;inttop,a,b,maxSize;a->P(1);a->V(1);inti=a->getSize();湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計①設一個互斥量Mutex,以實現(xiàn)生產(chǎn)者在查詢和保留緩沖區(qū)的下一個空位置時進行互斥。②每一個生產(chǎn)者用一個信號量與消費者同步,通過設置Full實現(xiàn),該組信號量用于表示相應產(chǎn)品以生產(chǎn)。同時用一個表示空緩沖區(qū)數(shù)目的信號量Empty進行類似的同步,指示緩沖區(qū)中是否存在空位置,以便開始生產(chǎn)下一個產(chǎn)品。(四)調試過程為解決生產(chǎn)者、消費者問題,應該設置兩個資源信號量,其中一個表示空緩沖區(qū)的數(shù)目,用Full表示,其初值為用戶輸入的緩沖區(qū)的大小,另一個表示緩沖區(qū)中產(chǎn)品的數(shù)目,用Empty表示,其初值為0.另外,由于緩沖區(qū)是一個臨界資源,必須互斥使用,所以還需要再設置一個互斥信號量Mutex,其初值為1.在生產(chǎn)者、消費者問題中,信號量實現(xiàn)兩種功能。首先,他是生產(chǎn)產(chǎn)品和消費產(chǎn)品的計數(shù)器,計數(shù)器的初值是可使用的資源數(shù)目(緩沖區(qū)的長度)。其次,他是確保產(chǎn)品的生產(chǎn)者和消費者之間的動作同步的同步器。生產(chǎn)者要生產(chǎn)一個產(chǎn)品時,首先對資源信號量Full和互斥信號量Mutex進行P操作,申請資源。如果可以通過的話,就生產(chǎn)一個產(chǎn)品,并把產(chǎn)品送人緩沖區(qū)。然后對互斥信號量Mutex和資源信號量Empty進行V操作,釋放資源。消費者要消費一個產(chǎn)品時,首先對資源信號量Empty和互斥信號量Mutex進行P操作,申請資源。如果可以通過的話就從緩沖區(qū)取出一個產(chǎn)品并消費掉。然后對互斥信號量Mutex和資源信號量Full進行V操作,釋放資源。如果緩沖區(qū)中已經(jīng)沒有可用資源,就把申請資源的進程添加到等待隊列的隊尾。如果有一個資源被釋放,在等待隊列中的第一個進程被喚醒并取得這個資源的使用權。(五)參考資料《操作系統(tǒng)教程》孫鐘秀高等教育出版社《C++程序設計》譚浩強高等教育出版社六、運行實例及結果分析(一)運行實例緩沖區(qū)大小為3,先生產(chǎn)一件產(chǎn)品,顯示緩沖區(qū),再接著生產(chǎn)一件產(chǎn)品,消耗一件產(chǎn)品,顯示緩沖區(qū),在消耗兩件產(chǎn)品,再生產(chǎn)4件產(chǎn)品,改變緩沖區(qū)的大小為6,顯示緩沖區(qū),選擇一個未出現(xiàn)的選項,退出程序。(二)結果顯示7湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計8湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計(三)結果分析(1)在每個程序中需要先做P,后做V,二者要成對出現(xiàn),夾在二者中間的代碼段就是該進程的臨界區(qū)。(2)對同步信號量full和empty的P,V操作同樣必須成對出現(xiàn),但它們分別位于不同的程序中。(3)無論在生產(chǎn)者進程中還是消費者進程中,兩個P操作的次序不能顛倒:應先執(zhí)行同步信號量的P操作,然后執(zhí)行互斥信號量的P操作。否則可能造成進程死鎖。七、個人體驗雖然我也很想用java語言寫這個程序,但是由于自己學藝不精,所以只能用C++寫。通過這個實驗我發(fā)現(xiàn)我以前有很多知識都忘記了,重新拿起課本學習9湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計時發(fā)現(xiàn)原來很多不懂得問題都有了新的認識,有一種豁然開朗的感覺。也為我考研開了一個好的開頭。我認為我完成的這個設計做的比較出色的地方是對C++語言中類以及數(shù)組的運用,其實這里我對數(shù)組的操作是按照“先進先出”的方法進行運作的,這是參考了棧的工作原理,因為緩沖區(qū)一般也是堆棧,比較符合設計要求。這次實驗中我感覺做的很粗糙,自己所想的模擬過程的確得到實現(xiàn)了,但是感覺靈活性不太高,思考還不過全面,應該以后多注意一下,多考慮考慮才是。在這次實驗中我重新將《C++程序設計》和《數(shù)據(jù)結構》的幾個重要章節(jié)復習了一遍,對類、數(shù)組、C++的I/O流類庫以及堆棧的語句格式、注意細節(jié)都再一次熟悉,感覺蠻有趣的。不過,在編程過程中許多語句的小問題還真是出現(xiàn)不少,而且感覺自己對C++強大豐富的語句方法用得太呆板,不夠靈活,總是想到那些常用的,而忽略了顆粒讓語句更簡短的方法,以后要多多注意才是。八、附錄//生產(chǎn)者消費者1.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include"iostream"usingnamespacestd;classSeqSquare{public:SeqSquare(intn);~SeqSquare();voidP(intx);//p操作voidV(intx);//v操作boolIsEmpty();//判斷是否為空boolIsFull();//判斷是否已滿voiddeca();voiddecb();intgetSize();intgetmaxSize();intgettop();intgeta();intgetb();protected:private:int*elements;inttop,a,b,maxSize;};10湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計boolSeqSquare::IsEmpty()//判斷是否為空{return(top==-1)?true:false;}boolSeqSquare::IsFull()//判斷是否已滿{return(top>=maxSize-1)?true:false;}voidSeqSquare::deca(){a--;}voidSeqSquare::decb(){b--;}intSeqSquare::getSize(){returntop+1;}intSeqSquare::getmaxSize(){returnmaxSize;}intSeqSquare::gettop(){returntop;}intSeqSquare::geta(){returna;}intSeqSquare::getb(){11湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計returnb;}SeqSquare::SeqSquare(intn){top=-1;a=b=0;maxSize=n;elements=newint[maxSize];}voidSeqSquare::P(intx){if(IsFull()==true){a=a+1;}else{elements[++top]=x;}}voidSeqSquare::V(intx){if(IsEmpty()==true){b=b+1;}else{x=elements[top--];}}12湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計voidproducer(SeqSquare*a)//生產(chǎn)者操作{a->P(1);}voidconsumer(SeqSquare*a)//消費者操作{a->V(1);}SeqSquare::~SeqSquare(){deleteelements;}//緩沖區(qū)顯示voidshowbuf(SeqSquare*a){inti=a->getSize();}intmain(){inti,n;cout>n;SeqSquare*s;s=newSeqSquare(n);while(i!=4){cout"4.退出系統(tǒng)。"">i;switch(i){case1:producer(s);if(s->geta()==0){13湖北民族學院信息工程學院11級計算機專業(yè)操作系統(tǒng)課程設計cout}else{couts->deca();}break;case2:consumer(s);if(s->getb()==0){cout}else{cout}break;case3:showbuf(s);coutgetSize()"getSize())break;case4:coutbreak;case5:coutcin>>n;s=newSeqSquare(n);coutbreak;default:cout}}return0;}第四篇:實驗報告五生產(chǎn)者和消費者問題實驗報告五——生產(chǎn)者和消費者問題姓名:叢菲學號:20100830205班級:信息安全二班一、實習內容??1、模擬操作系統(tǒng)中進程同步和互斥2、實現(xiàn)生產(chǎn)者和消費者問題的算法實現(xiàn)二、實習目的?????1、熟悉臨界資源、信號量及PV操作的定義與物理意義2、了解進程通信的方法3、掌握進程互斥與進程同步的相關知識4、掌握用信號量機制解決進程之間的同步與互斥問題5、實現(xiàn)生產(chǎn)者-消費者問題,深刻理解進程同步問題三、實習題目?在Linux操作系統(tǒng)下用C實現(xiàn)經(jīng)典同步問題:生產(chǎn)者—消費者,具體要求如下:(1)一個大小為10的緩沖區(qū),初始狀態(tài)為空。(2)2個生產(chǎn)者,隨機等待一段時間,往緩沖區(qū)中添加數(shù)據(jù),若緩沖區(qū)已滿,等待消費者取走數(shù)據(jù)之后再添加,重復10次。(3)2個消費者,隨機等待一段時間,從緩沖區(qū)中讀取數(shù)據(jù),若緩沖區(qū)為空,等待生產(chǎn)者添加數(shù)據(jù)之后再讀取,重復10次。?提示本實驗的主要目的是模擬操作系統(tǒng)中進程同步和互斥。在系統(tǒng)進程并發(fā)執(zhí)行異步推進的過程中,由于資源共享和進程間合作而造成進程間相互制約。進程間的相互制約有兩種不同的方式。(1)間接制約。這是由于多個進程共享同一資源(如CPU、共享輸入/輸出設備)而引起的,即共享資源的多個進程因系統(tǒng)協(xié)調使用資源而相互制約。(2)直接制約。只是由于進程合作中各個進程為完成同一任務而造成的,即并發(fā)進程各自的執(zhí)行結果互為對方的執(zhí)行條件,從而限制各個進程的執(zhí)行速度。生產(chǎn)者和消費者是經(jīng)典的進程同步問題,在這個問題中,生產(chǎn)者不斷的向緩沖區(qū)中寫入數(shù)據(jù),而消費者則從緩沖區(qū)中讀取數(shù)據(jù)。生產(chǎn)者進程和消費者對緩沖區(qū)的操作是互斥,即當前只能有一個進程對這個緩沖區(qū)進行操作,生產(chǎn)者進入操作緩沖區(qū)之前,先要看緩沖區(qū)是否已滿,如果緩沖區(qū)已滿,則它必須等待消費者進程將數(shù)據(jù)取出才能寫入數(shù)據(jù),同樣的,消費者進程從緩沖區(qū)讀取數(shù)據(jù)之前,也要判斷緩沖區(qū)是否為空,如果為空,則必須等待生產(chǎn)者進程寫入數(shù)據(jù)才能讀取數(shù)據(jù)。在本實驗中,進程之間要進行通信來操作同一緩沖區(qū)。一般來說,進程間的通信根據(jù)通信內容可以劃分為兩種:即控制信息的傳送與大批量數(shù)據(jù)傳送。有時,也把進程間控制在本實驗中,進程之間要進行通信來操作同一緩沖區(qū)。一般來說,進程間的通信根據(jù)通信內容可以劃分為兩種:即控制信息的傳送與大批量數(shù)據(jù)傳送。有時,也把進程間控制信息的交換稱為低級通信,而把進程間大批量數(shù)據(jù)的交換稱為高級通信。目前,計算機系統(tǒng)中用得比較普遍的高級通信機制可分為3大類:共享存儲器系統(tǒng)、消息傳遞系統(tǒng)及管道通信系統(tǒng)。?共享存儲器系統(tǒng)共享存儲器系統(tǒng)為了傳送大量數(shù)據(jù),在存儲器中劃出一塊共享存儲區(qū),諸進程可通過對共享存儲區(qū)進行讀數(shù)據(jù)或寫數(shù)據(jù)以實現(xiàn)通信。進程在通信之前,向系統(tǒng)申請共享存儲區(qū)中的一個分區(qū),并為它指定一個分區(qū)關鍵字。信息的交換稱為低級通信,而把進程間大批量數(shù)據(jù)的交換稱為高級通信。目前,計算機系統(tǒng)中用得比較普遍的高級通信機制可分為3大類:共享存儲器系統(tǒng)、消息傳遞系統(tǒng)及管道通信系統(tǒng)。?消息傳遞系統(tǒng)在消息傳遞系統(tǒng)中,進程間的數(shù)據(jù)交換以消息為單位,在計算機網(wǎng)絡中被稱為報文。消息傳遞系統(tǒng)的實現(xiàn)方式又可以分為以下兩種:(1)直接通信方式發(fā)送進程可將消息直接發(fā)送給接收進程,即將消息掛在接收進程的消息緩沖隊列上,而接收進程可從自己的消息緩沖隊列中取得消息。(2)間接通信方式發(fā)送進程將消息發(fā)送到指定的信箱中,而接收進程從信箱中取得消息。這種通信方式又稱信箱通信方式,被廣泛地應用于計算機網(wǎng)絡中。相應地,該消息傳遞系統(tǒng)被稱為電子郵件系統(tǒng)。?管道通信系統(tǒng)向管道提供輸入的發(fā)送進程,以字符流方式將大量的數(shù)據(jù)送入管道,而接收進程從管道中接收數(shù)據(jù)。由于發(fā)送進程和接收進程是利用管道進行通信的,故稱為管道通信。為了協(xié)調發(fā)送和接收雙方的通信,管道通信機制必須提供以下3方面的協(xié)調功能。(1)互斥當一個進程正在對pipe文件進行讀或寫操作時,另一個進程必須等待。(2)同步當寫進程把一定數(shù)量的數(shù)據(jù)寫入pipe文件后,便阻塞等待,直到讀進程取走數(shù)據(jù)后,再把寫進程喚醒。(3)確認對方是否存在只有確定對方已存在時,才能進行管道通信,否則會造成因對方不存在而無限制地等待。在這個問題當中,我們采用信號量機制進行進程之間的通信,設置兩個信號量,空的信號量和滿的信號量。在Linux系統(tǒng)中,一個或多個信號量構成一個信號量集合。使用信號量機制可以實現(xiàn)進程之間的同步和互斥,允許并發(fā)進程一次對一組信號量進行相同或不同的操作。每個P、V操作不限于減1或加1,而是可以加減任何整數(shù)。在進程終止時,系統(tǒng)可根據(jù)需要自動消除所有被進程操作過的信號量的影響1.緩沖區(qū)采用循環(huán)隊列表示,利用頭、尾指針來存放、讀取數(shù)據(jù),以及判斷隊列是否為空。緩沖區(qū)中數(shù)組大小為10;2.利用隨機函數(shù)rand()得到A~Z的一個隨機字符,作為生產(chǎn)者每次生產(chǎn)的數(shù)據(jù),存放到緩沖區(qū)中;3.使用shmget()系統(tǒng)調用實現(xiàn)共享主存段的創(chuàng)建,shmget()返回共享內存區(qū)的ID。對于已經(jīng)申請到的共享段,進程需把它附加到自己的虛擬空間中才能對其進行讀寫。4.信號量的建立采用semget()函數(shù),同時建立信號量的數(shù)量。在信號量建立后,調用semctl()對信號量進行初始化,例如本實習中,可以建立兩個信號量SEM_EMPTY、SEM_FULL,初始化時設置SEM_EMPTY為10,SEM_FULL為0。使用操作信號的函數(shù)semop()做排除式操作,使用這個函數(shù)防止對共享內存的同時操作。對共享內存操作完畢后采用shmctl()函數(shù)撤銷共享內存段。5.使用循環(huán),創(chuàng)建2個生產(chǎn)者以及2個消費者,采用函數(shù)fork()創(chuàng)建一個新的進程。6.一個進程的一次操作完成后,采用函數(shù)fflush()刷新緩沖區(qū)。7.程序最后使用semctl()函數(shù)釋放內存。模擬程序的程序流程圖如下所示:1.主程序流程圖:2.生產(chǎn)者進程流程圖3.消費者進程流程圖4.P操作流程圖5.V操作流程圖四、實現(xiàn)代碼為://exet5.cpp//#include"stdafx.h"#include#include#definemSIZE3#definepSIZE20staticintmemery[mSIZE]={0};staticintprocess[pSIZE]={0};//staticintprocess[pSIZE]={2,3,2,1,5,2,4,5,3,2,5,2};//staticintprocess[pSIZE]={7,10,1,2,10,3,10,4,2,3,10,3,2,1,2,10,1,7,10,1};voidbuild();voidLRU();intmain(intargc,char*argv[]){printf("Randomsequenceisasfollows:\n");build();printf("\nInvokingLRUAlgorithn:\n");LRU();return0;}voidbuild(){inti=0;for(i=0;i{process[i]=(int)(10.0*rand()/(RAND_MAX));printf("%d",process[i]);}printf("\n");}voidLRU(){intflag[mSIZE]={0};inti=0,j=0;intm=-1,n=-1;intmax=-1,maxflag=0;intcount=0;for(i=0;i//FindthefirstfreePhysicalBlockfor(j=0;j{if(memery[j]==0){m=j;break;}}//Findiftherearesameprocessesfor(j=0;j{if(memery[j]==process[i]){n=j;}}//FindfreePBfor(j=0;j{if(flag[j]>maxflag){maxflag=flag[j];max=j;}}if(n==-1)//Findnosameprocess{if(m!=-1)//findfreePB{memery[m]=process[i];flag[m]=0;for(j=0;j{flag[j]++;}m=-1;}else//NOfindfreePB{memery[max]=process[i];flag[max]=0;for(j=0;j{flag[j]++;}max=-1;maxflag=0;count++;}}else//Findsameprocess{memery[n]=process[i];flag[n]=0;if(m!=-1)//findfreePB{flag[m]=0;}for(j=0;j{flag[j]++;}max=-1;maxflag=0;n=-1;}for(j=0;j{printf("%d",memery[j]);}printf("\n");}printf("\nTheis:%d\n",count);}timesofpageconversion五、在虛擬機上的具體操作及結果執(zhí)行exe5.c文件選擇ApplicationsAcecessoriesTerminal,執(zhí)行文件:依次預處理編譯匯編連接執(zhí)行用文件,編譯通過之后-o執(zhí)行。報錯!?。?!錯誤顯示為很多頭文件沒有預定義。連續(xù)查找之后得知原因是鏈接不上pthread庫在執(zhí)行命令后面加上-pthread,即新命令格式為:gcc-oexe5exe5.c–lpthread,重新執(zhí)行后的結果顯示如下截圖:其中1表示緩沖區(qū)被生產(chǎn)者producer1或者二producer2寫入了Item,0表示沒有寫入數(shù)據(jù)或者被消費者consumer1或者consumer2消耗掉六、實驗總結及思考1、本次實驗是關于生產(chǎn)者與消費者之間互斥和同步的問題。問題的是指是P、V操作,實驗設一個共享緩沖區(qū),生產(chǎn)者和消費者互斥的使用,當一個線程使用緩沖區(qū)的時候,另一個讓其等待直到前一個線程釋放緩沖區(qū)為止。2、實驗中包含的知識點很多,包括臨界區(qū)資源共享問題、信號量定義、PV操作流程、進程間的通信方式(消息傳遞和共享內存)、進程同步和互斥、信號量機制解決進程之間的同步與互斥問題等等。加深了對于本部分內容的理解通過本實驗設計,我們對操作系統(tǒng)的P、V進一步的認識,深入的了解P、V操作的實質和其重要性。課本的理論知識進一步闡述了現(xiàn)實中的實際問題。第五篇:生產(chǎn)者與消費者的問題操作系統(tǒng)課程設計閩江學院計算機系網(wǎng)絡操作系統(tǒng)課程設計設計內容:進程機制與并發(fā)程序設計——linux下生產(chǎn)者與消費者的問題實現(xiàn)目錄:一、設計內容····························3二、設計思想····························4三、系統(tǒng)結構····························5四、PV操作代碼··························5五、C++程序代碼·························6六、運行結果截圖························9七、參考文獻····························11八、實驗總結····························11一、設計內容進程機制與并發(fā)程序設計————linux下生產(chǎn)者與消費者的問題實現(xiàn)1.實驗目的(1)掌握基本的同步互斥算法,理解生產(chǎn)者和消費者同步的問題模型。(2)了解linux中多線程的并發(fā)執(zhí)行機制,線程間的同步和互斥。2、實驗環(huán)境:C/C++語言編譯器3、實驗要求(1)創(chuàng)建生產(chǎn)者和消費者線程在linux環(huán)境下,創(chuàng)建一個控制臺進程,在此進程中創(chuàng)建n個線程來模擬生產(chǎn)者或者消費者。這些線程的信息由本程序定義的“測試用例文件”中予以指定。該文件的格式和含義如下:31P32P43C414P25C3124第一行說明程序中設置幾個臨界區(qū),其余每行分別描述了一個生產(chǎn)者或者消費者線程的信息。每一行的各字段間用Tab鍵隔開。不管是消費者還是生產(chǎn)者,都有一個對應的線程號,即每一行開始字段那個整數(shù)。第二個字段用字母P或者C區(qū)分是生產(chǎn)者還是消費者。第三個字段表示在進入相應線程后,在進行生產(chǎn)和消費動作前的休眠時間,以秒計時;這樣做的目的是可以通過調整這一列參數(shù),控制開始進行生產(chǎn)和消費動作的時間。如果是代表生產(chǎn)者,則該行只有三個字段。如果代表消費者,則該行后邊還有若干字段,代表要求消費的產(chǎn)品所對應的生產(chǎn)者的線程號。所以務必確認這些對應的線程號存在并且該線程代表一個生產(chǎn)者。(2)生產(chǎn)和消費的規(guī)則在按照上述要求創(chuàng)建線程進行相應的讀寫操作時,還需要符合以下要求:①共享緩沖區(qū)存在空閑空間時,生產(chǎn)者即可使用共享緩沖區(qū)。②從上邊的測試數(shù)據(jù)文件例子可以看出,某一生產(chǎn)者生產(chǎn)一個產(chǎn)品后,可能不止一個消費者,或者一個消費者多次地請求消費該產(chǎn)品。此時,只有當所有的消費需求都被滿足以后,該產(chǎn)品所在的共享緩沖區(qū)才可以被釋放,并作為空閑空間允許新的生產(chǎn)者使用。③每個消費者線程的各個消費需求之間存在先后順序。例上述測試用例文件包含一行信息“5C3l24”,可知這代表一個消費者線程,該線程請求消費1,2,4號生產(chǎn)者線程生產(chǎn)的產(chǎn)品。而這種消費是有嚴格順序的,消費1號線程產(chǎn)品的請求得到滿足后才能繼續(xù)往下請求2號生產(chǎn)者線程的產(chǎn)品。④要求在每個線程發(fā)出讀寫操作申請、開始讀寫操作和結束讀寫操作時分別顯示提示信息。(3)相關基礎知識本實驗所使用的生產(chǎn)者和消費者模型具有如下特點:本實驗的多個緩沖區(qū)不是環(huán)形循環(huán)的,也不要求按順序訪問。生產(chǎn)者可以把產(chǎn)品放到目前某一個空緩沖區(qū)中。消費者只消費指定生產(chǎn)者的產(chǎn)品。在測試用例文件中指定了所有的生產(chǎn)和消費的需求,只有當共享緩沖區(qū)的數(shù)據(jù)滿足了所有關于它的消費需求后,此共享緩沖區(qū)才可以作為空閑空間允許新的生產(chǎn)者使用。本實驗在為生產(chǎn)者分配緩沖區(qū)時各生產(chǎn)者間必須互斥,此后各個生產(chǎn)者的具體生產(chǎn)活動可以并發(fā)。而消費者之間只有在對同一產(chǎn)品進行消費時才需要互斥,同時它們在消費過程結束時需要判斷該消費對象是否已經(jīng)消費完畢并清除該產(chǎn)品。linux用來實現(xiàn)同步和互斥的實體。在linux中,常見的同步對象有:信號量(Semaphore)、互斥量(Mutex)、臨界段(CriticalSection)等。使用這些對象都分為三個步驟,一是創(chuàng)建或者初始化:接著請求該同步對象,隨即進入臨界區(qū),這一步對應于互斥量的上鎖;最后釋放該同步對象,這對應于互斥量的解鎖。這些同步對象在一個線程中創(chuàng)建,在其他線程中都可以使用,從而實現(xiàn)同步互斥。二、設計思想生產(chǎn)者進程與消費者進程是經(jīng)典的同步互斥關系。系統(tǒng)創(chuàng)建兩類進程:proceducer()和consumer(),分別用來描述生產(chǎn)者和消費者的行為。生產(chǎn)者與消費者問題是指若干進程通過循環(huán)緩沖池區(qū)交換數(shù)據(jù)。如下圖所示,生產(chǎn)者進程不斷向循環(huán)緩沖池區(qū)中寫入數(shù)據(jù)(即生產(chǎn)數(shù)據(jù)),而消費者進程不斷從循環(huán)緩沖池區(qū)中讀出數(shù)據(jù)(即消費數(shù)據(jù))。循環(huán)緩沖池共有N個緩沖區(qū),緩沖區(qū)可以暫存一個產(chǎn)品,任何時刻只能有一個進程課對循環(huán)緩沖池進行操作。所有生產(chǎn)者和消費者要協(xié)調工作,以完成數(shù)據(jù)的交換。只要有空緩沖區(qū),生產(chǎn)者就可以把產(chǎn)品送入緩沖區(qū);只要有滿緩沖區(qū),消費者就可以從緩沖區(qū)中取走物品。為了解決生產(chǎn)者和消費者問題,應該設置信號量和變量如下:full:滿緩沖區(qū)資源信號量,初值為0;empty:空緩沖區(qū)資源信號量,初值為n;in:生產(chǎn)者指針,初值均為0;out:消費者指針,均為0;mutex:緩沖區(qū)操作的互斥信號量,初值為1三、系統(tǒng)結構PCB*readyhead=NULL,*readytail=NULL;//就緒隊列——鏈表結構PCB*consumerhead=NULL,*consumertail=NULL;//消費者隊列PCB*producerhead=NULL,*producertail=NULL;//生產(chǎn)者隊列processproc()給PCB分配內存,產(chǎn)生相應的的進程Pempty()如果緩沖區(qū)滿,該進程進入生產(chǎn)者等待隊列;linkqueue(exe,&producertail);//把就緒隊列里的進程放入生產(chǎn)者隊列的尾部執(zhí)行順序:Main()emptyinfulloutfinish當緩沖池為空時,生產(chǎn)者生產(chǎn)產(chǎn)品in緩沖池in=in+1當緩沖池為滿時,消費者消費產(chǎn)品out緩沖池out=out+1四、PV操作代碼semaphoreempty=n;semaphorefull=0;semaphoremutex=1;messagebuffer[n];intin=0;intout=0;voidmain(){parbegin(proceducer(),consumer());}voidproceducer(){do{prodeceanewmeddage;P(empty);P(mutex);sendanewmessagetobuffer[in];in=(in+1)%n;V(mutex);V(full);

溫馨提示

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

評論

0/150

提交評論