合工大頁(yè)面置換算法操作系統(tǒng)課程設(shè)計(jì)報(bào)告_第1頁(yè)
合工大頁(yè)面置換算法操作系統(tǒng)課程設(shè)計(jì)報(bào)告_第2頁(yè)
合工大頁(yè)面置換算法操作系統(tǒng)課程設(shè)計(jì)報(bào)告_第3頁(yè)
合工大頁(yè)面置換算法操作系統(tǒng)課程設(shè)計(jì)報(bào)告_第4頁(yè)
合工大頁(yè)面置換算法操作系統(tǒng)課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩28頁(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)介

合工大頁(yè)面置換算法操作系統(tǒng)課程設(shè)計(jì)報(bào)告計(jì)算機(jī)與信息學(xué)院《操作系統(tǒng)綜合設(shè)計(jì)》報(bào)告設(shè)計(jì)題目:頁(yè)面置換算法學(xué)生姓名:學(xué)號(hào):專(zhuān)業(yè)班級(jí):計(jì)算機(jī)科學(xué)與技術(shù)班2015年X月一、設(shè)計(jì)題目3二、開(kāi)發(fā)環(huán)境與工具3三、設(shè)計(jì)原理31.最佳(Optimal)置換算法32.先進(jìn)先出(FIFO)頁(yè)面置換算法43.最近最久未使用(LRU)頁(yè)面置換算法4四、重要算法51.算法流程圖52.關(guān)鍵代碼8五、設(shè)計(jì)結(jié)果22六、設(shè)計(jì)體會(huì)24七、附錄24一、設(shè)計(jì)題目第15題:頁(yè)面置換算法1.建立相應(yīng)的數(shù)據(jù)結(jié)構(gòu);

2.在屏幕上顯示頁(yè)面的狀況;

3.時(shí)間的流逝可以用下面幾種方法模擬:

(a)按鍵盤(pán),每按一次可以認(rèn)為過(guò)一個(gè)時(shí)間單位;

(b)相應(yīng)WM_TIMER;

4.將一批頁(yè)的置換情況存入磁盤(pán)文件,以后可以讀出并重放;

5.計(jì)算頁(yè)面的缺頁(yè)次數(shù)、缺頁(yè)后的頁(yè)面置換次數(shù);

6.支持算法:FIFO、LRU、最佳置換算法。二、開(kāi)發(fā)環(huán)境與工具開(kāi)發(fā)環(huán)境:Windows開(kāi)發(fā)工具:VC6.0、Eclipse三、設(shè)計(jì)原理1.最佳(Optimal)置換算法最佳置換算法是由Belady于1966年提出的一種理論上的算法。其所選擇的被淘汰頁(yè)面將是以后永不使用的,或是在未來(lái)最長(zhǎng)時(shí)間內(nèi)不再被訪問(wèn)的頁(yè)面。采用最佳置換算法通??梢员WC獲得最低的缺頁(yè)率,但由于人們目前還無(wú)法預(yù)知,一個(gè)進(jìn)程在內(nèi)存的若干個(gè)頁(yè)面中,哪一個(gè)頁(yè)面是未來(lái)最長(zhǎng)時(shí)間內(nèi)不再被訪問(wèn)的,因而該算法是無(wú)法實(shí)現(xiàn)的,但可以用該算法去評(píng)價(jià)其他算法。現(xiàn)舉例說(shuō)明如下:假定系統(tǒng)為某進(jìn)程分配了三個(gè)物理快,并考慮有以下的頁(yè)面號(hào)引用串:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1進(jìn)程運(yùn)行時(shí),先將7,0,1三個(gè)頁(yè)面放入內(nèi)存。以后,當(dāng)進(jìn)程要訪問(wèn)頁(yè)面2時(shí),將會(huì)產(chǎn)生缺頁(yè)中斷。此時(shí)OS根據(jù)最佳置換算法將將選擇頁(yè)面7予以淘汰。這是因?yàn)轫?yè)面0將作為第5個(gè)被訪問(wèn)的頁(yè)面,頁(yè)面1是第14個(gè)被訪問(wèn)的頁(yè)面,而頁(yè)面7則要在第18次頁(yè)面訪問(wèn)是才需調(diào)入。下次訪問(wèn)頁(yè)面0時(shí),因它已在內(nèi)存而不必產(chǎn)生缺頁(yè)中斷。當(dāng)進(jìn)程訪問(wèn)頁(yè)面3時(shí),又講引起頁(yè)面1被淘汰;

因?yàn)樗诂F(xiàn)在的1,2,0三個(gè)頁(yè)面中,將是以后最晚才被訪問(wèn)的。圖1示出了采用最佳置換算法時(shí)的置換圖。由圖可以看出,采用最佳置換算法發(fā)生了6次頁(yè)面置換。頁(yè)面號(hào)70120304230321201701物理快1777222227物理快200004000物理快311333112.先進(jìn)先出(FIFO)頁(yè)面置換算法FIFO算法是最早出現(xiàn)的置換算法,該算法總是淘汰最先進(jìn)入內(nèi)存的頁(yè)面,即選擇在內(nèi)存中駐留時(shí)間最長(zhǎng)的頁(yè)面予以淘汰。該算法實(shí)現(xiàn)簡(jiǎn)單,只需要把已經(jīng)調(diào)入內(nèi)存的頁(yè)面按先后次序排成一個(gè)隊(duì)列,當(dāng)發(fā)生缺頁(yè)時(shí),將隊(duì)首頁(yè)面出隊(duì),再將找到的頁(yè)面入隊(duì),這樣就完成了頁(yè)面置換的任務(wù)。以書(shū)上的為例有如下表格:701203423032120170777222444000000077000033222221111101111003333322222但該算法與程序的運(yùn)行規(guī)律不相適應(yīng),它忽視了程序運(yùn)行的局部性原理。有可能造成需要訪問(wèn)的頁(yè)面經(jīng)常性的被置換。3.最近最久未使用(LRU)頁(yè)面置換算法FIFO算法性能較差,它是根據(jù)頁(yè)面進(jìn)入的先后次序進(jìn)行置換,并不能反映頁(yè)面的使用情況。最近最久未使用(LRU)算法的基本思想是利用“最近的過(guò)去”來(lái)預(yù)測(cè)“最近的未來(lái)”,這個(gè)也是根據(jù)程序運(yùn)行的局部性原理。由于最佳置換算法只有理論價(jià)值,實(shí)際系統(tǒng)中是無(wú)法使用的,所以就利用最近的過(guò)去來(lái)預(yù)測(cè)未來(lái)。該算法每訪問(wèn)一個(gè)字段,記錄一個(gè)自上次以來(lái)被訪問(wèn)以來(lái)所經(jīng)歷的時(shí)間t。當(dāng)需要淘汰一個(gè)頁(yè)面時(shí),選擇所有頁(yè)面中t值最大的,即最近最久未使用的頁(yè)面予以置換。

以書(shū)上為例,有如下表格:

701203423032120170777222444000111111000000033333300001113322222222277四、重要算法1.算法流程圖FIFO算法流程圖:

Yi++把p的內(nèi)容直接裝入最上面一個(gè)空內(nèi)存塊,i++把page中最先裝入的頁(yè)面置換出去.i++Page是否有空當(dāng)前p中第i個(gè)元素是否已在內(nèi)存中頁(yè)面走向存入數(shù)組p中,內(nèi)存塊用page表示初始化為0開(kāi)始NYN輸出當(dāng)前內(nèi)存塊狀態(tài)結(jié)束LRU算法流程圖:開(kāi)始頁(yè)面走向存入數(shù)組p中,內(nèi)存塊用page表示初始化為0Y當(dāng)前p中第i個(gè)元素是否已在內(nèi)存i++NNPage是否有空Y結(jié)束把p的內(nèi)容直接裝入最上面一個(gè)空內(nèi)存塊,i++輸出當(dāng)前內(nèi)存塊狀態(tài)把page中最近最久未使用的頁(yè)面置換出去.i++OPT算法流程圖:開(kāi)始Yi++結(jié)束輸出當(dāng)前內(nèi)存塊狀態(tài)把page中以后一段時(shí)間都不使用或是使用時(shí)間離現(xiàn)在最遠(yuǎn)的換出.i++把p的內(nèi)容直接裝入最上面一個(gè)空內(nèi)存塊,i++Page是否有空當(dāng)前p中第i個(gè)元素是否已在內(nèi)存頁(yè)面走向存入數(shù)組p中,內(nèi)存塊用page表示初始化為0NNY2.關(guān)鍵代碼1.FIFO算法代碼:

publicclassFIFOControl{//privateintnum={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//使用無(wú)參構(gòu)造函數(shù)privateintnum=newint;privateintnumLength;privateintpg=newint;privateinttimepg=newint;privateintPageNum;publicintstore;FIFOControl{this.PageNum=3;numLength=20;intnumtemp={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};for{num=numtemp;}for{pg=-1;timepg=1;}store=newint;for{for{store=-1;}}for{store=0;}}FIFOControl//參數(shù):1.物理塊數(shù)2.頁(yè)面序列號(hào)3.頁(yè)面序列號(hào)數(shù)組長(zhǎng)度meiyong{this.PageNum=nump;numLength=nlength;for{num=n;}for{pg=-1;timepg=1;}store=newint;for{for{store=-1;}}for{store=0;}}privatebooleancheckInPage{for{timepg++;}for{if{returntrue;}}returnfalse;}privatevoidcaculate{//將物理頁(yè)框裝滿inttimer=0;//橫著的指針for{pg=num;for//加時(shí)間{timepg++;}for//數(shù)據(jù)放到store中去{store=pg;}timer++;}//把后面的數(shù)據(jù)按先進(jìn)先出的順序放到物理塊中for{if)//如果在物理框中將對(duì)應(yīng)位時(shí)間置為1{for//把這次物理塊中的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg;}timer++;}else//否則找出時(shí)間最長(zhǎng)的,將其置換,并將對(duì)應(yīng)位的時(shí)間置為1{intmax=timepg;intmaxvalue=pg;intmaxindex=0;inttemp;for//找到時(shí)間最大的物理塊{temp=timepg;if{max=temp;maxvalue=pg;maxindex=n;}}//System.out.println;//System.out.println;pg=num;timepg=1;for//把這次的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg;}store=maxindex+1;timer++;}}//測(cè)試查看結(jié)果//for//seshi//{//for//{//System.out.print;//}//System.out.println;//}}publicintgetStore{this.caculate;returnstore;}publicclassFIFOControl{//privateintnum={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//使用無(wú)參構(gòu)造函數(shù)privateintnum=newint;privateintnumLength;privateintpg=newint;privateinttimepg=newint;privateintPageNum;publicintstore;FIFOControl{this.PageNum=3;numLength=20;intnumtemp={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};for{num=numtemp;}for{pg=-1;timepg=1;}store=newint;for{for{store=-1;}}for{store=0;}}FIFOControl//參數(shù):1.物理塊數(shù)2.頁(yè)面序列號(hào)3.頁(yè)面序列號(hào)數(shù)組長(zhǎng)度meiyong{this.PageNum=nump;numLength=nlength;for{num=n;}for{pg=-1;timepg=1;}store=newint;for{for{store=-1;}}for{store=0;}}privatebooleancheckInPage{for{timepg++;}for{if{returntrue;}}returnfalse;}privatevoidcaculate{//將物理頁(yè)框裝滿inttimer=0;//橫著的指針for{pg=num;for//加時(shí)間{timepg++;}for//數(shù)據(jù)放到store中去{store=pg;}timer++;}//把后面的數(shù)據(jù)按先進(jìn)先出的順序放到物理塊中for{if)//如果在物理框中將對(duì)應(yīng)位時(shí)間置為1{for//把這次物理塊中的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg;}timer++;}else//否則找出時(shí)間最長(zhǎng)的,將其置換,并將對(duì)應(yīng)位的時(shí)間置為1{intmax=timepg;intmaxvalue=pg;intmaxindex=0;inttemp;for//找到時(shí)間最大的物理塊{temp=timepg;if{max=temp;maxvalue=pg;maxindex=n;}}//System.out.println;//System.out.println;pg=num;timepg=1;for//把這次的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg;}store=maxindex+1;timer++;}}}publicintgetStore{this.caculate;returnstore;}2.LRU算法代碼:

publicclassLRUControl{//privateintnum={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//使用無(wú)參構(gòu)造函數(shù)privateintnum=newint;//使用有參構(gòu)造函數(shù)privateintnumLength;privateintPageNum;privatePagepg=newPage;publicintstore;publicinttemp1;LRUControl{PageNum=3;numLength=num.length;store=newint;for{pg=newPage;if{this.pg.setValue;this.pg.setTime;}else{System.out.println;}}}LRUControl//參數(shù):1.物理塊數(shù)2.頁(yè)面序列號(hào)3.頁(yè)面序列號(hào)數(shù)組長(zhǎng)度meiyong{this.PageNum=nump;numLength=nlength;for{num=n;}store=newint;//gaidongtemp1=newint;for{pg=newPage;if{this.pg.setValue;this.pg.setTime;}else{System.out.println;}}}privatebooleancheckInPage{for{p.setTime+1);}for{if){returntrue;}}returnfalse;}voidcaculate{inttimer=0;//前PageNum個(gè),先將物理快裝滿for{pg.setValue;pg.setTime;for{pg.setTime+1);}for{store=pg.getValue;}timer++;}for{store=0;}//num數(shù)組后面的頁(yè)面檢查每一個(gè)是否在前面出現(xiàn)過(guò),有置該頁(yè)框時(shí)間為1,沒(méi)有則在原基礎(chǔ)上加1for{if)//如果在物理框中將對(duì)應(yīng)位時(shí)間置為1{for//把num和pg中相等的物理塊時(shí)間置1{if){pg.setTime;break;}}for//把這次物理塊中的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg.getValue;}store=0;timer++;}else//否則找出時(shí)間最長(zhǎng)的,將其置換,并將對(duì)應(yīng)位的時(shí)間置為1{intmax=pg.getTime;intmaxindex=0;inttemp;for//找到時(shí)間最大的物理塊{temp=pg.getTime;if{max=temp;maxindex=n;}}//System.out.println;//System.out.println;pg.setTime;pg.setValue;for//把這次的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg.getValue;}store=maxindex+1;timer++;}}}voiddisplay{for{for{System.out.print;}System.out.println;}}privatevoidadjustStore{for{for{temp1=store;}}for{temp1=store;}}publicintgetStore{adjustStore;returntemp1;}}3.OPT算法代碼:

intOptimal{//參數(shù)intmax;//未來(lái)最長(zhǎng)時(shí)間內(nèi)不被訪問(wèn)的頁(yè)面距下次被訪問(wèn)的時(shí)間intmax_page;//未來(lái)最長(zhǎng)時(shí)間內(nèi)不被訪問(wèn)的頁(yè)面號(hào)intmemory_null;//內(nèi)存中的空位號(hào)intlack=0;//記錄缺頁(yè)次數(shù)//intprocess=newint;//記錄置換過(guò)程Memorymemory=newMemory;//創(chuàng)建內(nèi)存//記錄置換過(guò)程數(shù)組初始化for{for{process=-1;}}//內(nèi)存塊初始化for{memory=newMemory;memory.page=-1;memory.next=0;}for{//依次讀取頁(yè)面System.out.println;if){//System.out.println;//記錄process=0;//沒(méi)有置換for{process=process;}}else{//memory_null=isNull;//獲取內(nèi)存中的空位號(hào)if{////獲取各內(nèi)存塊中頁(yè)面距下次被訪問(wèn)的時(shí)間for{memory.next=nextAccess;}//輸出各內(nèi)存塊中頁(yè)面距下次被訪問(wèn)的時(shí)間System.out.print;for{System.out.print;}System.out.println;//獲取未來(lái)最長(zhǎng)時(shí)間內(nèi)不被訪問(wèn)的頁(yè)面號(hào)max=memory.next;max_page=0;for{if{max=memory.next;max_page=j;}}//將未來(lái)最長(zhǎng)時(shí)間內(nèi)不被訪問(wèn)的頁(yè)面號(hào)置換為新頁(yè)面System.out.println;memory.page=page;//置換lack++;//更新缺頁(yè)次數(shù)//記錄process=max_page+1;//發(fā)生置換process=page;for{if{process=process;}}}else{//System.out.println;memory.page=page;//將新頁(yè)面放入內(nèi)存塊的空位中for{System.out.print;}System.out.println;//記錄process=0;//沒(méi)有置換process=page;for{if{if{process=process;}else{process=-1;}}}}}}System.out.println;System.out.printlnlack/page_num);System.out.println;for{for{System.out.print;}System.out.println;}return0;}五、設(shè)計(jì)結(jié)果圖1頁(yè)面號(hào)文件圖2讀入頁(yè)面號(hào)圖3自動(dòng)運(yùn)行圖4單步運(yùn)行六、設(shè)計(jì)體會(huì)本次課程設(shè)計(jì)不僅讓我對(duì)操作系統(tǒng)這門(mén)課程有了更深入的研究、對(duì)很多重要的概念有了鞏固和掌握。通過(guò)努力,三個(gè)頁(yè)面置換算法程序都已經(jīng)完成。雖然自己所做的很少也不夠完善,但畢竟也是努力的結(jié)果。主要有以下幾點(diǎn)收獲:

1.通過(guò)對(duì)上網(wǎng)和看書(shū)查閱相關(guān)資料,使自己對(duì)JAVA語(yǔ)言的基本框架有新的了解,加深了對(duì)可視化程序的認(rèn)識(shí)。

2.在使用Java語(yǔ)言來(lái)實(shí)現(xiàn)功能時(shí),不像以往用的其他語(yǔ)言,它比較簡(jiǎn)練,更容易理解,實(shí)用性很強(qiáng)。

3.先進(jìn)先出頁(yè)面置換和LRU以及OPT算法各有特點(diǎn),但是實(shí)踐起來(lái)卻很大,使自己對(duì)頁(yè)面置換算法有了新的認(rèn)識(shí)。

另外,和同學(xué)的合作也讓我收獲了許多,本來(lái)做界面是我的短板,但卻是同學(xué)的強(qiáng)項(xiàng),和他合作讓我在這方面也有很大收獲,學(xué)到了不少東西。七、附錄代碼:第一個(gè)FIFOControl.javapublicclassFIFOControl{//privateintnum={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//使用無(wú)參構(gòu)造函數(shù)privateintnum=newint;privateintnumLength;privateintpg=newint;privateinttimepg=newint;privateintPageNum;publicintstore;FIFOControl{this.PageNum=3;numLength=20;intnumtemp={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};for{num=numtemp;}for{pg=-1;timepg=1;}store=newint;for{for{store=-1;}}for{store=0;}}FIFOControl//參數(shù):1.物理塊數(shù)2.頁(yè)面序列號(hào)3.頁(yè)面序列號(hào)數(shù)組長(zhǎng)度meiyong{this.PageNum=nump;numLength=nlength;for{num=n;}for{pg=-1;timepg=1;}store=newint;for{for{store=-1;}}for{store=0;}}privatebooleancheckInPage{for{timepg++;}for{if{returntrue;}}returnfalse;}privatevoidcaculate{//將物理頁(yè)框裝滿inttimer=0;//橫著的指針for{pg=num;for//加時(shí)間{timepg++;}for//數(shù)據(jù)放到store中去{store=pg;}timer++;}//把后面的數(shù)據(jù)按先進(jìn)先出的順序放到物理塊中for{if)//如果在物理框中將對(duì)應(yīng)位時(shí)間置為1{for//把這次物理塊中的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg;}timer++;}else//否則找出時(shí)間最長(zhǎng)的,將其置換,并將對(duì)應(yīng)位的時(shí)間置為1{intmax=timepg;intmaxvalue=pg;intmaxindex=0;inttemp;for//找到時(shí)間最大的物理塊{temp=timepg;if{max=temp;maxvalue=pg;maxindex=n;}}//System.out.println;//System.out.println;pg=num;timepg=1;for//把這次的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg;}store=maxindex+1;timer++;}}//測(cè)試查看結(jié)果//for//seshi//{//for//{//System.out.print;//}//System.out.println;//}}publicintgetStore{this.caculate;returnstore;}}2.第二個(gè)LRUControl.javapublicclassLRUControl{//privateintnum={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//使用無(wú)參構(gòu)造函數(shù)privateintnum=newint;//使用有參構(gòu)造函數(shù)privateintnumLength;privateintPageNum;privatePagepg=newPage;publicintstore;publicinttemp1;LRUControl{PageNum=3;numLength=num.length;store=newint;for{pg=newPage;if{this.pg.setValue;this.pg.setTime;}else{System.out.println;}}}LRUControl//參數(shù):1.物理塊數(shù)2.頁(yè)面序列號(hào)3.頁(yè)面序列號(hào)數(shù)組長(zhǎng)度meiyong{this.PageNum=nump;numLength=nlength;for{num=n;}store=newint;//gaidongtemp1=newint;for{pg=newPage;if{this.pg.setValue;this.pg.setTime;}else{System.out.println;}}}privatebooleancheckInPage{for{p.setTime+1);}for{if){returntrue;}}returnfalse;}voidcaculate{inttimer=0;//前PageNum個(gè),先將物理快裝滿for{pg.setValue;pg.setTime;for{pg.setTime+1);}for{store=pg.getValue;}timer++;}for{store=0;}//num數(shù)組后面的頁(yè)面檢查每一個(gè)是否在前面出現(xiàn)過(guò),有置該頁(yè)框時(shí)間為1,沒(méi)有則在原基礎(chǔ)上加1for{if)//如果在物理框中將對(duì)應(yīng)位時(shí)間置為1{for//把num和pg中相等的物理塊時(shí)間置1{if){pg.setTime;break;}}for//把這次物理塊中的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg.getValue;}store=0;timer++;}else//否則找出時(shí)間最長(zhǎng)的,將其置換,并將對(duì)應(yīng)位的時(shí)間置為1{intmax=pg.getTime;intmaxindex=0;inttemp;for//找到時(shí)間最大的物理塊{temp=pg.getTime;if{max=temp;maxindex=n;}}//System.out.println;//System.out.println;pg.setTime;pg.setValue;for//把這次的數(shù)據(jù)存儲(chǔ)起來(lái){store=pg.getValue;}store=maxindex+1;timer++;}}}voiddisplay{for{for{System.out.print;}System.out.println;}}privatevoidadjustStore{for{for{temp1=store;}}for{temp1=store;}}publicintgetStore{adjustStore;returntemp1;}}3.第三個(gè)和第二個(gè)關(guān)聯(lián)的是第二個(gè)page類(lèi)的實(shí)現(xiàn)Page.javapublicclassPage{privateinttime;privateintvalue;publicvoidsetTime{this.time=t;}publicvoidsetValue{this.value=v;}publicintgetTime{returnthis.time;}publicintgetValue{returnthis.value;}Page{time=0;value=0;}}4.第四個(gè)MyFrame.javaimportjava.awt.Color;importjava.awt.Dimension;importjava.awt.FileDialog;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.TextArea;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.image.BufferedImage;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjavax.swing.ButtonGroup;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JRadioButton;importjavax.swing.JScrollPane;importjavax.swing.JSlider;importjavax.swing.JTextField;importjavax.swing.SwingConstants;//頁(yè)面置換算法publicclassMyFrameextendsJFrameimplementsActionListener,Runnable{intwidth=Toolkit.getDefaultToolkit.getScreenSize.width;//取得屏幕的寬度intheight=Toolkit.getDefaultToolkit.getScreenSize.height;//取得屏幕的高度intsize=10;//字體大小privateJTextFieldtextField1,textField2;privateJButtonbutton1,button2,button3,button4,button5,button6;privateJRadioButtonradioButton1,radioButton2;privateButtonGroupbuttongroup;privateJLabellabel1,label2,label3,label4,label5,label6;privateJLabellabel_page=newJLabel;privateJLabellabel_sign=newJLabel;//記錄運(yùn)行位置privateJLabellabel_memory=newJLabel;//記錄內(nèi)存塊變化情況privateJLabellabel_memory_LRU=newJLabel;//記錄內(nèi)存塊變化情況privateJLabellabel_memory_FIFO=newJLabel;//記錄內(nèi)存塊變化情況privateJSliderslider;//滑動(dòng)條privateJPanelpanel;privateJScrollPanescrollPane;//滾動(dòng)面板//定義打開(kāi)和保存對(duì)話框privateFileDialogopenDia,saveDia;privateTextAreatextArea;privateFilefile;privateFilesaveFile;//當(dāng)前點(diǎn)擊的按鈕privateintbutton_chose=0;//記錄自動(dòng)運(yùn)行當(dāng)前運(yùn)行到的位置privatestaticintlocation=0;Threadthread=newThread;//輸入的頁(yè)面號(hào)privateStringpage=newString;privateintpage_int=newint;//輸入的頁(yè)面號(hào)個(gè)數(shù)privateintpage_num=0;//內(nèi)存塊數(shù)privateintmemory_num=3;//最佳置換算法缺頁(yè)次數(shù)privateintOptimal_lack=0;//記錄置換過(guò)程privateintprocess_memory=newint;//創(chuàng)建LRU對(duì)象帶入?yún)?shù)LRUControllru;intprocess_memory_LRU;//LRU置換算法缺頁(yè)次數(shù)privateintOptimal_lack_LRU=0;//FIFO//創(chuàng)建對(duì)象帶入?yún)?shù)FIFOControlfifo;//創(chuàng)建一個(gè)數(shù)組用來(lái)接收數(shù)據(jù)intprocess_memory_FIFO;//FIFO置換算法缺頁(yè)次數(shù)privateintOptimal_lack_FIFO=0;privateColorcolors={Color.cyan,Color.orange,Color.green,Color.pink,Color.yellow,Color.cyan,Color.orange,Color.green,Color.pink,Color.yellow,Color.cyan,Color.orange,Color.green,Color.pink,Color.yellow,Color.cyan,Color.orange,Color.green,Color.pink,Color.yellow,};MyFrame{//構(gòu)造函數(shù)this.setTitle;this.setSize;this.setLocation/2,/2);this.setLayout;//設(shè)置布局方式label1=newJLabel;label1.setBounds;this.add;textField1=newJTextField;textField1.setBounds;this.add;button1=newJButton;button1.setBounds;button1.addActionListener;this.add;radioButton1=newJRadioButton;radioButton2=newJRadioButton;buttongroup=newButtonGroup;buttongroup.add;buttongroup.add;radioButton1.setBounds;radioButton2.setBounds;this.add;this.add;label2=newJLabel;label2.setBounds;this.add;slider=newJSlider;slider.setBounds;slider.setValue;//設(shè)置滑動(dòng)條的初始值slider.setMajorTickSpacing;//設(shè)置主刻度標(biāo)記的間隔slider.setMinorTickSpacing;//設(shè)置次刻度標(biāo)記的間隔slider.setPaintTicks;//設(shè)置滑塊繪制刻度標(biāo)記,顯示劃分刻度的slider.setPaintLabels;slider.setSnapToTicks;this.add;//textArea=newTextArea;//textArea.setBounds;//this.add;panel=newJPanel;//panel.setBounds;panel.setBackground;panel.setPreferredSize);//主要是這句代碼,設(shè)置panel的首選大小,同時(shí)保證寬高大于JScrollPane的寬高,這樣下面的JScrollPane才會(huì)出現(xiàn)滾動(dòng)條panel.setLayout;//設(shè)置panel的布局方式//this.add;scrollPane=newJScrollPane;scrollPane.setBackground;scrollPane.setBounds;scrollPane.setVerticalScrollBarPolicy;//scrollPane.getHorizontalScrollBar.setValue;//設(shè)置滾動(dòng)條的水平位置//scrollPane.getVerticalScrollBar.setValue;//設(shè)置滾動(dòng)條的豎直位置//this.add;this.getContentPane.add;label3=newJLabel;label3.setFont);label3.setBounds;panel.add;label4=newJLabel;label4.setFont);label4.setBounds;panel.add;label5=newJLabel;label5.setFont);label5.setBounds;panel.add;label6=newJLabel;label6.setFont);label6.setBounds;panel.add;button3=newJButton;button3.setBounds;button3.addActionListener;this.add;button4=newJButton;button4.setBounds;button4.addActionListener;this.add;button5=newJButton;button5.setBounds;button5.addActionListener;this.add;textArea=newTextArea;textArea.setText;textArea.setBounds;this.add;button6=newJButton;button6.setBounds;button6.addActionListener;this.add;this.setVisible;this.setResizable;//thread.start;for{for{label_memory=newJLabel;label_memory_LRU=newJLabel;label_memory_FIFO=newJLabel;}}//默認(rèn)模式為FileDialog.LOADopenDia=newFileDialog;saveDia=newFileDialog;}//清空面板publicvoidremovePanel{panel.removeAll;//清空面板panel.add;panel.add;panel.add;panel.add;panel.repaint;//刷新面板}publicvoidactionPerformed{charch;Stringstr=““;//intpage2={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//intpage_num=20;//intmemory_num=3;//Optimal;if==button1){//打開(kāi)源文件removePanel;//清空面板openDia.setVisible;StringdirPath=openDia.getDirectory;//獲取文件路徑StringfileName=openDia.getFile;//獲取文件名稱(chēng)//System.out.println;textField1.setText;//如果打開(kāi)路徑或目錄為空則返回空ifreturn;//textArea.setText;//清空文本file=newFile;try{BufferedReaderbufr=newBufferedReader);Stringline=null;intn=0;while)。=null){//將輸入的頁(yè)面號(hào)保存到page數(shù)組中for;i++){ch=line.charAt;if{str=str+ch;if-1){//獲取最后一個(gè)字符page=str;}}else{if){//page=Integer.parseInt;page=str;n++;str=““;}}ifbreak;}ifbreak;}bufr.close;page_num=n;System.out.println;for{//textArea.append;//if){label_page=newJLabel;label_page.setFont);label_page.setBounds;label_page.setOpaque;//設(shè)置其為不透明,才可以顯示出背景顏色label_page.setBackground;label_page.setHorizontalAlignment;//內(nèi)容居中panel.add;//}}panel.repaint;//刷新面板//將從文件中讀入的頁(yè)面號(hào)信息轉(zhuǎn)化為整形for{try{page_int=Integer.parseInt;}catch{//e1.printStackTrace;JOptionPane.showMessageDialog;page_num=0;break;}}//獲取內(nèi)存塊數(shù)//memory_num=slider.getValue;//System.out.println;//最佳置換算法//Optimal;}catch{thrownewRuntimeException;}}elseif==button3){//重置removePanel;//清空面板for{panel.add;//加入讀入的頁(yè)面信息}panel.repaint;//刷新面板location=0;}elseif==button4){//自動(dòng)運(yùn)行//button_chose=4;//獲取內(nèi)存塊數(shù)memory_num=slider.getValue;//最佳置換算法Optimal;//LRUlru=newLRUControl;//調(diào)用對(duì)象的計(jì)算函數(shù)lru.caculate;//要傳出的二維數(shù)組process_memory_LRU=newint;//調(diào)用對(duì)象返回參數(shù)方法process_memory_LRU=lru.getStore;System.out.println;for{for{System.out.print;}System.out.println;}//FIFOfifo=newFIFOControl;process_memory_FIFO=newint;process_memory_FIFO=fifo.getStore;System.out.println;for{for{System.out.print;}System.out.println;}if{JOptionPane.showMessageDialog;}else{removePanel;//清空面板for{panel.add;//加入讀入的頁(yè)面信息}panel.repaint;//刷新面板newThread{publicvoidrun{button4.setEnabled;//將自動(dòng)運(yùn)行按鈕設(shè)置為不可點(diǎn)擊,防止因多次點(diǎn)擊而造成顯示混亂button5.setEnabled;//根據(jù)內(nèi)存塊的多少動(dòng)態(tài)調(diào)整各顯示標(biāo)簽的位置intfrist_y=0;if{frist_y=memory_num-4;label5.setBounds;label6.setBounds;}else{label5.setBounds;label6.setBounds;}scrollPane.getHorizontalScrollBar.setValue;//設(shè)置滾動(dòng)條的水平位置Optimal_lack=0;//最佳置換缺頁(yè)數(shù)置零Optimal_lack_LRU=0;//LRU缺頁(yè)數(shù)置零Optimal_lack_FIFO=0;//FIFO缺頁(yè)數(shù)置零//繪制頁(yè)面置換情況for{label_sign.setBounds;label_sign.setHorizontalAlignment;//內(nèi)容居中panel.add;//最佳置換算法for{if{//內(nèi)存塊為空l(shuí)abel_memory.setText;}else{label_memory.setText;//process_memory+““}label_memory.setBounds;label_memory.setHorizontalAlignment;//內(nèi)容居中l(wèi)abel_memory.setOpaque;//設(shè)置其為不透明,才可以顯示出背景顏色if{//發(fā)生置換且當(dāng)前內(nèi)存塊為發(fā)生置換的內(nèi)存塊label_memory.setBackground;Optimal_lack++;//發(fā)生置換,缺頁(yè)數(shù)加一}else{label_memory.setBackground;}panel.add;}//LRUfor{//System.out.println;if{//內(nèi)存塊為空l(shuí)abel_memory_LRU.setText;}else{label_memory_LRU.setText;//process_memory+““}label_memory_LRU.setBounds+20*j,30,20);label_memory_LRU.setHorizontalAlignment;//內(nèi)容居中l(wèi)abel_memory_LRU.setOpaque;//設(shè)置其為不透明,才可以顯示出背景顏色if{//發(fā)生置換且當(dāng)前內(nèi)存塊為發(fā)生置換的內(nèi)存塊label_memory_LRU.setBackground;Optimal_lack_LRU++;//發(fā)生置換,缺頁(yè)數(shù)加一}else{label_memory_LRU.setBackground;}panel.add;}//FIFOfor{if{//內(nèi)存塊為空l(shuí)abel_memory_FIFO.setText;}else{label_memory_FIFO.setText;//process_memory+““}label_memory_FIFO.setBounds+20*j,30,20);label_memory_FIFO.setHorizontalAlignment;//內(nèi)容居中l(wèi)abel_memory_FIFO.setOpaque;//設(shè)置其為不透明,才可以顯示出背景顏色if{//發(fā)生置換且當(dāng)前內(nèi)存塊為發(fā)生置換的內(nèi)存塊label_memory_FIFO.setBackground;Optimal_lack_FIFO++;//發(fā)生置換,缺頁(yè)數(shù)加一}else{label_memory_FIFO.setBackground;}panel.add;}if{//輸出超過(guò)一定范圍時(shí),滾動(dòng)條隨顯示輸出動(dòng)態(tài)變化scrollPane.getHorizontalScrollBar.setValue);//設(shè)置滾動(dòng)條的

溫馨提示

  • 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)論