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(先进先出)、LRU(最近最少使用)以及OPT(最佳页面替换)这三种算法的模拟实现。 1. FIFO(先进先出)算法是最简单的页面替换策略。当内存满...
实验代码中,程序首先会提示用户输入系统分配给作业的主存中的页面数和内存页面数,然后用户可以选择使用FIFO、OPT或LRU页面置换算法。对于每种算法,程序都会统计缺页次数和缺页率。 对于FIFO页面置换算法,程序会...
在C++项目中,这些算法可能通过数据结构如链表、哈希表等实现,通过模拟页面的访问序列来评估各种算法的性能。理解并实现这些算法对于理解虚拟内存管理和优化程序性能至关重要。通过比较不同算法的优劣,可以为实际...
这两种算法都是为了在主存空间不足时决定哪些页面应该被换出到磁盘,以便腾出空间加载新的页面。 **FIFO页面置换算法**: FIFO算法是最简单的页面置换策略,其基于的原则是最早进入内存的页面最早被替换出去。当...
LRU(Least Recently Used)页面替换算法是操作系统中内存管理的一种策略,用于决定在主存空间不足时应淘汰哪个页面。这个算法基于一个假设:最近被频繁使用的页面在未来也更可能被频繁使用。当需要从内存中移除一个...
- **页面置换算法的实现**:在方案中,学生需实现两种页面置换算法:先进先出(FIFO)算法与最近最少使用(LRU)算法。 - **性能对比分析**:通过实验结果对比两种算法的不同表现。 #### 实验环境配置 - **硬件平台...
存贮层次模拟器是计算机系统中用于模拟不同存储设备间数据存取的一种工具,它能够帮助我们理解不同替换算法在实际工作中的性能表现。在这个模拟器中,我们重点关注了FIFO(先进先出)和LRU(最近最少使用)两种替换...
然而,LRU的实现比FIFO复杂,需要额外的硬件支持或软件模拟。在资源有限的情况下,FIFO可能是更经济的选择。 在压缩包文件中,包含了对这两种算法的详细实现和注释,适合初学者学习和理解。通过阅读和实践这些代码...
在计算机科学中,页面算法模拟是内存管理领域的一个重要概念,它涉及到如何有效地管理有限的主存资源。在这个Java实现的项目中,我们将探讨两种主要的页面替换算法:FIFO(先进先出)和LRU(最近最少使用)。这两种...
LRU(Least Recently Used)算法是一种常见的页面置换算法,它基于“最近最少使用的页面最可能在不久的将来再次被访问”的假设。在请求页式存储管理中,由于内存(主存)有限,不能一次性装入所有的虚拟页面,因此...
LRU算法的基本思想是,如果一个页面最近被访问过,那么它在未来的短时间内被再次访问的可能性较大,所以应该优先保留最近被使用的页面。 在本实验中,LRU算法用于模拟页面调度过程,目标是理解和实践虚拟存储器的...
在实际应用中,LRU通常提供更好的性能,因为它能够更准确地预测未来访问模式,但其实现复杂度高于随机淘汰算法。在内存资源有限且对响应速度要求较高的系统中,LRU通常是首选;而在资源有限且对简单性的追求超过性能...
当主存空间不足,需要将页面调出时,LRU算法会选择最近最久未使用的页面进行替换,假设最近使用的页面在未来被访问的可能性更高。 在本实验中,LRU算法的实现依赖于一个队列数据结构。队列中的元素代表当前在主存中...
此外,考虑到硬件层面,项目还包括了TLB的时间设置,模拟了处理器在查找内存地址时先查询TLB,若未命中再访问主存的过程,以及访问内存的时间设置,这反映了实际系统中的延迟情况。 总的来说,这个C#实现的项目为...
在处理`trace.txt`文件时,程序会读取输入的页面访问序列,并根据选定的页面置换算法模拟操作。 **trace.txt文件**: `trace.txt`文件包含了页面访问的序列,每行表示一个访问事件,内容是一个页面编号。在运行程序...
**第四章 实验五 模拟最近最久未使用(LRU)页面置换算法** ...通过这种方式,我们可以实现一个简单的LRU页面置换算法模拟器,模拟在给定的内存限制下,如何根据页面访问序列进行有效的内存管理和页面置换。
2. 通过模拟实验,观察不同算法在相同工作负载下的性能差异,如缺页率、平均访问时间等。 3. 分析并比较算法的优缺点,探讨适用于不同场景的策略。 四、实验步骤 1. 设计数据结构:存储进程的页面访问序列,以及...
为了模拟FIFO页面置换算法,我们可以使用一个数组`a[M]`来表示当前在内存中的页面,其中`M`是系统分配给作业的主存页面数。另一个数组`b[N]`存放作业的页号序列,`N`是作业的总页面数。数组`c[N]`则用来记录被淘汰的...
操作系统实验报告6-页面置换算法模拟主要探讨了虚拟存储技术中的关键部分——页面置换算法,这是操作系统中用于处理主存不足时如何选择页面进行替换的重要策略。实验的主要目的是通过模拟不同的页面置换算法来理解...