第一篇:計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)4頁(yè)面置換算法
實(shí)驗(yàn)4 頁(yè)面置換算法(2學(xué)時(shí))
一、實(shí)驗(yàn)?zāi)康?/p>
通過實(shí)驗(yàn)加強(qiáng)對(duì)虛擬存儲(chǔ)管理中頁(yè)面置換算法的理解和掌握。
二、實(shí)驗(yàn)內(nèi)容
編寫程序?qū)崿F(xiàn)虛擬存儲(chǔ)管理中OPT,FIFO,LRU頁(yè)面置換算法。
三、實(shí)驗(yàn)要求
1、任意給出一組頁(yè)面訪問順序(如頁(yè)面走向是1、2、5、7、5、7、1、4、3、5、6、4、3、2、1、5、2)。
2、分配給該作業(yè)一定的物理塊(如3塊、4塊等)。
3、利用OPT,FIFO,LRU頁(yè)面置換算法模擬頁(yè)面置換過程并計(jì)算其缺頁(yè)率。
4、每訪問一個(gè)頁(yè)面均需給出內(nèi)存中的內(nèi)容(內(nèi)存中的頁(yè)面號(hào)),若有淘汰還需給出淘汰的頁(yè)面號(hào)。
5、通過給出特殊的頁(yè)面訪問順序,分配不同的物理塊,利用FIFO算法計(jì)算其缺頁(yè)率,進(jìn)一步理解Belady現(xiàn)象。
6、(附加)實(shí)現(xiàn)CLOCK置換算法,修改位可在確定頁(yè)面號(hào)時(shí)直接任意給出。
程序代碼(java)
package wcm4;
import java.util.LinkedList;import java.util.Scanner;
public class Test {
/**
* @param args
*/ LinkedList ll=new LinkedList();int a;int leng;int[] all={1,2,5,7,5,7,1,4,3,5,6,4,3,2,1,5,2};//int[] free=new int[all.length];
Object o=new Integer(a);public static void main(String[] args){
public void begin(){ System.out.println(“請(qǐng)選擇測(cè)試類型:”);System.out.println(“1 OPT;2 FiFO;3 LRU;4 CLOCK;5退出”);
} public void need(){ System.out.println(“請(qǐng)輸入分配給該作業(yè)的物理塊數(shù):”);Scanner sc=new Scanner(System.in);leng=sc.nextInt();Scanner sc=new Scanner(System.in);int choose=sc.nextInt();while(choose!=5){
} switch(choose){ case 1:this.opt();break;case 2:this.fifo();break;case 3:this.lru();break;case 4:this.clock();break;} System.out.println(“請(qǐng)選擇測(cè)試類型:”);System.out.println(“1 OPT;2 FiFO;3 LRU;4 CLOCK;5退出”);sc=new Scanner(System.in);choose=sc.nextInt();// TODO Auto-generated method stub Test t=new Test();t.begin();
}
}
public void fifo(){ ll=new LinkedList();this.need();
int a=0;for(int i=0;i o=all[i];if(!ll.contains(o)){ } if(ll.size() } ll.add(o);o=ll.poll();a++;else{ o=null;} this.print();} System.out.println(“FIFO的缺頁(yè)率為:”);System.out.println(a);System.out.println(“——”);System.out.println(all.length); } public void opt(){//最佳置換算法 //leng=0;ll=new LinkedList();this.need();int a=0;//int temp=0;//int[] b=new int[leng]; for(int i=0;i int[] b=new int[leng];o=all[i];if(!ll.contains(o)){ if(ll.size() ll.add(o); } o=null;} else{ for(int j=i;j Object o1=new Integer(all[j]); } for(int k=0;k } if(ll.get(k).equals(o1)){ } if(b[k]==0){ b[k]=j;//待替換的頁(yè)在以后第一次出現(xiàn)的位置 } } if(b[leng-1]==0){ o=ll.set(leng-1, o);a++;} else{ int temp=0; } for(int m=0;m if(b[m]==0){ temp=m;break;} else if(b[m]>b[temp]){ } temp=m; } o=ll.set(temp, o);//替換以后離得最遠(yuǎn)的 a++;} else{ } o=null;this.print();} System.out.println(“OPT的缺頁(yè)率為:”);System.out.println(a);System.out.println(“——”);System.out.println(all.length); public void lru(){//最近最久未使用 } public void clock(){//簡(jiǎn)單clock ll=new LinkedList();this.need();int a=0;int[] b=new int[leng];for(int i=0;i o=all[i];if(!ll.contains(o)){ if(ll.size() o=all[i];if(!ll.contains(o)){ if(ll.size() } ll.add(o);o=ll.poll();a++;} else{ ll.add(o);ll.remove(o);o=null;} this.print();} System.out.println(“OPT的缺頁(yè)率為:”);System.out.println(a);System.out.println(“——”);System.out.println(all.length); } } else{ for(int j=0;j<=ll.size();j++){ if(b[j%ll.size()]==0){ } } } else{ int temp1=j%ll.size(); } o=ll.set(temp1, o); b[temp1]=0;//改變?cè)撐坏臉?biāo)記位 break; b[j%ll.size()]=1;a++;} else{ int temp=ll.indexOf(o);//找到該位 b[temp]=0;o=null;} this.print();System.out.println(“標(biāo)記位為:”);for(int k=0;k public void print(){ Object[] op=ll.toArray();for(int i=0;i ”);System.out.println(o);//System.out.println();System.out.print(op[i]);} } 計(jì)算機(jī)工程學(xué)院 實(shí)驗(yàn)報(bào)告書 課程名:《 操作系統(tǒng)原理A 》 題 目: 虛擬存儲(chǔ)器管理 頁(yè)面置換算法模擬實(shí)驗(yàn) 班 級(jí): 學(xué) 號(hào): 姓 名: 評(píng)語(yǔ): 成績(jī): 指導(dǎo)教師: 批閱時(shí)間: ****年**月**日 一、實(shí)驗(yàn)?zāi)康呐c要求 1.目的: 請(qǐng)求頁(yè)式虛存管理是常用的虛擬存儲(chǔ)管理方案之一。通過請(qǐng)求頁(yè)式虛存管理中對(duì)頁(yè)面置換算法的模擬,有助于理解虛擬存儲(chǔ)技術(shù)的特點(diǎn),并加深對(duì)請(qǐng)求頁(yè)式虛存管理的頁(yè)面調(diào)度算法的理解。 2.要求: 本實(shí)驗(yàn)要求使用C語(yǔ)言編程模擬一個(gè)擁有若干個(gè)虛頁(yè)的進(jìn)程在給定的若干個(gè)實(shí)頁(yè)中運(yùn)行、并在缺頁(yè)中斷發(fā)生時(shí)分別使用FIFO和LRU算法進(jìn)行頁(yè)面置換的情形。其中虛頁(yè)的個(gè)數(shù)可以事先給定(例如10個(gè)),對(duì)這些虛頁(yè)訪問的頁(yè)地址流(其長(zhǎng)度可以事先給定,例如20次虛頁(yè)訪問)可以由程序隨機(jī)產(chǎn)生,也可以事先保存在文件中。要求程序運(yùn)行時(shí)屏幕能顯示出置換過程中的狀態(tài)信息并輸出訪問結(jié)束時(shí)的頁(yè)面命中率。程序應(yīng)允許通過為該進(jìn)程分配不同的實(shí)頁(yè)數(shù),來(lái)比較兩種置換算法的穩(wěn)定性。 二、實(shí)驗(yàn)說明 1.設(shè)計(jì)中虛頁(yè)和實(shí)頁(yè)的表示 本設(shè)計(jì)利用C語(yǔ)言的結(jié)構(gòu)體來(lái)描述虛頁(yè)和實(shí)頁(yè)的結(jié)構(gòu)。 pn pfn time pn pfn next 虛頁(yè)結(jié)構(gòu) 實(shí)頁(yè)結(jié)構(gòu) 在虛頁(yè)結(jié)構(gòu)中,pn代表虛頁(yè)號(hào),因?yàn)楣?0個(gè)虛頁(yè),所以pn的取值范圍是0—9。pfn代表實(shí)頁(yè)號(hào),當(dāng)一虛頁(yè)未裝入實(shí)頁(yè)時(shí),此項(xiàng)值為-1;當(dāng)該虛頁(yè)已裝入某一實(shí)頁(yè)時(shí),此項(xiàng)值為所裝入的實(shí)頁(yè)的實(shí)頁(yè)號(hào)pfn。time項(xiàng)在FIFO算法中不使用,在LRU中用來(lái)存放對(duì)該虛頁(yè)的最近訪問時(shí)間。 在實(shí)頁(yè)結(jié)構(gòu)中中,pn代表虛頁(yè)號(hào),表示pn所代表的虛頁(yè)目前正放在此實(shí)頁(yè)中。pfn代表實(shí)頁(yè)號(hào),取值范圍(0—n-1)由動(dòng)態(tài)指派的實(shí)頁(yè)數(shù)n所決定。next是一個(gè)指向?qū)嶍?yè)結(jié)構(gòu)體的指針,用于多個(gè)實(shí)頁(yè)以鏈表形式組織起來(lái),關(guān)于實(shí)頁(yè)鏈表的組織詳見下面第4點(diǎn)。 2.關(guān)于缺頁(yè)次數(shù)的統(tǒng)計(jì) 為計(jì)算命中率,需要統(tǒng)計(jì)在20次的虛頁(yè)訪問中命中的次數(shù)。為此,程序應(yīng)設(shè)置一個(gè)計(jì)數(shù)器count,來(lái)統(tǒng)計(jì)虛頁(yè)命中發(fā)生的次數(shù)。每當(dāng)所訪問的虛頁(yè)的pfn項(xiàng)值不為-1,表示此虛頁(yè)已被裝入某實(shí)頁(yè)內(nèi),此虛頁(yè)被命中,count加1。最終命中率=count/20*100%。 3.LRU算法中“最近最久未用”頁(yè)面的確定 為了能找到“最近最久未用”的虛頁(yè)面,程序中可引入一個(gè)時(shí)間計(jì)數(shù)器countime,每當(dāng)要訪問一個(gè)虛頁(yè)面時(shí),countime的值加1,然后將所要訪問的虛頁(yè)的time項(xiàng)值設(shè)置為增值后的當(dāng)前countime值,表示該虛頁(yè)的最后一次被訪問時(shí)間。當(dāng)LRU算法需要置換時(shí),從所有已分配實(shí)頁(yè)的虛頁(yè)中找出time值為最小的虛頁(yè)就是“最近最久未用”的虛頁(yè)面,應(yīng)該將它置換出去。 4.算法中實(shí)頁(yè)的組織 因?yàn)槟芊峙涞膶?shí)頁(yè)數(shù)n是在程序運(yùn)行時(shí)由用戶動(dòng)態(tài)指派的,所以應(yīng)使用鏈表組織動(dòng)態(tài)產(chǎn)生的多個(gè)實(shí)頁(yè)。為了調(diào)度算法實(shí)現(xiàn)的方便,可以考慮引入free和busy兩個(gè)鏈表:free鏈表用于組織未分配出去的實(shí)頁(yè),首指針為free_head,初始時(shí)n個(gè)實(shí)頁(yè)都處于free鏈表中;busy鏈表用于組織已分配出去的實(shí)頁(yè),首指針為busy_head,尾指針為busy_tail,初始值都為null。當(dāng)所要訪問的一個(gè)虛頁(yè)不在實(shí)頁(yè)中時(shí),將產(chǎn)生缺頁(yè)中斷。此時(shí)若free鏈表不為空,就取下鏈表首指針?biāo)傅膶?shí)頁(yè),并分配給該虛頁(yè)。若free鏈表為空,則說明n個(gè)實(shí)頁(yè)已全部分配出去,此時(shí)應(yīng)進(jìn)行頁(yè)面置換:對(duì)于FIFO算法要將busy_head 所指的實(shí)頁(yè)從busy鏈表中取下,分配給該虛頁(yè),然后再將該實(shí)頁(yè)插入到busy鏈表尾部;對(duì)于LRU算法則要從所有已分配實(shí)頁(yè)的虛頁(yè)中找出time值為最小的虛頁(yè),將該虛頁(yè)從裝載它的那個(gè)實(shí)頁(yè)中置換出去,并在該實(shí)頁(yè)中裝入當(dāng)前正要訪問的虛頁(yè)。 三、程序流程圖 四、主要程序清單 #include #include /*全局變量*/ int mSIZE; /*物理塊數(shù)*/ int pSIZE; /*頁(yè)面號(hào)引用串個(gè)數(shù)*/ static int memery[10]={0}; /*物理塊中的頁(yè)號(hào)*/ static int page[100]={0}; /*頁(yè)面號(hào)引用串*/ static int temp[100][10]={0}; /*輔助數(shù)組*/ /*置換算法函數(shù)*/ void FIFO(); void LRU(); void OPT(); /*輔助函數(shù)*/ void print(unsigned int t); void designBy(); void download(); void mDelay(unsigned int Delay); /*主函數(shù)*/ void main() { int i,k,code; printf(“請(qǐng)輸入物理塊的個(gè)數(shù)(M<=10):“); scanf(“%d“,&mSIZE); printf(“請(qǐng)輸入頁(yè)面號(hào)引用串的個(gè)數(shù)(P<=100):“); scanf(“%d“,&pSIZE); puts(“請(qǐng)依次輸入頁(yè)面號(hào)引用串(連續(xù)輸入,無(wú)需隔開):“); for(i=0;i scanf(“%1d“,&page[i]); download(); do { puts(“輸入的頁(yè)面號(hào)引用串為:“); for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(“%d\n“,page[i]); else printf(“%d “,page[i]); } } printf(“* * * * * * * * * * * * * * * * * * * * * * *\n“); printf(“* 請(qǐng)選擇頁(yè)面置換算法:\t\t\t *\n“); printf(“* -----------------------------------------*\n“); printf(“* 1.先進(jìn)先出(FIFO) 2.最近最久未使用(LRU) *\n“); printf(“* 3.退出 *\n“); printf(“* * * * * * * * * * * * * * * * * * * * * * *\n“); printf(“請(qǐng)選擇操作:[ ]\b\b“); scanf(“%d“,&code); switch(code) { case 1: FIFO(); break; case 2: LRU(); break; case 3: OPT(); break; case 4: system(“cls“); //system(“color 0A“); exit(0); default: printf(“輸入錯(cuò)誤,請(qǐng)重新輸入:“); } printf(“按任意鍵重新選擇置換算法:>>>“); getchar(); } while (code!=4); getchar(); } /*載入數(shù)據(jù)*/ void download() { printf(“\nFinish.\n載入成功!“); } /*設(shè)置延遲*/ void mDelay(unsigned int Delay) { unsigned int i; for(;Delay>0;Delay--) { for(i=0;i<124;i++) { printf(“ \b“); } } } /*顯示設(shè)計(jì)者信息*/ void print(unsigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf(“%d\n“,page[i]); else printf(“%d “,page[i]); } for(j=0;j { for(i=20*k;(i if(i>=j) printf(“ |%d|“,temp[i][j]); else printf(“ | |“); } for(i=mSIZE+20*k;(i { for(flag=0,l=0;l if(temp[i][l]==temp[i-1][l]) flag++; if(flag==mSIZE)/*頁(yè)面在物理塊中*/ printf(“ “); else printf(“ |%d|“,temp[i][j]); } /*每行顯示20個(gè)*/ if(i%20==0) continue; printf(“\n“); } } printf(“----------------------------------------\n“); printf(“缺頁(yè)次數(shù):%d\t\t“,t+mSIZE); printf(“缺頁(yè)率:%d/%d\n“,t+mSIZE,pSIZE); printf(“置換次數(shù):%d\t\t“,t); printf(“訪問命中率:%d%%\n“,(pSIZE-(t+mSIZE))*100/pSIZE); printf(“----------------------------------------\n“); } /*計(jì)算過程延遲*/ void compute() { int i; printf(“正在進(jìn)行相關(guān)計(jì)算,請(qǐng)稍候“); for(i=0;i++<30;printf(“\b“)); for(i=0;i++<30;printf(“ “)); for(i=0;i++<30;printf(“\b“)); } /*先進(jìn)先出頁(yè)面置換算法*/ void FIFO() { int memery[10]={0}; int time[10]={0}; /*記錄進(jìn)入物理塊的時(shí)間*/ int i,j,k,m; int max=0; /*記錄換出頁(yè)*/ int count=0; /*記錄置換次數(shù)*/ /*前mSIZE個(gè)數(shù)直接放入*/ for(i=0;i { memery[i]=page[i]; time[i]=i; for(j=0;j temp[i][j]=memery[j]; } for(i=mSIZE;i { /*判斷新頁(yè)面號(hào)是否在物理塊中*/ for(j=0,k=0;j { if(memery[j]!=page[i]) k++; } if(k==mSIZE) /*如果不在物理塊中*/ { count++; /*計(jì)算換出頁(yè)*/ max=time[0]第二篇:計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)三頁(yè)面置換算法模擬實(shí)驗(yàn)