一. 算法介绍
二. 代码实现
package com.wangt.java;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* @author 王天赐
* @create 2019-12-11 16:44
*/
public class LruMain {
/**
* 记录命中数
*/
private static int selectPages;
/**
* 存储命中率
*/
private static double selectPagesRate;
/**
* 内存大小
*/
private final static int MEMORY_SIZE = 5;
/**
* 获取随机进程数
*
* @return
*/
private static List<Integer> getProcessSeq() {
// 随机页号的起始值
int start = 1;
// 随机页号的结束值
int end = 10;
List<Integer> processSeq = new ArrayList<>();
for (int i = 0; i < 10; i++) {
processSeq.add(randomInt(start, end));
}
return processSeq;
}
/**
* 随机生成指定范围的Int类型的数
*
* @param start 开始值
* @param end 结束值为 end - 1
* @return
*/
private static int randomInt(int start, int end) {
return (int) ((Math.random() * (end - start)) + start);
}
/**
* 打印随机生成的页面信息
*
* @param processSeq
*/
public static void printPageInfo(List<Integer> processSeq) {
System.out.println("<==================== [页面信息] ====================>");
for (int i = 0; i < processSeq.size(); i++) {
System.out.println("第" + i + "个页面号为:" + processSeq.get(i));
}
System.out.println("<==================== [页面信息] ====================>");
System.out.println();
}
public static void printPageReplacementCase(Stack<Integer> pageNums) {
for (int i = 0; i < 5; i++) {
if (pageNums.size() > i) {
System.out.print(pageNums.get(i) + " ");
} else {
System.out.print("0 ");
}
}
System.out.println();
}
/**
* 模拟 LRU 算法
*/
public static void LRUAlgorithm() {
List<Integer> processSeq = getProcessSeq();
// 打印随机生成的页面信息
printPageInfo(processSeq);
// 用于存储已经访问的各个页面的页面号
Stack<Integer> pageNums = new Stack();
System.out.println("<==================== [置换信息] ====================>");
for (Integer process : processSeq) {
// 先判断页面是否已经调入内存
if (pageNums.search(process) != -1) {
// 如果页面已经存在, 则将页面调入栈顶
// 1.移除该元素
pageNums.remove(process);
// 2.重新将数据push进栈中
pageNums.push(process);
// 3.页面命中数加一
selectPages++;
} else {
// 如果页面在内存中不存在
// 1.判断内存是否已满(就是栈的大小是否等于5)
if (pageNums.size() < MEMORY_SIZE) {
// 如果栈内元素大小小于最大值, 说明内存该没有满
// 直接将页面添加进内存即可
pageNums.push(process);
} else {
// 否则说明内存已满, 此时需要移除最近最久未使用的页面
// 即栈底元素
// 1.获取栈底元素
Integer element = pageNums.lastElement();
// 2.移除该元素
pageNums.remove(element);
// 3.将即将访问的页面添加进内存中(栈是用来记录访问的页面的页号)
pageNums.push(process);
}
}
printPageReplacementCase(pageNums);
}
System.out.println("<==================== [置换信息] ====================>");
// 命中率
selectPagesRate = (double) selectPages / processSeq.size();
System.out.println("命中数 : " + selectPages + " 命中率 : " + selectPagesRate);
}
public static void main(String[] args) {
LRUAlgorithm();
}
}