java实现FIFO和LRU页面置换算法
程序员文章站
2022-07-12 17:15:33
...
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请指教~