import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* LRU算法问题:
* 某虚拟存储器采用页式管理,主存容量为4个页面,使用LRU替换算法,若程序访存的虚页地址流为:
* 0, 7, 0, 6, 7, 1, 6, 3, 0, 7, 2, 7, 1, 4, 0, 2,计算该程序使用主存实页位置的过程。
*
* @author Jzl
*
*/
public class LRU {
private static final int NUM = 4;// 主存容量
private static final int DEFAULT = -1;//主存页面的默认值
public static void main(String[] args) {
int[] src = { 0, 7, 0, 6, 7, 1, 6, 3, 0, 7, 2, 7, 1, 4, 0, 2 };
int[] defValue = { DEFAULT, 0 };// 主存实页{当前值,未被使用的次数}
// 程序使用主存实页位置的过程信息,数据结构为:主存实页Map<第几个实页,{当前值,未被使用的次数}>
Map<Integer, int[]> desMap = new HashMap<Integer, int[]>(NUM);
for (int i = 0; i < NUM; i++) {
desMap.put(i, defValue);// 初始化主存的NUM个实页为默认值
}
for (int i = 0; i < src.length; i++) {
Map<Integer, int[]> tempMap = new HashMap<Integer, int[]>(NUM);
for (int j = 0; j < NUM; j++) {
// 主存实页{当前值,未被使用的次数},先把所有未被使用的次数加1
int[] value = { desMap.get(j)[0], desMap.get(j)[1] + 1 };
tempMap.put(j, value);
}
boolean flag = false;// 是否访存成功
for (int j = 0; j < NUM; j++) {
int[] temp = { desMap.get(j)[0], desMap.get(j)[1] };
if (temp[0] == src[i]) {
// 命中,该页已经使用,并且值等于src[i],未被使用的次数清0
System.out.println("命中:src[" + i + "],值为:" + src[i]);
int[] value = { tempMap.get(j)[0], 0 };
tempMap.put(j, value);
flag = true;
break;
} else if (temp[0] == DEFAULT && temp[1] == i) {
// 该页没有使用,放置src[i],接着进行判断src[i+1]
int[] value = temp;
value[0] = src[i];
value[1] = 0;// 将未被使用的次数清零
tempMap.put(j, value);// 覆盖tempMap中之前的值
flag = true;
break;
} else if (temp[0] != DEFAULT) {
// 该页已经使用,并且值不等于src[i],进行判断des[j+1]
flag = false;
continue;
}
}
// 所有主存页面已经被使用,且未命中,则遍历tempMap,进行LRU式替换
if (!flag) {
int key = 0;// 假设为当前访问次数的最大的实页号
int value2 = 0;// 最大的未被使用的次数
for (int j = 0; j < NUM; j++) {
if (tempMap.get(j)[1] > value2) {
value2 = tempMap.get(j)[1];
key = j;
continue;
}
}
int[] value = { src[i], 0 };
tempMap.put(key, value);
flag = true;
}
desMap = tempMap;
System.out.print("第" + i + "次遍历desMap:");
listMap(desMap);
}
}
public static void listMap(Map<Integer, int[]> map) {
Set<Integer> keySet = map.keySet();
for (int key : keySet) {
System.out.print(key + ":[" + map.get(key)[0] + ","
+ map.get(key)[1] + "]\t");
}
System.out.println();
}
}
分享到:
相关推荐
LRU页面淘汰算法模拟程序(源码)C++ 产生一个进程的大小,构建页表并对页表进行初始化,随后生成访问的指令地址流(是一系列需要访问的指令的地址)。不失一般性,可以适当地(人工指定或随机数产生器)生成这个序列...
包含FIFO,最优替换算法,随机替换算法,clock替换算法,LRU替换算法的c++项目
两算法用于模拟访问计算机主存页面调度的情形,两种算法各有不同,具体实现看包中代码,注释的很详细,初学者都可以看得懂!
每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,...
Cache--主存、虚拟存储器模拟) 存贮层次模拟器 常用的几种存储地址映象与变换方法,以及FIFO、LRU等替换算法的工作全过程模拟
通过编写和调试请求页式存储管理的模拟程序以加深对请求页式存储管理方案的理解。 为了简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,判断它是否被改写过,如果被修改过,将它写回到辅存。 ...
使用java进行页面置换算法的模拟。FIFO是最早出现的置换算法,该算法总是淘汰最先进入主存的页面。特点是实现简单,但因为与进程实际的运行规律不适应,所以算法效率不高。 LRU算法每次都选择最近最久未使用的页面...
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。 二. 实验目的 在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的...
近期最少使用(LRU)算法 ●设某流水线计算机主存的读/写时间为 lOOns,有一个指令和数据合一的 cache,已知该 cache 的读/写时间为 lOns,取指令的命中率为 98%,取数的命中率为 95%。在执行某类程序时,约有 1/...
3.最近最久未使用(LRU)算法:这种算法的基本思想是:利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。...
1.问题描述:假设有一个6x6的棋盘,每个格子里有一个奖品(每个奖品的价值在100到1000之间),现在要求从左上角开始到右下角结束,每次只能往右或往下走一个格子,所经过的格子里...提示:可用列表切片模拟LRU算法的用法。
设计页面置换算法,这里采用最近最久未使用置换算法LRU。 LRU算法的实现要归功于一个8位的寄存器的实现。 三、算法说明: 执行程序时,当主存没有可用页面时,为了选择淘汰主存中的哪一页面, 腾出1个空闲块以便存放...
一、实验目的 1、了解虚拟存储器的基本原理和实现方法。 2、掌握几种页面置换算法...3. 最近最久未使用置换算法(LRU): 以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存
该程序用VC++ 6实现了存储器的三级存储层次管理,实现了主存到cache的LRU、FIFO在三种映像关系下的算法,同时也实现了主存到辅存的LRU、FIFO在三种映像关系下的算法,并结合起来,界面美观,算法简便。
LRU/FIFO/OPT替换算法进行页 面替换的过程模拟;LRU算法对页地址流的堆栈 处理模拟及性能分析;Cache存贮器的直接和组 相联地址映像;LRU替换算法的硬件实现及替换 过程模拟;Cache存贮器的性能分析等。
内存层次模拟器 模拟多级缓存、TLB、页表、主存、磁盘不同写策略的操作,保证一致性。 LRU 是替换算法。
模拟请求页式存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)或LRU处理缺页中断; 要求: ① 指令序列的设定可以执行拟定,格式如表3; ② 在完成了FIFO换页策略后,可以选做LRU的换页策略,并...
在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的...2.2 在虚拟存储器的请求页式存储管理中,系统设置了输入数据显示、FIFO页面置换算法、LRU页面置换算法、两种算法的