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

}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
页面置换算法是操作系统中的重要概念之一,用于解决内存不足时如何将当前使用频率较低的页面从内存中置换出去,以便为其他进程或者应用程序腾出空间。下面是用 Java 代码实现 LRU 页面置换算法的示例: ``` import java.util.*; public class LRU { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入内存块大小:"); int memSize = sc.nextInt(); // 内存块大小 int[] mem = new int[memSize]; // 内存块 int[] pages = new int[] {1, 2, 3, 4, 5, 6, 1, 2, 7, 8, 1, 3, 7, 9, 1}; // 页面访问序列 Map<Integer, Integer> map = new HashMap<>(); // 存储页面编号及其最近一次访问的时间 int time = 0; // 当前时间 for (int i = 0; i < pages.length; i++) { int page = pages[i]; time++; if (map.containsKey(page)) { // 页面已在内存中 map.put(page, time); // 更新最近一次访问时间 } else { // 页面未在内存中 int minTime = Integer.MAX_VALUE; // 记录最久未被访问的页面的最近访问时间 int minPage = -1; // 记录最久未被访问的页面 for (int j = 0; j < mem.length; j++) { if (mem[j] == 0) { // 内存块未被占用 mem[j] = page; map.put(page, time); break; } if (map.get(mem[j]) < minTime) { minTime = map.get(mem[j]); minPage = mem[j]; } } if (minPage != -1) { // 内存块已满,需置换页面 for (int j = 0; j < mem.length; j++) { if (mem[j] == minPage) { mem[j] = page; map.remove(minPage); map.put(page, time); break; } } } } System.out.print("第" + (i + 1) + "个页面访问后,内存中的页面为:"); for (int j = 0; j < mem.length; j++) { System.out.print(mem[j] + " "); } System.out.println(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值