前言
本文只是实现了 O P T ( 最 佳 适 应 算 法 ) , F I F O ( 先 进 先 出 ) , L R U ( 最 久 未 使 用 ) , N R U ( 简 单 C l o c k ) OPT(最佳适应算法),FIFO(先进先出),LRU(最久未使用),NRU(简单Clock) OPT(最佳适应算法),FIFO(先进先出),LRU(最久未使用),NRU(简单Clock)
因为算法实现过于简单,这里不详细说明实现步骤,但是有详细的代码注释
以下附部分实验结果图
Code :
import jdk.swing.interop.SwingInterOpUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
//7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
/**
* FIFO
* Length = 8;
* PageFlow = new int[Length];
*
* PageFlow[0] = 7;
* PageFlow[1] = 0;
* PageFlow[2] = 1;
* PageFlow[3] = 2;
* PageFlow[4] = 0;
* PageFlow[5] = 3;
* PageFlow[6] = 0;
* PageFlow[7] = 4;
* 测试数据
*/
public class Algorithm {
Scanner scanner = new Scanner(System.in);
private int Csize;//物理块大小
private int Length;//流向长度
private int PageFlow[];//流向数组
Map<Integer,Boolean> mp;//标记是否在块中
private int PageLose;//缺页次数
private int Output[][];//控制输出
private int idx;//控制输出的下标
private boolean LoseOrNot[];//用于控制输出 √
public Algorithm(){
System.out.println("请输入物理块大小");
Csize = scanner.nextInt();
System.out.println("请输入页面数量 :");
Length = scanner.nextInt();
PageFlow = new int[Length];
Output = new int[Length][Csize+1];
LoseOrNot = new boolean[Length];
idx = 0 ;
System.out.println("随机生成访问流");
// for(int i = 0 ;i<Length;i++){
// PageFlow[i] = scanner.nextInt();
// }//方便调试
GetRandomDate();
for(int i = 0 ;i<Length ; i ++ ){
System.out.print(PageFlow[i]+" ");
}
System.out.println();
}
//早 晚
public void FIFO() {
PageLose = 0;
mp = new HashMap<>();//每次都清空一下 标记map
int temp[] = new int[1024];//用来记录在块中的数组
int hh = 1, tt = 0;//队头队尾指针
for (int i = 0; i < Length; i++) {
mp.put((Integer) PageFlow[i], false);//初始化标记数组
}
System.out.println("久----------->刚");
System.out.println("0表示未出现在块中");
//开始执行访问流
for (int i = 0; i < Length; i++) {
if ((tt - hh) + 1 == Csize && mp.get(PageFlow[i]) == false) {
//已经存满了 并且不在当前块中
//弹出队头
mp.put((Integer) temp[hh