多進(jìn)程同步方法演示生產(chǎn)者-消費(fèi)者問(wèn)題_第1頁(yè)
多進(jìn)程同步方法演示生產(chǎn)者-消費(fèi)者問(wèn)題_第2頁(yè)
多進(jìn)程同步方法演示生產(chǎn)者-消費(fèi)者問(wèn)題_第3頁(yè)
多進(jìn)程同步方法演示生產(chǎn)者-消費(fèi)者問(wèn)題_第4頁(yè)
多進(jìn)程同步方法演示生產(chǎn)者-消費(fèi)者問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

-.z.理工大學(xué)操作系統(tǒng)課程設(shè)計(jì)報(bào)告院〔系〕:計(jì)算機(jī)工程學(xué)院專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)學(xué)生:__班級(jí):_______**:題目:用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者〞問(wèn)題起迄日期:設(shè)計(jì)地點(diǎn):指導(dǎo)教師:年度第學(xué)期完成日期:年月日課程設(shè)計(jì)目的本次進(jìn)展操作系統(tǒng)課程設(shè)計(jì)的主要任務(wù)是設(shè)計(jì)一個(gè)模擬生產(chǎn)者消費(fèi)者工作的系統(tǒng)。這個(gè)問(wèn)題中有一種生產(chǎn)者和一種消費(fèi)者,生產(chǎn)者和消費(fèi)者對(duì)同一個(gè)緩沖區(qū)進(jìn)展操作,互斥的訪問(wèn)緩沖區(qū)。本次課程設(shè)計(jì)的目的就是加深對(duì)多進(jìn)程如何正確訪問(wèn)資源的認(rèn)識(shí),同時(shí)掌握信號(hào)量在互斥訪問(wèn)時(shí)應(yīng)該如何正確有效地使用。掌握生產(chǎn)者消費(fèi)者問(wèn)題的解決流程和方法,提高編程能力、解決問(wèn)題的能力和查閱文檔的能力。課程設(shè)計(jì)容與要求1、設(shè)計(jì)目的:通過(guò)研究Linu*的進(jìn)程同步機(jī)制和信號(hào)量,實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題的并發(fā)控制。2、說(shuō)明:有界緩沖區(qū)設(shè)有20個(gè)存儲(chǔ)單元,放入取出的產(chǎn)品設(shè)定為20個(gè)100以的隨機(jī)整數(shù)。3、設(shè)計(jì)要求:生產(chǎn)者與消費(fèi)者均有二個(gè)以上生產(chǎn)者和消費(fèi)者進(jìn)程的數(shù)目在程序界面上可調(diào),在運(yùn)行時(shí)可隨時(shí)單個(gè)增加與減少生產(chǎn)者與消費(fèi)者生產(chǎn)者的生產(chǎn)速度與消費(fèi)者的消費(fèi)速度均可在程序界面調(diào)節(jié),在運(yùn)行中,該值調(diào)整后立即生效生產(chǎn)者生產(chǎn)的產(chǎn)品由隨機(jī)函數(shù)決定多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者之間必須有共享對(duì)緩沖區(qū)進(jìn)展操作的函數(shù)代碼每個(gè)生產(chǎn)者和消費(fèi)者對(duì)有界緩沖區(qū)進(jìn)展操作后,即時(shí)顯示有界緩沖區(qū)的全部容、當(dāng)前生產(chǎn)者與消費(fèi)者的指針位置,以及生產(chǎn)者和消費(fèi)者線程標(biāo)識(shí)符采用可視化界面,可在運(yùn)行過(guò)程中隨時(shí)暫停,查看當(dāng)前生產(chǎn)者、消費(fèi)者以及有界緩沖區(qū)的狀態(tài)系統(tǒng)分析與設(shè)計(jì)系統(tǒng)分析系統(tǒng)分析1.此次課程設(shè)計(jì)的任務(wù)是生產(chǎn)者消費(fèi)者問(wèn)題的模擬演示,需要處理的數(shù)據(jù)有:生產(chǎn)者進(jìn)程數(shù)目,消費(fèi)者進(jìn)程數(shù)目,生產(chǎn)者生產(chǎn)速度,消費(fèi)者消費(fèi)速度,緩沖區(qū)中產(chǎn)品的個(gè)數(shù),以及生產(chǎn)、消費(fèi)產(chǎn)品的指針。2.程序中需要緩沖區(qū)中的信息可以動(dòng)態(tài)演示,生產(chǎn)者、消費(fèi)者的個(gè)數(shù)以及生產(chǎn)、消費(fèi)時(shí)的速度可以隨時(shí)調(diào)節(jié),同時(shí)為了使程序更加友好,應(yīng)該具有開場(chǎng)、暫停、停頓等相關(guān)可操作按鈕。3.系統(tǒng)對(duì)外的界面如下:1〕對(duì)進(jìn)程個(gè)數(shù)的修改:點(diǎn)擊生產(chǎn)者、消費(fèi)者進(jìn)程數(shù)據(jù)文本框下的增加、減少按鈕2〕對(duì)速度的修改:速度值默認(rèn)為2000ms/個(gè),如需修改,則在速度文本框中輸入所修改的值,點(diǎn)擊修改按鈕即可進(jìn)展修改。3〕需要開場(chǎng)模擬時(shí),點(diǎn)擊右上方的開場(chǎng)按鈕。如需暫停模擬過(guò)程,可點(diǎn)擊暫停按鈕。當(dāng)需要運(yùn)行完畢時(shí),點(diǎn)擊停頓按鈕,進(jìn)程工作停頓。4.此次使用java平臺(tái)實(shí)現(xiàn),保證了程序在各種機(jī)器的運(yùn)行,只需要事前建立java的運(yùn)行環(huán)境即可,便于程序的移植5.系統(tǒng)界面如下:開場(chǎng)、暫停、停頓按鈕區(qū)進(jìn)程工作情況動(dòng)態(tài)顯示區(qū)開場(chǎng)、暫停、停頓按鈕區(qū)進(jìn)程工作情況動(dòng)態(tài)顯示區(qū)進(jìn)程數(shù)目調(diào)節(jié)區(qū)進(jìn)程數(shù)目調(diào)節(jié)區(qū)程序速度控制調(diào)節(jié)區(qū)程序速度控制調(diào)節(jié)區(qū)2、系統(tǒng)設(shè)計(jì):主界面2.1、模塊設(shè)計(jì):主界面系統(tǒng)主模塊系統(tǒng)主模塊消費(fèi)者速度調(diào)節(jié)生產(chǎn)者速度調(diào)節(jié)消費(fèi)者數(shù)目調(diào)節(jié)生產(chǎn)者數(shù)目調(diào)節(jié)消費(fèi)者速度調(diào)節(jié)生產(chǎn)者速度調(diào)節(jié)消費(fèi)者數(shù)目調(diào)節(jié)生產(chǎn)者數(shù)目調(diào)節(jié)有界緩沖區(qū)控制消費(fèi)者控制生產(chǎn)者控制主界面有界緩沖區(qū)控制消費(fèi)者控制生產(chǎn)者控制主界面2.2、數(shù)據(jù)構(gòu)造說(shuō)明:產(chǎn)品指針pointcp緩沖區(qū)產(chǎn)品指針pointcp緩沖區(qū)同步信號(hào)量emptyfull消費(fèi)Consume生產(chǎn)消費(fèi)Consume生產(chǎn)Produce緩沖區(qū)狀態(tài)E_F緩沖區(qū)狀態(tài)E_F互斥信號(hào)量mute*2.3、算法流程圖:生產(chǎn)者流程圖:申請(qǐng)空緩沖區(qū)申請(qǐng)空緩沖區(qū)信號(hào)量enmpty>0信號(hào)量enmpty>0NO倉(cāng)庫(kù)已滿,線程阻塞NO倉(cāng)庫(kù)已滿,線程阻塞YESYESpointcp=pointcp+1pointcp=pointcp+1E_F[pointcp]=trueE_F[pointcp]=true打印緩沖區(qū)狀態(tài)打印緩沖區(qū)狀態(tài)chanpin=chanpin+1chanpin=chanpin+1full=full+1釋放緩沖區(qū)釋放緩沖區(qū)消費(fèi)者流程圖:申請(qǐng)空緩沖區(qū)申請(qǐng)空緩沖區(qū)full=full+1信號(hào)量full>0倉(cāng)庫(kù)已滿,線程阻塞信號(hào)量full>0倉(cāng)庫(kù)已滿,線程阻塞NONOYESYESpointcp=pointcp-1pointcp=pointcp-1釋放緩沖區(qū)E_F[pointcp]=false釋放緩沖區(qū)E_F[pointcp]=falsechanpin=chanpin-1chanpin=chanpin-1empty=empty+1打印緩沖區(qū)狀態(tài)打印緩沖區(qū)狀態(tài)四、系統(tǒng)測(cè)試與調(diào)試分析1、系統(tǒng)測(cè)試〔1〕因?yàn)楫?dāng)生產(chǎn)者在緩沖區(qū)滿了以后自動(dòng)阻塞,需要消費(fèi)者喚醒,所以需要測(cè)試喚醒的實(shí)現(xiàn)是否正常。測(cè)試說(shuō)明測(cè)試名稱用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者〞問(wèn)題測(cè)試目的驗(yàn)證生產(chǎn)者能被消費(fèi)者喚醒測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試容當(dāng)生產(chǎn)者生產(chǎn)滿緩沖區(qū)后,開場(chǎng)增加消費(fèi)者,喚醒生產(chǎn)者測(cè)試步驟增加生產(chǎn)者等待緩沖區(qū)被用完增加消費(fèi)者測(cè)試數(shù)據(jù)增加生產(chǎn)者到2緩沖區(qū)產(chǎn)品數(shù)量20緩沖區(qū)空閑位為0蘋果消費(fèi)者增加到3預(yù)期結(jié)果緩沖區(qū)開場(chǎng)增加產(chǎn)品緩沖區(qū)滿生產(chǎn)者阻塞生產(chǎn)者被喚醒,緩沖區(qū)中產(chǎn)品數(shù)量減少測(cè)試結(jié)果與預(yù)期相符與預(yù)期相符與預(yù)期相符〔2〕因?yàn)楫?dāng)生產(chǎn)者在緩沖區(qū)滿了以后自動(dòng)阻塞,需要消費(fèi)者喚醒,所以需要測(cè)試喚醒的實(shí)現(xiàn)是否正常。測(cè)試說(shuō)明測(cè)試名稱用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者〞問(wèn)題測(cè)試目的驗(yàn)證多個(gè)生產(chǎn)者和消費(fèi)者互斥操作緩沖區(qū)測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試容緩沖區(qū)為空,消費(fèi)者阻塞時(shí),生產(chǎn)者喚醒消費(fèi)者測(cè)試步驟開場(chǎng)生產(chǎn)產(chǎn)品,緩沖區(qū)為空空閑位20開場(chǎng)消費(fèi)產(chǎn)品,終止生產(chǎn)線程開場(chǎng)增加生產(chǎn)者減少消費(fèi)者測(cè)試數(shù)據(jù)生產(chǎn)者數(shù)量5生產(chǎn)者減少到0增加消費(fèi)者到5增加生產(chǎn)者到5減少消費(fèi)者到2預(yù)期結(jié)果緩沖區(qū)產(chǎn)品數(shù)量每次增加5個(gè)消費(fèi)完成產(chǎn)品,消費(fèi)者阻塞喚醒消費(fèi)者,緩沖區(qū)中產(chǎn)品增加測(cè)試結(jié)果與預(yù)期相符與預(yù)期相符與預(yù)期相符3〕測(cè)試生產(chǎn)者和消費(fèi)者的速度是否可以調(diào)節(jié)測(cè)試說(shuō)明測(cè)試名稱用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者〞問(wèn)題測(cè)試目的蘋果、橘子生產(chǎn)者和蘋果、橘子消費(fèi)者速度可以調(diào)節(jié)測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試容調(diào)節(jié)生產(chǎn)者和消費(fèi)者速度測(cè)試步驟開場(chǎng)程序運(yùn)行輸入生產(chǎn)者、消費(fèi)者速度值點(diǎn)擊修改按鈕測(cè)試數(shù)據(jù)生產(chǎn)者速度2000消費(fèi)者速度2000生產(chǎn)者速度值1000消費(fèi)者速度值1000點(diǎn)擊修改預(yù)期結(jié)果緩沖區(qū)開場(chǎng)被操作界面文本框中顯示速度值速度均變化到1000測(cè)試結(jié)果與預(yù)期相符與預(yù)期相符與預(yù)期相符2、調(diào)試分析:1.在編寫過(guò)程中,由于函數(shù)較多,開場(chǎng)時(shí)由于名稱不夠清晰,程序出現(xiàn)錯(cuò)誤。2.測(cè)試運(yùn)行過(guò)程中,由于函數(shù)名稱的相似,出現(xiàn)引用混亂的情況,程序無(wú)常運(yùn)行。3.在制作界面時(shí),由于遺忘了chuangkou.add(jp);chuangkou.setVisible(true);兩個(gè)語(yǔ)句,導(dǎo)致界面無(wú)常顯示。4.制作界面時(shí),對(duì)各個(gè)控件的坐標(biāo)和大小考慮不周,導(dǎo)致界面混亂,影響美觀。五、用戶手冊(cè)1.使用的語(yǔ)言和平臺(tái)本次實(shí)驗(yàn)使用的是java語(yǔ)言的eclipse平臺(tái)2.對(duì)于程序運(yùn)行環(huán)境的考前須知需要安裝java運(yùn)行環(huán)境,eclipss平臺(tái)不需要安裝,只需要下載完成就可以使用。程序使用步驟圖1:系統(tǒng)登錄界面。圖2:生產(chǎn)者速度調(diào)節(jié)圖3:消費(fèi)者速度調(diào)節(jié)圖4:生產(chǎn)者數(shù)量調(diào)節(jié)圖5:消費(fèi)者數(shù)量調(diào)節(jié)圖6::控制界面圖7:動(dòng)態(tài)顯示緩沖區(qū)4.程序使用步驟:1〕單擊開場(chǎng)按鈕,程序開場(chǎng)初始化執(zhí)行2〕點(diǎn)擊增加按鈕分別增加生產(chǎn)者和消費(fèi)者,可以看到可視化緩沖區(qū)開場(chǎng)運(yùn)動(dòng)3〕在速度調(diào)節(jié)局部調(diào)節(jié)生產(chǎn)者和消費(fèi)者的速度,可以看到緩沖區(qū)出現(xiàn)預(yù)期的產(chǎn)品種類和數(shù)量的變化。六、程序清單classConsumere*tendsThread{privatehuanchongquhcq;//保存一個(gè)緩沖區(qū)類的引用staticlongspeed=2000;//speed表示消費(fèi)者線程的速度staticintcpause=0;//cpause變量用來(lái)控制消費(fèi)者線程的開場(chǎng)與暫停booleanout=false;//定義構(gòu)造方法,接收一個(gè)緩沖區(qū)類型的變量publicConsumer(huanchongquhcq) {this.hcq=hcq; }//run()方法調(diào)用接收的緩沖區(qū)類型的變量指向的decrease()方法,開場(chǎng)消費(fèi)元素。Overridepublicvoidrun() {while(!out) {if(out)break;if(cpause==1) {try { Thread.sleep(speed); }catch(InterruptedE*ceptione) { e.printStackTrace(); }hcq.Consume(); } } }}classProducere*tendsThread{privatehuanchongquhcq;//定義緩沖區(qū)類的引用。staticlongspeed=2000;//定義speed變量,表示線程速度booleanout=false;publicstaticintppause=0;//ppause變量用來(lái)控制生產(chǎn)者線程的開場(chǎng)與暫停//定義構(gòu)造方法,接收一個(gè)緩沖區(qū)類型的變量publicProducer(huanchongquhcq) {this.hcq=hcq; }publicvoidchangeout() {out=!out; }//run()方法調(diào)用緩沖區(qū)類型變量指向的對(duì)象的increase()方法,開場(chǎng)生產(chǎn)元素。Overridepublicvoidrun() {while(!out) {if(out)break;if(ppause==1) {try { Thread.sleep(speed); }catch(InterruptedE*ceptione) { e.printStackTrace(); }hcq.Produce(); } } }}classhuanchongqu{//number表示動(dòng)態(tài)緩沖區(qū)中元素的數(shù)量staticintnumber=0;staticboolean[]E_F=newboolean[20];//緩沖區(qū)狀態(tài)控制staticint[]storage=newint[20];staticSemaphoreempty=newSemaphore(20);staticSemaphorefull=newSemaphore(0);staticSemaphorechanpin=newSemaphore(0);staticSemaphoremute*=newSemaphore(1);staticintcpnum=0;staticintpointcp=-1;publichuanchongqu() {for(inti=0;i<20;i++) {E_F[i]=false;storage[i]='0'; } }publicvoidProduce() {empty.acquire();//信號(hào)量的p操作,申請(qǐng)空緩沖區(qū)mute*.acquire();//互斥信號(hào)量if(pointcp+1!=20){pointcp++;E_F[pointcp]=true;//將生產(chǎn)了產(chǎn)品的標(biāo)志位設(shè)為滿cpnum++;storage[pointcp]=(int)(Math.random()*99+0);//存儲(chǔ)生產(chǎn)的產(chǎn)品 } Stringstr2=Thread.currentThread().getName(); pc.ta2.append("生產(chǎn)者"+str2+"運(yùn)行\(zhòng)n");number++; pc.ta1.append("倉(cāng)庫(kù)中的產(chǎn)品個(gè)數(shù)為"+number+"\n"); pc.ta1.append("它們是:\n");for(intj=0;j<20;j++) {if(storage[j]!='0') pc.ta1.append("("+j+")"+storage[j]+"");else pc.ta1.append(""); }if(number==20){ pc.ta1.append("\n倉(cāng)庫(kù)已滿"); } pc.ta1.append("\n");mute*.release();//釋放互斥鎖full.release();//增加滿信號(hào)量的值chanpin.release();//增加產(chǎn)品信號(hào)量的值 }publicvoidConsume() {chanpin.acquire();//申請(qǐng)獲得產(chǎn)品full.acquire();//申請(qǐng)滿緩沖區(qū)mute*.acquire();//互斥進(jìn)入臨界區(qū) Stringstr2=Thread.currentThread().getName(); pc.ta2.append("消費(fèi)者"+str2+"運(yùn)行\(zhòng)n");number--;cpnum--;E_F[pointcp]=false;//設(shè)置為空storage[pointcp]='0';pointcp--;//產(chǎn)品指針減一 pc.ta1.append("倉(cāng)庫(kù)中的數(shù)字個(gè)數(shù)為"+number+"\n"); pc.ta1.append("它們是:\n");for(intj=0;j<20;j++) {if(storage[j]!='0') pc.ta1.append("("+j+")"+storage[j]+"");else pc.ta1.append(""); }if(number==0){ pc.ta1.append("\n倉(cāng)庫(kù)已空"); } pc.ta1.append("\n");mute*.release();//退出臨界區(qū)empty.release();//空緩沖區(qū)信號(hào)量加一 } }classSemaphore{intvalue;publicSemaphore(intv){this.value=v; }//定義P、V原語(yǔ)操作,原語(yǔ)操作就是執(zhí)行時(shí)不能中斷,所以synchronized修飾publicsynchronizedvoidacquire(){//獲取value--;if(value<0){try{this.wait();//等待 }catch(InterruptedE*ceptione){ e.printStackTrace(); } } }publicsynchronizedvoidrelease(){//釋放value++;if(value<=0){this.notify();//喚醒 } }}七、體會(huì)與自我評(píng)價(jià)對(duì)于本次課程設(shè)計(jì),我采用了java語(yǔ)言進(jìn)展程序編制。因?yàn)橄鄬?duì)于mfc等,java語(yǔ)言更輕便簡(jiǎn)潔,在繪制可視化圖形界面時(shí)也相對(duì)容易很多??墒怯捎趯?duì)java了解不深,掌握的也不是很好,所以編制的程序并不算完美。比方在按了暫停按鈕或停頓按鈕之后,程序會(huì)出現(xiàn)延遲等現(xiàn)象。本次實(shí)驗(yàn)并沒(méi)有特別困難的算法。其實(shí)主要的算法只有兩種,一種是生產(chǎn)者的生產(chǎn)過(guò)程,一種是消費(fèi)者的消費(fèi)過(guò)程。在設(shè)計(jì)過(guò)程中,由于生產(chǎn)者與消費(fèi)者需要互斥的訪問(wèn)緩沖區(qū),將產(chǎn)品放進(jìn)去或從里面取出,所以最后決定使用指針的方法,通過(guò)指針前后移動(dòng)來(lái)表現(xiàn)產(chǎn)品被放入緩沖池或取出緩沖池的過(guò)程。剛開場(chǎng)時(shí),我將指針的初值設(shè)置為0,但是出現(xiàn)的產(chǎn)品只有19個(gè),不符合20個(gè)緩沖池的要求。后來(lái)我發(fā)現(xià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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論