![生產(chǎn)者消費者問題模擬實現(xiàn)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/1bfe7aae-60e7-4ecb-8801-42f668ffc08d/1bfe7aae-60e7-4ecb-8801-42f668ffc08d1.gif)
![生產(chǎn)者消費者問題模擬實現(xiàn)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/1bfe7aae-60e7-4ecb-8801-42f668ffc08d/1bfe7aae-60e7-4ecb-8801-42f668ffc08d2.gif)
![生產(chǎn)者消費者問題模擬實現(xiàn)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/1bfe7aae-60e7-4ecb-8801-42f668ffc08d/1bfe7aae-60e7-4ecb-8801-42f668ffc08d3.gif)
![生產(chǎn)者消費者問題模擬實現(xiàn)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/1bfe7aae-60e7-4ecb-8801-42f668ffc08d/1bfe7aae-60e7-4ecb-8801-42f668ffc08d4.gif)
![生產(chǎn)者消費者問題模擬實現(xiàn)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/8/1bfe7aae-60e7-4ecb-8801-42f668ffc08d/1bfe7aae-60e7-4ecb-8801-42f668ffc08d5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、生產(chǎn)者消費者問題模擬實現(xiàn)(z)生產(chǎn)者-消費者實驗1.1 實驗目的和要求1.1.1 實驗目的操作系統(tǒng)的基本控制和管理控制都圍繞著進程展開,其中的復雜性是由于支持并發(fā)和并發(fā)機制而引起的。自從操作系統(tǒng)中引入并發(fā)程序設(shè)計后,程序的執(zhí)行不再是順序的,一個程序未執(zhí)行完而另一個程序便已開始執(zhí)行,程序外部的順序特性消失,程序與計算不再一一對應。并發(fā)進程可能是無關(guān)的,也可能是交互的。然而,交互的進程共享某些變量,一個進程的執(zhí)行可能會影響其他進程的執(zhí)行結(jié)果,交互的并發(fā)進程之間具有制約關(guān)系、同步關(guān)系。其中典型模型便是生產(chǎn)者-消費者模型。本實驗通過編寫和調(diào)試生產(chǎn)者-消費者模擬程序,進一步認識進程并發(fā)執(zhí)行的實質(zhì),加深對
2、進程競爭關(guān)系,協(xié)作關(guān)系的理解,掌握使用信號量機制與P、V操作來實現(xiàn)進程的同步與互斥。1.1.2 實驗要求1 .用高級語言編寫一個程序,模擬多個生產(chǎn)者進程和多個消費者進程并發(fā)執(zhí)行,并采用信號量機制與P、V操作實現(xiàn)進程間同步與互斥。2 .撰寫實驗報告,報告應包含以下內(nèi)容:(1)(2)(3)(4)(5) 明;(6)(7)(8)實驗目的;實驗內(nèi)容;設(shè)計思路;程序流程圖;程序中主要數(shù)據(jù)結(jié)構(gòu)和函數(shù)說帶注釋的源程序代碼;程序運行結(jié)果及分析;實驗收獲與體會。1.2預備知識1.2.1 生產(chǎn)者一消費者問生產(chǎn)者一消費者問題表述如下:如圖3.1所示,有n個生產(chǎn)者和m個消費者,連接在具有k個單位緩沖區(qū)的有界環(huán)狀緩沖上,
3、故又稱有界緩沖問題。生產(chǎn)者不斷生成產(chǎn)品,只要緩沖區(qū)未滿,生產(chǎn)者進程pi所生產(chǎn)的產(chǎn)品就可投入緩沖區(qū);類似的,只要緩沖區(qū)非空,消費者進程cj就可以從緩沖區(qū)取走并消耗產(chǎn)品。生首生產(chǎn)者生產(chǎn)者圖3.1生產(chǎn)者一消費者問題示意圖著名的生產(chǎn)者一消費者問題(producer-consumerproblem)是計算機操作系統(tǒng)中并發(fā)進程內(nèi)在關(guān)系的一種抽象,是典型的進程同步問題。在操作系統(tǒng)中,生產(chǎn)者進程可以是計算進程、發(fā)送進程,而消費者進程可以是打印進程、接收進程等,解決好生產(chǎn)者一消費者問題就解決了一類并發(fā)進程的同步問題。操作系統(tǒng)實現(xiàn)進程同步的機制稱為同步機制,它通常由同步原語組成。不同的同步機制采用不同的同步方法,
4、迄今已設(shè)計出多種同步機制,本實驗采用最常用的同步機制:信號量及PV操作。1.1.3信號量與PV操作1965年,荷蘭計算機科學家E.W.Dijkstra提出新的同步工具一一信號量和PV操作,他將交通管制中多種顏色的信號燈管理方法引入操作系統(tǒng),讓多個進程通過特殊變量展開交互。一個進程在某一關(guān)鍵點上被迫停止直至接收到對應的特殊變量值,通過這一措施任何復雜的進程交互要求均可得到滿足,這種特殊變量就是信號量(semaphore)。為了通過信號量傳送信號,進程可利用P和V兩個特殊操作來發(fā)送和接收信號,如果協(xié)作進程的相應信號仍未到達,則進程被掛起直至信號到達為止。在操作系統(tǒng)中用信號量表示物理資源的實體,它是
5、一個與隊列有關(guān)的整型變量。具體實現(xiàn)時,信號量是一種變量類型,用一個記錄型數(shù)據(jù)結(jié)構(gòu)表示,有兩個分量:一個是信號量的值,另一個是信號量隊列的指針。信號量在操作系統(tǒng)中主要用于封鎖臨界區(qū)、進程同步及維護資源計數(shù)。除了賦初值之外,信號量僅能由同步原語PV對其操作,不存在其他方法可以檢查或操作信號量,PV操作的不可分割性確保執(zhí)行的原子性及信號量值的完整性。利用信號量和PV操作即可解決并發(fā)進程競爭問題,又可解決并發(fā)進程協(xié)作問題。信號量按其用途可分為兩種:公用信號量,聯(lián)系一組并發(fā)進程,相關(guān)進程均可在此信號量上執(zhí)行PV操作,用于實現(xiàn)進程互斥;私有信號量,聯(lián)系一組并發(fā)進程,僅允許此信號量所擁有的進程執(zhí)行P操作,而
6、其他相關(guān)進程可在其上執(zhí)行V操作,初值往往為0或正整數(shù),多用于并發(fā)進程同步。信號量的定義為如下數(shù)據(jù)結(jié)構(gòu):typedefstructsemaphore信號量的值信號量隊列的指intvalue;/structpcb*list;/針信號量說明:semaphores;P、V操作原語描述如下:(1) P(s):s.value-;若s.value>0,則執(zhí)行P(s)的進程繼續(xù)執(zhí)行;若s.value<0,則執(zhí)行P(s)的進程被阻塞,并把它插入到等待信號量s的阻塞隊列中。V(s):s.value+;若s.value<0,則執(zhí)行V(s)的進程從等待信號量s的阻塞隊列中喚醒頭一個進程,然后自己繼續(xù)
7、執(zhí)行。若s.value>0)則執(zhí)行V的進程繼續(xù)執(zhí)行;1.1.4信號量實現(xiàn)互斥信號量和PV操作可用來解決進程互斥問題。為使多個進程能互斥地訪問某臨界資源,只需為該資源設(shè)置一互斥信號量mutex,并置初值為1,然后將各進程訪問該資源的臨界區(qū)置于P(mutex)和V(mutex)操作之間即可。用信號量和PV操作管理并發(fā)進程互斥進入臨界區(qū)的一般形式為:semaphoremutex;mutex=1;cobeginprocessPi()/*i=1,2,)n*/P(mutex);/*臨界區(qū)*/V(mutex);coend當有進程在臨界區(qū)中時)mutex的值為0或負值,否則mutex值為1,因為只有一個
8、進程,可用P操作把mutex減至0,故可保證互斥操作,這時試圖進入臨界區(qū)的其它進程會因執(zhí)行P(mutex)而被迫等待。mutex的取值范圍是1-(n-1),表明有一個進程在臨界區(qū)內(nèi)執(zhí)行,最多有n-1個進程在信號量隊列中等待。1.1.5信號量解決生產(chǎn)者一消費者問題信號量和PV操作不僅可以解決進程互斥問題,而且是實現(xiàn)進程同步的有力工具。在協(xié)作進程之間,一個進程的執(zhí)行依賴于協(xié)作進程的信息或消息,在尚未得到來自協(xié)作進程的信號或消息時等待,直至信號或消息到達時才被喚醒。生產(chǎn)者一消費者問題是典型的進程同步問題,對于生產(chǎn)者進程:生產(chǎn)一個產(chǎn)品,當要送入緩沖區(qū)時,要檢查是否有空緩沖區(qū),若有,則可將產(chǎn)品送入緩沖區(qū)
9、,并通知消費者進程;否則,等待;對于消費者進程:當它去取產(chǎn)品時,要看緩沖區(qū)中是否有產(chǎn)品可取,若有則取走一個產(chǎn)品,并通知生產(chǎn)者進程,否則,等待。這種相互等待,并互通信息就是典型的進程同步。因此應該設(shè)兩個同步信號量:信號量empty表示可用的空緩沖區(qū)的數(shù)目,初值為k;信號量full表示可以使用產(chǎn)品的數(shù)目,初值為0。緩沖區(qū)是一個臨界資源,必須互斥使用,所以另外還需要設(shè)置一個互斥信號量mutex,其初值為1。用信號量機制解決生產(chǎn)者一消費者問題可描述如下:itemBk;semaphoreempty;empty=k;/可以使用的空緩沖區(qū)數(shù)semaphorefull;full=0;/緩沖區(qū)內(nèi)可以使用的產(chǎn)品數(shù)
10、semaphoremutex;mutex=1;/互斥信號量intin=0;/放入緩沖區(qū)指針intout=0;/取出緩沖區(qū)指針cobeginprocessproducer_i()processconsumer。While(true)While(true)produce。;P(full);P(empty);P(mutex);P(mutex);takefromBout;appendtoBin;out=(out+1)%k;in=(in+1)%k;V(mutex);V(mutex);V(empty);V(full);consume。;Coend程序中的P(mutex)和V(mutex)必須成對出現(xiàn),夾在
11、兩者之間的代碼段是臨界區(qū);施加于信號量empty和full上的PV操作也必須成對出現(xiàn),但分別位于不同的程序中。在生產(chǎn)者消費者問題中,P操作的次序是很重要的,如果把生產(chǎn)者進程中的兩個P操作交換次序,那么,當緩沖區(qū)中存滿k件產(chǎn)品時,生產(chǎn)者又生產(chǎn)一件產(chǎn)品,在它欲向緩沖區(qū)存放時,將在P(empty)上等待,由于此時mutex=0,它已經(jīng)占有緩沖區(qū),這時消費者預取產(chǎn)品時將停留在P(mutex)上而得不到使用緩沖區(qū)的權(quán)力。這就導致生產(chǎn)者等待消費者取走產(chǎn)品,而消費者卻在等待生產(chǎn)者釋放緩沖區(qū)的占有權(quán),這種互相之間的等待永遠不可能結(jié)束。所以,在使用信號量和PV操作實現(xiàn)進程同步時,特別要當心P操作的次序,而V操作
12、的次序無關(guān)緊要。一般來說,用于互斥的信號量上的P操作總是在后面執(zhí)行。1.2生產(chǎn)者消費者問題模擬實現(xiàn)1.2.1 實驗內(nèi)容考慮一個系統(tǒng)中有n個進程,其中部分進程為生產(chǎn)者進程,部分進程為消費者進程,共享具有k個單位的緩沖區(qū)。現(xiàn)要求用高級語言編寫一個程序,模擬多個生產(chǎn)者進程和多個消費者進程并發(fā)執(zhí)行的過程,并采用信號量機制與P、V操作實現(xiàn)生產(chǎn)者進程和消費者進程間同步以及對緩沖區(qū)的互斥訪問。利用信號量機制解決此問題的算法見3.2.4所示。1.2.2 實驗指導1.設(shè)計提示(1)本實驗并不需要真正創(chuàng)建生產(chǎn)者和消費者進程,每個進程用一個進程控制塊(PCB表示。PCBa據(jù)結(jié)構(gòu)如下:typedefstructPro
13、cess/進程PCBcharname10;進程名introleFlag;/進程類型(1:生產(chǎn)者0:消費者)intcurrentstate;/進程狀態(tài)(1:可運行態(tài)0:阻塞態(tài))intcurrentstep;/斷點intdata;/臨時數(shù)據(jù)intcode;/進程編號Process;(2)程序中應指定緩沖區(qū)的數(shù)目,進程總個數(shù)等,現(xiàn)考慮共有4個生產(chǎn)者和消費者進程,/緩沖區(qū)/進程數(shù)量緩沖區(qū)緩沖區(qū)數(shù)目是兩個,定義如下所示:#definedataBufferSize2數(shù)目#defineprocessNum4(生產(chǎn)者、消費者進程總數(shù)目)structDataBuffer/intbufferdataBufferS
14、ize;intcount;/當前產(chǎn)品數(shù)量dataBuffer;(3)為解決生產(chǎn)者-消費者問題需設(shè)兩個同步信號量:信號量empty表示可用的空緩沖區(qū)的數(shù)目,初值為緩沖區(qū)數(shù)目;信號量full表示可以使用產(chǎn)品的數(shù)目,初值為0。緩沖區(qū)是一個臨界資源,必須互斥使用,所以另外還需要設(shè)置一個互斥信號量mutex,其初值為1。信號量定義和說明如下所示:typedefstructSeamphore/信號量intvalue;/信號量的值int*pcq;/信號量隊列指針Seamphore;intproducerCongestionQueueprocessNum;/等待信號量empty的阻塞隊列intconsumer
15、CongestionQueueprocessNum;/等待信號量full的阻塞隊列intshareCongestionQueueprocessNum;/等待信號量mutex的阻塞隊列Seamphoreempty=dataBufferSize,producerCongestionQueue;Seamphorefull=0,consumerCongestionQueue;Seamphoremutex=1,shareCongestionQueue;(4)為模擬多個生產(chǎn)者和多個消費者進程并發(fā)執(zhí)行的過程,首先根據(jù)進程總個數(shù)產(chǎn)生若干生產(chǎn)者和若干消費者進程,然后隨機調(diào)度一個處于就緒態(tài)的進程,判斷是生產(chǎn)者還是
16、消費者,然后執(zhí)行不同的代碼,為模擬并發(fā)執(zhí)行,進程每執(zhí)行一步操作就中斷執(zhí)行,再調(diào)度其他進程運行,在被中斷進程的PCB中記錄了中斷的位置,等到下次被調(diào)度執(zhí)行時則從此位置繼續(xù)執(zhí)行。(5)生產(chǎn)者進程執(zhí)行時分為6步,如下所示:voidproduce(Process*p)/生產(chǎn)者進程執(zhí)行代碼switch(p->currentStep)case 1: /1生產(chǎn)產(chǎn)品p->data=rand()%1000;printf("%20s:生產(chǎn)一個產(chǎn)品d!n",p->name,p->data);p->currentStep+;break;case 2: 2申請空緩沖區(qū)P
17、(&empty,p);break;case 3: 3申請訪問緩沖區(qū)P(&mutex,p);break;case 4: 4將產(chǎn)品送入緩沖區(qū)push(p->data);printf("%20s:將產(chǎn)品%d正送入緩沖區(qū)!n",p->name,p->data);p->currentStep+;break;case 5: 5釋放緩沖區(qū)訪問權(quán)V(&mutex,p);break;case 6: 6產(chǎn)品已送入緩沖區(qū),產(chǎn)品數(shù)量加1V(&full,p);p->currentStep=1;break;(6)消費者進程執(zhí)行時也分為6步,
18、如下所示:voidconsume(Process*p)/消費者進程執(zhí)行代碼switch(p->currentStep)case1:/1申請從緩沖區(qū)取出產(chǎn)品P(&full,p);break;case2:/2申請訪問緩沖區(qū)P(&mutex,p);/3break;case 3:從緩沖區(qū)中取出產(chǎn)品p->data=pop();printf("%20s:從緩沖區(qū)中正取出產(chǎn)品d!n",p->name,p->data);p->currentStep+;break;case 4: /4釋放緩沖區(qū)訪問權(quán)V(&mutex,p);break;c
19、ase 5: /5已從緩沖區(qū)取出一個產(chǎn)品,空緩沖區(qū)數(shù)量加1V(&empty,p);break;case 6: /6消費產(chǎn)品printf("%20s:消費產(chǎn)品%d!n",p->name,p->data);p->currentStep=1;break;(6)為對生產(chǎn)者進程和消費者進程并發(fā)執(zhí)行的過程進行分析,理解信號量和P、V操作在進程同步和互斥機制中的運用,要求進程每執(zhí)行一步都輸出每一步的執(zhí)行情況。2.程序流程圖(1)程序流程圖如圖3.2所示:開始1 J初始化緩沖區(qū)和信號量圖3.2程序流程圖(2)生產(chǎn)者進程和消費者進程執(zhí)行時各有6步操作,執(zhí)行一個操作后
20、會被中斷,下次再被調(diào)度執(zhí)行時接著執(zhí)行下一操作。生產(chǎn)者進程流程圖如圖3.3所示,消費者進程流程圖如圖3.4所示。(開始圖2.2生產(chǎn)者進程流程圖圖2.3消費者進程流程圖1.2.3程序示例#include"stdio.h"#include"time.h"#include"stdlib.h"#include"string.h"/緩沖區(qū)數(shù)目/進程數(shù)量(生產(chǎn)/信號#include"windows.h"#definedataBufferSize2#defineprocessNum4者、消費者進程總數(shù)目)typ
21、edefstructSeamphore量intvalue;/信號量的值int*pcq;/信號量隊列指針Seamphore;intproducerCongestionQueueprocessNum;/等待信號量empty的阻塞隊列intconsumerCongestionQueueprocessNum;/等待信號量full的阻塞隊列intshareCongestionQueueprocessNum;/等待信號量mutex的阻塞隊列Seamphoreempty=dataBufferSize,producerCongestionQueue;/empty:空緩沖區(qū)數(shù)目Seamphorefull=0,c
22、onsumerCongestionQueue;/full:緩沖區(qū)內(nèi)可用的產(chǎn)品Seamphoremutex=1,shareCongestionQueue;/mutex:互斥信號量structDataBuffer/緩沖區(qū)intbufferdataBufferSize;intcount;/當前產(chǎn)品數(shù)量dataBuffer;typedef struct Process/進程PCBchar name10;int roleFlag;生產(chǎn)者0: 消費者)int currentState;就緒態(tài)0:阻塞態(tài)) int currentStep;int data;int code;/進程名/ 進程類型(1:/進程狀
23、態(tài)(1:/斷點/臨時數(shù)據(jù)/進程編號Process;ProcessprocessprocessNum;/進程集合voidmoveDataForward()inti;for(i=0;i<dataBuffer.count;i+)dataBuffer.bufferi=dataBuffer.bufferi+1;voidpush(intdata)/產(chǎn)品送入緩沖區(qū)dataBuffer.bufferdataBuffer.count+=data;intpop()/從緩沖區(qū)取出產(chǎn)品intdata=dataBuffer.buffer0;dataBuffer.count-;moveDataForward();r
24、eturndata;voidinitProcess()/初始化進程集合inti;chardigitTemp5;srand(time(NULL);for(i=0;i<processNum;i+)processi.roleFlag=rand()%2;/隨機指定當前進程為生產(chǎn)者或消費者生產(chǎn)者);消費者");if(processi.roleFlag)strcpy(,"elsestrcpy(,"strcat(,itoa(i+1,digitTemp,10);processi.currentSt
25、ate=1;processi.currentStep=1;processi.code=i+1;producerCongestionQueuei=0;consumerCongestionQueuei=0;shareCongestionQueuei=0;voidwakeup(int*pcq)/喚醒進程int code = pcq0 - 1;/取出隊首進程processcode.currentState=1;/進程置為就緒態(tài)/當進程被喚醒后繼續(xù)執(zhí)行任務if(processcode.roleFlag=1)/生產(chǎn)者if(processcode.currentStep=2)printf("%20
26、s:該進程被喚醒!申請空緩沖區(qū)成功!n”,);elseif(processcode.currentStep=3)printf("%20s:該進程被喚醒!申請訪問緩沖區(qū)成功!n”,);elseif(processcode.roleFlag=0)/消費者if(processcode.currentStep=1)processcode.data=pop();printf("%20s:該進程被喚醒!申請取產(chǎn)品d成功!n",,processcode.data);elseif(pr
27、ocesscode.currentStep=2)printf("%20s:該進程被喚醒!申請訪問緩沖區(qū)成功!n”,);processcode.currentStep+;for(inti=1;(i<processNum)&&(pcqi!=0);i+)/刪除隊首進程pcqi-1=pcqi;if(pcqi-1>processNum)pcqi-1=0;pcqi-1=0;voidsleep(intpcq,intcode)阻塞進程inti;processcode-1.currentState=0;/進程置為阻塞態(tài)for(i=0;i<
28、;processNum;i+)if(!pcqi)pcqi=code;break;voidP(Seamphore*s,Process*p)/模擬P操作s->value-=1;if(s->value>=0)if(p->roleFlag=1)生產(chǎn)者if(p->currentStep=2)/printf("%20s:申請空緩沖區(qū)成功!n",p->name);elseif(p->currentStep=3)printf("%20s:申請訪問緩沖區(qū)成功!n",p->name);elseif(p->roleFlag
29、=0)/消費者if(p->currentStep=1)printf("%20s:申請取出產(chǎn)品成功!n",p->name);elseif(p->currentStep=2)printf("%20s:申請訪問緩沖區(qū)成功!n",p->name);p->currentStep+;/下一步elseif(s->value<0)if(p->roleFlag=1)/生產(chǎn)者if(p->currentStep=2)printf("%20s:無空緩沖區(qū),該進程被阻塞!n",p->name);els
30、eif(p->currentStep=3)printf("%20s:其他進程正在訪問緩沖區(qū),該進程被阻塞!n",p->name);elseif(p->roleFlag=0)/消費者if(p->currentStep=1)printf("%20s:無產(chǎn)品可取,該進程被阻塞!n",p->name);elseif(p->currentStep=2)printf("%20s:其他進程正在訪問緩沖區(qū),該進程被阻塞!n",p->name);/阻塞進sleep(s->pcq,p->code);程
31、voidV(Seamphore*s,Process*p)/模擬V操作s->value+=1;if(p->roleFlag=1)生產(chǎn)者if(p->currentStep=5)printf("%20s:釋放緩沖區(qū)訪問權(quán)!n",p->name);elseif(p->currentStep=6)printf("%20s:產(chǎn)品已送入緩沖區(qū))產(chǎn)品數(shù)量增加!n",p->name);elseif(p->roleFlag=0)/消費者if(p->currentStep=4)printf("%20s:釋放緩沖區(qū)訪問權(quán)
32、!n",p->name);elseif(p->currentStep=5)printf("%20s:產(chǎn)品已取出,空緩沖區(qū)數(shù)量增加!n",p->name);if(s->value<=0)wakeup(s->pcq);p->currentStep+;voidproduce(Process*p)/模擬生產(chǎn)者進程switch(p->currentStep)case 1:/1生產(chǎn)產(chǎn)品p->data=rand()%1000;printf("%20s:生產(chǎn)一個產(chǎn)品d!n",p->name,p->
33、;data);p->currentStep+;break;case 2:/2申請空緩沖區(qū)P(&empty,p);break;case 3:/3申請訪問緩沖區(qū)P(&mutex,p);break;case 4:/4將產(chǎn)品送入緩沖區(qū)push(p->data);printf("%20s:將產(chǎn)品d正送入緩沖區(qū)!n",p->name,p->data);p->currentStep+;break;case 5:/5釋放緩沖區(qū)訪問權(quán)V(&mutex,p);break;case 6:/6產(chǎn)品已送入緩沖區(qū),產(chǎn)品數(shù)量加1V(&full
34、,p);p->currentStep=1;break;voidconsume(Process*p)/模擬消費者進程switch(p->currentStep)case 1:/1申請從緩沖區(qū)取出產(chǎn)品P(&full,p);break;case 2:/2申請訪問緩沖區(qū)P(&mutex,p);break;case 3:/3從緩沖區(qū)中取出產(chǎn)品p->data=pop();printf("%20s:從緩沖區(qū)中正取出產(chǎn)m%d!n",p->name,p->data);p->currentStep+;break;case 4:/4釋放緩沖區(qū)訪
35、問權(quán)V(&mutex,p);break;case 5: 5已從緩沖區(qū)取出一個產(chǎn)品,空緩沖區(qū)數(shù)量加1V(&empty,p);break;case 6:/6消費產(chǎn)品printf("%20s:消費產(chǎn)品%d!n",p->name,p->data);p->currentStep=1;break;voidrr()/模擬進程調(diào)度Process*p;while(1)p=&processrand()%processNum;/隨機選取進程集合內(nèi)某一進程if(!p->currentState)/選取的進程若為阻塞態(tài),重新選取其它可執(zhí)行進contin
36、ue;if(p->roleFlag)0:消費者produce(p);elseconsume(p);Sleep(100);/1: 生產(chǎn)者voiddeal()printf("tt生產(chǎn)者消費者算法模擬nn");initProcess();rr();intmain()deal();return0;1.2.4運行結(jié)果及分析1 .運行結(jié)果程序經(jīng)編譯運行后,輸出如下結(jié)果:生產(chǎn)者消費者算法模擬消費者2:無產(chǎn)品可取,該進程被阻塞!生產(chǎn)者3:生產(chǎn)一個產(chǎn)品344!生產(chǎn)者3:申請空緩沖區(qū)成功!生產(chǎn)者1:生產(chǎn)一個產(chǎn)品723!生產(chǎn)者1:申請空緩沖區(qū)成功!生產(chǎn)者3:申請訪問緩沖區(qū)成功生產(chǎn)者3:將產(chǎn)
37、品344正送入緩沖區(qū)!生產(chǎn)者3:釋放緩沖區(qū)訪問權(quán)!生產(chǎn)者1:申請訪問緩沖區(qū)成功生產(chǎn)者1:將產(chǎn)品723正送入緩沖區(qū)!生產(chǎn)者3:產(chǎn)品已送入緩沖區(qū),產(chǎn)品數(shù)量增加!消費者2:該進程被喚醒!申請取產(chǎn)品344成功!消費者4:無產(chǎn)品可取,該進程被阻塞!生產(chǎn)者1:釋放緩沖區(qū)訪問權(quán)!消費者2:申請訪問緩沖區(qū)成功!消費者2:從緩沖區(qū)中正取出產(chǎn)品723!生產(chǎn)者3:生產(chǎn)一個產(chǎn)品924!消費者2:釋放緩沖區(qū)訪問權(quán)!生產(chǎn)者1:產(chǎn)品已送入緩沖區(qū),產(chǎn)品數(shù)量增加!消費者4:該進程被喚醒!申請取產(chǎn)品723成功!生產(chǎn)者1:生產(chǎn)一個產(chǎn)品510!生產(chǎn)者1:無空緩沖區(qū),該進程被阻塞!消費者2:產(chǎn)品已取出,空緩沖區(qū)數(shù)量增加!生產(chǎn)者1:該進程被喚醒!申請空緩沖區(qū)成功!生產(chǎn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- SMARCA2-ligand-12-3-methylazetidine-生命科學試劑-MCE-3446
- N-Methylcanadium-iodide-生命科學試劑-MCE-3917
- 3-Fluoro-4-hydroxymethyl-benzonitrile-d2-4-Cyano-2-fluorobenzyl-alcohol-d-sub-2-sub-生命科學試劑-MCE-3394
- 二零二五年度影視作品分紅協(xié)議書
- 二零二五年度紅磚新材料研發(fā)與應用合作協(xié)議書
- 2025年度電影項目演員聘用合同模板
- 二零二五年度企業(yè)薪資補充協(xié)議及員工住房補貼
- 2025年度綠色生態(tài)園區(qū)物業(yè)公司股權(quán)轉(zhuǎn)讓合作協(xié)議
- 二零二五年度私人老板與藝術(shù)策展人合作協(xié)議
- 二零二五年度科研機構(gòu)競業(yè)禁止協(xié)議期限與成果轉(zhuǎn)化
- 最經(jīng)典凈水廠施工組織設(shè)計
- VDA6.3過程審核報告
- 《心臟血管的解剖》課件
- 2024-2030年中國并購基金行業(yè)發(fā)展前景預測及投資策略研究報告
- 河道清淤安全培訓課件
- 2024年湖南商務職業(yè)技術(shù)學院單招職業(yè)適應性測試題庫帶答案
- 骨科手術(shù)中常被忽略的操作課件
- 《湖南師范大學》課件
- 2024年全國各地中考試題分類匯編:作文題目
- 2024年高壓電工操作證考試復習題庫及答案(共三套)
- 《糖拌西紅柿 》 教案()
評論
0/150
提交評論