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请指教~







  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值