1. 程式人生 > >java實現FIFO和LRU頁面置換演算法

java實現FIFO和LRU頁面置換演算法

   FIFO是記憶體管理的一種頁面置換演算法,FIFO(First Input First Output),即先進先出佇列。例:在超市購物之後會提著我們滿滿的購物車來到收銀臺排在結賬隊伍的最後,眼睜睜地看著前面的客戶一個個離開。這就是一種先進先出機制,先排隊的客戶先行結賬離開。

  LRU記憶體管理的另一種頁面置換演算法,對於在記憶體中但又不用的資料塊(記憶體塊)叫做LRU,作業系統會根據哪些資料屬於LRU而將其移出記憶體而騰出空間來載入另外的資料。 LRU是Least Recently Used的縮寫,即最近最久未使用,常用於頁面置換演算法,是為虛擬頁式儲存管理服務的。

JAVA實現如下(可以直接執行):

import java.util.Scanner;

class wuli{
	int vlu;
	int falt;
	 wuli(int vlu ){
		this.falt=-1;
		this.vlu=vlu;
	}
}


public class fifolru {
int mun;            //物理塊數
int yemianmun;     //頁面個數


fifolru(int mun,int yemianmun) {
	this.mun=mun;
	this.yemianmun=yemianmun;

}
public static void fifo(wuli a[],int b[] ) { //------------------------------------------fifo------------
	System.out.println("+++++++++++++FIFO演算法++++++++++++++++");
	int mun=0;
	int count=0;
	for(int q=0;q<a.length;q++) 
		a[q]=new wuli (-2);                //初始化物件	        
	for(int q=0;q<b.length;q++) {  		
		 if(count==a.length) { 
		
			   int f=0;                 //處理滿的情況			
			 for(int qq=0;qq<a.length;qq++) {
					if(a[qq].falt==b[q]) {
					 System.out.println("*發現相同,不存入  ");					
					 f=1;
					 break;
					 }
					}				
				if(f==0)  { 
					System.out.println("到達一個元素"+b[q]+"已經滿,彈出第一個元素"+a[0].falt+" 末尾加入元素"+b[q]);
					mun++;
			    for(int z=0;z<a.length-1;z++) {      //前移
					 a[z].falt=a[z+1].falt; 
				 }
				 a[a.length-1].falt=b[q];    //最後一個賦值	
				 }
				continue;
			 }	 		 
		    int k=0;
			for(int qq=0;qq<a.length;qq++) {                        //處理未滿情況
				if(a[qq].falt==b[q]) {
				 System.out.println("發現相同,不存入  ");				
				 k=1;
				 break;
				}
			}				
			if(k==0)
			{
				for(int z=0;z<a.length;z++)	              
					if(a[z].vlu==-2)                  //找到沒用到的物理塊
				{ a[z].falt=b[q];	  a[z].vlu=0; 	mun++;count++;System.out.println("沒有發現相同,存入  ");	   break;}			
		}
			continue;			
	}			
	System.out.print("++++++++++結果物理塊的值:");                  //fifo結果
	for(int a1=0;a1<a.length;a1++) {
		System.out.print(a[a1].falt+"  ");
		}
		System.out.println("++++++++++");
	System.out.println("++++++++++FIFO缺頁次數:"+mun+"次  +++++++++++");  
		
}
public static void lru(wuli a[],int b[] ) {     //------------------------------------------------lru
	System.out.println("++++++++++LRU演算法++++++++++++");
	int mun=0;
	int count=0;
	for(int q=0;q<a.length;q++) 
		a[q]=new wuli (-2);                              //初始化物件	 
	
	for(int q=0;q<b.length;q++) { 
		
		 if(count==a.length) {                     //處理滿的情況	
		
			   int f=0;                		
			 for(int qq=0;qq<a.length;qq++) {
					if(a[qq].falt==b[q]) {
					 System.out.println("*發現相同,不存入,更新位置  ");
					 int ji=qq;
					 
					 for(int s=qq;s>0;s--)
							a[s].falt=a[s-1].falt;
					a[0].falt=b[q];					 
					 f=1;
					 break;
					 }
					}				
				if(f==0)  { 
					System.out.println("到達一個元素"+b[q]+"已經滿,彈出最後一個元素"+a[a.length-1].falt+" 首部加入元素"+b[q]);
					mun++;
					for(int s=a.length-1;s>0;s--)
					a[s].falt=a[s-1].falt;
								a[0].falt=b[q];
				 }
				continue;
			 }	
		 		                                                 
	            int k=0;
				for(int qq=a.length-1;qq>= 0;qq--) {                        //處理未滿情況
					if(a[qq].falt==b[q]) {
					 System.out.println("發現相同,不存入,更新位置  ");
					 int ji=qq;
					 while(a[ji-1].falt!=-1)
                          { a[ji].falt=a[ji-1].falt ;
                            ji--;
                          }
					 for(int z=a.length-1;z>=0;z--)	              
							if(a[z].vlu==-2) 
								a[z+1].falt=b[q];	

					 					 
					 k=1;
					 break;
					}
				}				
				if(k==0)
				{
					for(int z=a.length-1;z>=0;z--)	              
						if(a[z].vlu==-2)                  //找到沒用到的物理塊
					{ a[z].falt=b[q];	  a[z].vlu=0; mun++;	count++;System.out.println("沒有發現相同,存入  ");
				
					break;}			
			}
				continue;
		
	}
	
	System.out.print("++++++++++結果物理塊的值:");                  //lru結果
	for(int a1=0;a1<a.length;a1++) {
		System.out.print(a[a1].falt+"  ");
		}
		System.out.println("++++++++++");
	System.out.println("++++++++++FIFO缺頁次數:"+mun+"次  +++++++++++");  
		
}

public static void main(String arg[]) {
Scanner input=new Scanner(System.in);
System.out.println("請輸入分配給程式的物理塊數");
int mun0=input.nextInt();

wuli wulikuai[]=new wuli[mun0];                   //物理塊陣列
System.out.println("請輸入頁面流的個數");
int mun1=input.nextInt();
int yemianmun[]=new int[mun1];               //頁面個數陣列
fifolru text=new fifolru(mun0, mun1);


System.out.print("請順序輸入頁面流");
for(int a=0;a<yemianmun.length;a++) {
 int shuju = input.nextInt();
 yemianmun[a]=shuju;
}
System.out.print("選擇fifo演算法,還是LRU演算法。1——fifo,2——LRU,3——都選擇");
int key=input.nextInt();
switch (key) {
case 1:
	fifo(wulikuai, yemianmun);
	break;
case 2:
	lru(wulikuai, yemianmun);
	break;
case 3:
	fifo(wulikuai, yemianmun);
	lru(wulikuai, yemianmun);
	break;
}

}	
	
}
執行:



總結:具體的執行流程結果比較清楚了~就不多解釋了,要是有bug請指教~