用java实现页面置换

下面用FIFO和LRU两种方法实现了页面置换算法。页面大小,逻辑地址均以kb为单位



package 页面置换;



public class Chart {
int knumber;
int ynumber;
int flag;
public Chart(int knumber,int ynumber)
{
this.knumber = knumber;
this.ynumber = ynumber;
}
public void setYnumber(int ynumber)
{
this.ynumber = ynumber;
}
public int getYnumber()
{
return ynumber;
}
public void setKnumber(int knumber)
{
this.knumber = knumber;
}
public int getKnumber()
{
return knumber;
}
        public void setFlag(int flag)
{
this.flag = flag;
}
public int getFlag()
{
return flag;
}


}



package 页面置换;
import java.util.Scanner;
public class Menu {
public static void menu()
{
System.out.println("页面置换算法模拟程序");
System.out.println("1.初始化");
System.out.println("2.FIFO算法");
System.out.println("3.LRU算法");
System.out.println("4.退出!");
System.out.println("请输入选择:");
}



}




package 页面置换;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class FIFO {

public static void fifo(int size,int number,int sum)
{
List<Chart> l = new ArrayList<Chart>();
int r = 0;               //r是一个变量,来记录进入物理块内的页号的先后顺序,r越小,所对应物理块的页号进入的越早
for(int q = 0; q < number; q++)
{
Chart s = new Chart(q,-1);
l.add(s);
}
System.out.println("请输入要访问的逻辑地址<-1退出>:");
Scanner sc = new Scanner(System.in);
int y = sc.nextInt();
while( y != -1)
{

int i;
for( i = 0; i < sum / size; i++)
{
if(y >= i * size * 1024 && y < ( i + 1 ) * size * 1024 - 1)
{
break;
}
}
if(i == sum/size)
{
System.out.println("错误,地址越界!");
}
else
{
System.out.print("页号:" + i + "\t");
int s;
for( s = 0; s < l.size(); s++)
{
if((l.get(s)).getYnumber() == i)
{
System.out.println("该页已在内存中!");
show(l);
break;
}
}
if(s == l.size())
{
System.out.println("该页不在内存中,调入!");
int k;
for( k = 0;k < l.size(); k++)
{
if((l.get(k)).getYnumber() == -1)
{
(l.get(k)).setYnumber(i);
(l.get(k)).setFlag(r++);
break;
}
}
if(k == l.size())
{
int min = (l.get(0)).getFlag();
int w = 0;
for(int z = 1; z < l.size(); z++)
{
if((l.get(z)).getFlag() < min)
{
min = (l.get(z)).getFlag();
w = z;
}

}
(l.get(w)).setYnumber(i);
(l.get(w)).setFlag(r++);

}
show(l);
}

}
System.out.println("请输入要访问的逻辑地址<-1退出>:");
Scanner ss = new Scanner(System.in);
y = ss.nextInt();

}
}
public static void show( List<Chart> l)
{
System.out.println("物理块号\t页号");
for(int i = 0; i < l.size();i++)
{
System.out.println((l.get(i)).getKnumber()+"\t"+(l.get(i)).getYnumber());
}
}


}




package 页面置换;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class LRU {

public static void lru(int size,int number,int sum)
{
List<Chart> l = new ArrayList<Chart>();
for(int q = 0; q < number; q++)
{
Chart s = new Chart(q,-1);
l.add(s);
}
int [] t = new int[l.size()];      //用数组来记录每个物理块内页号的停留时间,停留时间越长的越早被置换
for(int w = 0; w < l.size(); w++)
{
t[w]=0;
(l.get(w)).setFlag(t[w]);
}
System.out.println("请输入要访问的逻辑地址<-1退出>:");
Scanner sc = new Scanner(System.in);
int y = sc.nextInt();
while( y != -1)
{

int i;
for( i = 0; i < sum / size; i++)
{
if(y >= i * size * 1024 && y < ( i + 1 ) * size * 1024 - 1)
{
break;
}
}
if(i == sum/size)
{
System.out.println("错误,地址越界!");
}
else
{
System.out.print("页号:" + i + "\t");
int s;
for( s = 0; s < l.size(); s++)
{
if((l.get(s)).getYnumber() == i)
{
System.out.println("该页已在内存中!");
for(int d = 0; d < l.size();d++)
{
if((l.get(d)).getYnumber() != -1)
{
(l.get(d)).setFlag(t[d]++);
}
   }

t[s] = 0;
(l.get(s)).setFlag(t[s]);
show(l);
break;
}
}
if(s == l.size())
{
System.out.println("该页不在内存中,调入!");
int k;
for( k = 0;k < l.size(); k++)
{
if((l.get(k)).getYnumber() == -1)
{
(l.get(k)).setYnumber(i);
for(int d = 0; d < l.size();d++)
{
if((l.get(d)).getYnumber() != -1)
{
(l.get(d)).setFlag(t[d]++);
}
   }

break;
}
}
if(k == l.size())
{
   int max = (l.get(0)).getFlag();
int w = 0;
for(int z = 1; z < l.size(); z++)
{
if((l.get(z)).getFlag() > max)
{
max = (l.get(z)).getFlag();
w = z;
}

}
(l.get(w)).setYnumber(i);
for(int d = 0; d < l.size();d++)
{
if((l.get(d)).getYnumber() != -1)
{
(l.get(d)).setFlag(t[d]++);
}
   }
t[w] = 0;
(l.get(w)).setFlag(t[w]);

}
show(l);
}

}
System.out.println("请输入要访问的逻辑地址<-1退出>:");
Scanner ss = new Scanner(System.in);
y = ss.nextInt();

}
}
public static void show(List<Chart> l)
{
System.out.println("物理块号\t页号");
for(int i = 0; i < l.size();i++)
{
System.out.println((l.get(i)).getKnumber()+"\t"+(l.get(i)).getYnumber());
}
}


}





package 页面置换;
import java.util.Scanner;
public class Pagechange {


public static void main(String[]args)
{
Menu.menu();
int x = 0, k = 0, z = 0;
Scanner sv = new Scanner(System.in);
int y = sv.nextInt();
while( y >= 1 && y <= 4)
{


switch(y)
{
case 1:
Scanner sc = new Scanner(System.in); 
    Scanner sa = new Scanner(System.in); 
    Scanner sb = new Scanner(System.in); 
    System.out.println("请输入页面大小<kb>:");
    x = sa.nextInt();
    System.out.println("请输入作业逻辑地址空间的大小<kb>:");
    k = sb.nextInt();
    System.out.println("请输入物理块个数:");
    z = sc.nextInt();
break;
case 2:
FIFO.fifo(x,z,k);
   break;
case 3:
LRU.lru(x,z,k);
break;
case 4:
System.exit(0);
}
Menu.menu();
Scanner sq = new Scanner(System.in);
y = sq.nextInt();
}

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值