下面用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();
}
}
}