关于LinkedHashMap实现LRU 用LinkedHashMap实现LRU,然后要求把每次置换的页输出到一个文档里,小弟不才~看LinkedHashMap的源代码看的稀里糊涂的,不知道怎么才能把置换的页面输出出来,谢谢各位了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 详细讲一下需求。Map中存储些什么数据。页中存储的是些什么信息。具体的应用情景。 看到没人写,就试着写了一个,是用LinkedHashMap实现的,希望能对你有帮助.import java.util.*;//分页调度,最近最久未曾使用,合用LinkedHashMap实现public class LRU { public static void LRU(int n, int m, List<Integer> list) { // 其中key为最近记问时间, value为页号,如果容量超出内存,则淘汰相关的页面,反过来存会容易很多 LinkedHashMap<Integer, Integer> memory = new LinkedHashMap<Integer, Integer>(); int sum = 0; // 累加缺页次数 for (Integer k : list) { System.out.println("当前访问的是页号为: "+k); System.out.print("此时内存中缓存的页面为: "); if(memory.size()!=0){ for(int i=1;i<=memory.size();i++){ System.out.print(memory.get(i)+" "); } System.out.println(); }else{ System.out.println("此时内存为空!"); } if (memory.size() == 0) {// 第一次定然缺页,因为内存中还未装入页面 sum++; System.out.println("处理该作业的第 " + k + " 个页面时发生了缺页现象!,这是第 " + sum + "次缺页"); memory.put(memory.size() + 1, k);// 将页面缓存入内存,并记录一其时间 } else { if (memory.containsValue(k)) {// 待访问的页面已经存在于内存,则需考虑是否将各页的访问时序进行调整 int order = 1;//记录正在访问的是哪一项 for (int i = 1; i <= memory.size(); i++) { if (memory.get(i) == k) { order = i; break; } } if (memory.get(memory.size()) != k) {// 调整页序 for (int i = order; i < memory.size(); i++) { memory.put(i, memory.get(i + 1)); } memory.put(memory.size(), k); } } else {// 不存在,则需要调度 sum++; System.out.println("处理该作业的第 " + k + " 个页面时发生了缺页现象!,这是第 " + sum + "次缺页"); if (memory.size() == n) {// 内存已满 for (int i = 1; i < memory.size(); i++) { memory.put(i, memory.get(i + 1)); } memory.put(memory.size(), k); } else {// 内存未满 memory.put(memory.size() + 1, k); // 直接置入即可 } } } System.out.println("################################################################"); } System.out.println(); System.out.println("总的缺页次数为: "+sum); System.out.println("缺页率为: "+(sum*1.0/m)*100+"%"); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入内存的物理块数:"); int n = sc.nextInt(); System.out.println("请输入待处理的作业的数目:"); int m = sc.nextInt(); System.out.println("请输入作业的业面走向:"); List<Integer> list = new LinkedList<Integer>(); for (int i = 0; i < m; i++) { list.add(sc.nextInt()); } System.out.println("LRU算法的页面调度过程如下: "); System.out.println(); LRU(n, m, list); }}运行结果如下:(楼主可调试其它测试数据,本人只测了这一组)请输入内存的物理块数:4请输入待处理的作业的数目:12请输入作业的业面走向:1 3 2 1 1 3 5 1 3 2 1 5LRU算法的页面调度过程如下: 当前访问的是页号为: 1此时内存中缓存的页面为: 此时内存为空!处理该作业的第 1 个页面时发生了缺页现象!,这是第 1次缺页################################################################当前访问的是页号为: 3此时内存中缓存的页面为: 1 处理该作业的第 3 个页面时发生了缺页现象!,这是第 2次缺页################################################################当前访问的是页号为: 2此时内存中缓存的页面为: 1 3 处理该作业的第 2 个页面时发生了缺页现象!,这是第 3次缺页################################################################当前访问的是页号为: 1此时内存中缓存的页面为: 1 3 2 ################################################################当前访问的是页号为: 1此时内存中缓存的页面为: 3 2 1 ################################################################当前访问的是页号为: 3此时内存中缓存的页面为: 3 2 1 ################################################################当前访问的是页号为: 5此时内存中缓存的页面为: 2 1 3 处理该作业的第 5 个页面时发生了缺页现象!,这是第 4次缺页################################################################当前访问的是页号为: 1此时内存中缓存的页面为: 2 1 3 5 ################################################################当前访问的是页号为: 3此时内存中缓存的页面为: 2 3 5 1 ################################################################当前访问的是页号为: 2此时内存中缓存的页面为: 2 5 1 3 ################################################################当前访问的是页号为: 1此时内存中缓存的页面为: 5 1 3 2 ################################################################当前访问的是页号为: 5此时内存中缓存的页面为: 5 3 2 1 ################################################################总的缺页次数为: 4缺页率为: 33.33333333333333% Map模拟memory,里面存的是page, 如下,第一列是pageID,第二列是PageContent5 theSpiderOut77 soIBSclimbed3 theRain34 IBSclimbed9 outCame2 upTheSpoutAgain用户从命令行输入buffer的大小,比如为3,那么Map大小就为三,一开始就只存入5,77,3,后面有读写的操作,比如需要对第34进行写操作,然后34现在不在里面,就需要用LRU原则置换掉5,34进来,进行写操作,被指换掉的5就要写进一个file里PS:以这个file里被置换的页面顺利来评判LRU是不是做的对 LinkedHashMap可以理解为HashMap+LinkedList:HashMap保证hash的效率,linkedList来保持hashmap没法保持的顺序。只有当用LinkedHashMap(int, float, true)来构造的时候才是LRU,否则都是根据插入顺序来排序。 一个二进制问题中的小问题 关于控件焦点的问题,求教下高手们 java反编译 float类型问题 Java 5.0执行JAR怎么总出错呢?郁闷! 高手指点(100分求解)__java 如何调用 OCX控件 请高手帮忙看看这个程序 菜鸟求大神帮忙for为什么这样走 30分钟写一道程序(C、C++、Java、伪码),昨天的面试题目!!! 大家能否帮我解决一个关于读文件的问题,谢谢! 如何从二进制文件的指定位置开始读 jfreechart叠方图加折线怎么弄?
//分页调度,最近最久未曾使用,合用LinkedHashMap实现
public class LRU {
public static void LRU(int n, int m, List<Integer> list) {
// 其中key为最近记问时间, value为页号,如果容量超出内存,则淘汰相关的页面,反过来存会容易很多
LinkedHashMap<Integer, Integer> memory = new LinkedHashMap<Integer, Integer>();
int sum = 0; // 累加缺页次数
for (Integer k : list) {
System.out.println("当前访问的是页号为: "+k);
System.out.print("此时内存中缓存的页面为: ");
if(memory.size()!=0){
for(int i=1;i<=memory.size();i++){
System.out.print(memory.get(i)+" ");
}
System.out.println();
}else{
System.out.println("此时内存为空!");
}
if (memory.size() == 0) {// 第一次定然缺页,因为内存中还未装入页面
sum++;
System.out.println("处理该作业的第 " + k + " 个页面时发生了缺页现象!,这是第 " + sum
+ "次缺页");
memory.put(memory.size() + 1, k);// 将页面缓存入内存,并记录一其时间
} else {
if (memory.containsValue(k)) {// 待访问的页面已经存在于内存,则需考虑是否将各页的访问时序进行调整
int order = 1;//记录正在访问的是哪一项
for (int i = 1; i <= memory.size(); i++) {
if (memory.get(i) == k) {
order = i;
break;
}
}
if (memory.get(memory.size()) != k) {// 调整页序
for (int i = order; i < memory.size(); i++) {
memory.put(i, memory.get(i + 1));
}
memory.put(memory.size(), k);
}
} else {// 不存在,则需要调度
sum++;
System.out.println("处理该作业的第 " + k + " 个页面时发生了缺页现象!,这是第 "
+ sum + "次缺页");
if (memory.size() == n) {// 内存已满
for (int i = 1; i < memory.size(); i++) {
memory.put(i, memory.get(i + 1));
}
memory.put(memory.size(), k);
} else {// 内存未满
memory.put(memory.size() + 1, k); // 直接置入即可
}
}
}
System.out.println("################################################################");
}
System.out.println();
System.out.println("总的缺页次数为: "+sum);
System.out.println("缺页率为: "+(sum*1.0/m)*100+"%");
} public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入内存的物理块数:");
int n = sc.nextInt();
System.out.println("请输入待处理的作业的数目:");
int m = sc.nextInt();
System.out.println("请输入作业的业面走向:");
List<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < m; i++) {
list.add(sc.nextInt());
}
System.out.println("LRU算法的页面调度过程如下: ");
System.out.println();
LRU(n, m, list);
}
}运行结果如下:(楼主可调试其它测试数据,本人只测了这一组)
请输入内存的物理块数:
4
请输入待处理的作业的数目:
12
请输入作业的业面走向:
1 3 2 1 1 3 5 1 3 2 1 5
LRU算法的页面调度过程如下: 当前访问的是页号为: 1
此时内存中缓存的页面为: 此时内存为空!
处理该作业的第 1 个页面时发生了缺页现象!,这是第 1次缺页
################################################################
当前访问的是页号为: 3
此时内存中缓存的页面为: 1
处理该作业的第 3 个页面时发生了缺页现象!,这是第 2次缺页
################################################################
当前访问的是页号为: 2
此时内存中缓存的页面为: 1 3
处理该作业的第 2 个页面时发生了缺页现象!,这是第 3次缺页
################################################################
当前访问的是页号为: 1
此时内存中缓存的页面为: 1 3 2
################################################################
当前访问的是页号为: 1
此时内存中缓存的页面为: 3 2 1
################################################################
当前访问的是页号为: 3
此时内存中缓存的页面为: 3 2 1
################################################################
当前访问的是页号为: 5
此时内存中缓存的页面为: 2 1 3
处理该作业的第 5 个页面时发生了缺页现象!,这是第 4次缺页
################################################################
当前访问的是页号为: 1
此时内存中缓存的页面为: 2 1 3 5
################################################################
当前访问的是页号为: 3
此时内存中缓存的页面为: 2 3 5 1
################################################################
当前访问的是页号为: 2
此时内存中缓存的页面为: 2 5 1 3
################################################################
当前访问的是页号为: 1
此时内存中缓存的页面为: 5 1 3 2
################################################################
当前访问的是页号为: 5
此时内存中缓存的页面为: 5 3 2 1
################################################################总的缺页次数为: 4
缺页率为: 33.33333333333333%
77 soIBSclimbed
3 theRain
34 IBSclimbed
9 outCame
2 upTheSpoutAgain用户从命令行输入buffer的大小,比如为3,那么Map大小就为三,一开始就只存入5,77,3,后面有读写的操作,比如需要对第34进行写操作,然后34现在不在里面,就需要用LRU原则置换掉5,34进来,进行写操作,被指换掉的5就要写进一个file里
PS:以这个file里被置换的页面顺利来评判LRU是不是做的对
只有当用LinkedHashMap(int, float, true)来构造的时候才是LRU,否则都是根据插入顺序来排序。