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