09年9月28日,参加东软高端就业笔试,专业笔试关于缓存调度算法,由于事先没有准备,仓惶作答,漏洞百出,今作以总结,以备后用。
FIFO
package Fifo;
//FIFO(Firt in First out)算法
class Page {
private int num;
public Page(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
class LinkNode {
Page page;
LinkNode next;
}
public class MyFiFo {
LinkNode first;
LinkNode last;
int maxSize = 10; // 缓存的尺寸
int currentSize = 0;
public MyFiFo(int maxSize) {
this.maxSize = maxSize;
}
public void changePage(Page p) {// FIFO 算法,每次读取新页都重新调整缓存结构
LinkNode newItem = new LinkNode();
newItem.page = p;
newItem.next = null;
if (first == null) {
first = newItem;
last = first;
currentSize++;
} else {
LinkNode current = first;
boolean isIn = false;
for (int i = 0; i < currentSize; i++) {// 查看所请求的页面是否在缓存中
if (current.page.getNum() == p.getNum()) {
isIn = true;
break;
}
current = current.next;
}
if (!isIn) { // 如果所请求页面不在缓存中,向缓存中添加数据
// 从数据库里读出数据放到newItem上
if (currentSize < maxSize) { // 缓存未满时,添加页面
last.next = newItem;
last = newItem;
currentSize++;
}else { // 缓存已满,先删除头部,再向尾部添加
first = first.next;
last.next = newItem;
last = newItem;
}
}
}
print();
}
public void print() {
LinkNode current = first;
System.out.println();
while (current != null) {
System.out.print(current.page.getNum() + ",");
current = current.next;
}
}
public static void main(String[] args) {
MyFiFo fifo = new MyFiFo(10);
int arr[] = { 2,2, 5,5, 3, 7, 2, 5, 4, 7, 4, 6, 9, 10, 3, 53, 45, 56,56, 5,67,
89, 23 };
for (int i = 0; i < arr.length; i++) {
fifo.changePage(new Page(arr[i]));
}
}
}
图解:
图片来源:
LRU
package Fifo;
//LRU最久未使用淘汰算法
public class MyLRU {
LinkNode first;
LinkNode last;
int maxSize = 10; // 缓存的尺寸
int currentSize = 0;
public MyLRU(int maxSize) {
this.maxSize = maxSize;
}
public void changePage(Page p) {// LRU 算法,每次读取新页都重新调整缓存结构
LinkNode newItem = new LinkNode();
newItem.page = p;
newItem.next = null;
if (first == null) {
first = newItem;
last = first;
currentSize++;
} else {
LinkNode current = first;
LinkNode trailCurrent = first;
for (int i = 0; i < currentSize; i++) {// 先判断缓存中有没有该页,有则删除
if (current.page.getNum() == p.getNum()) {
if (current == first) { //有该页且在队头
first = first.next;
if (first == null) //删除后,如果缓存为空,重设last
last = first;
} else {
trailCurrent.next = current.next;
if (current == last) { //如果删除的是最后一个,重设last指针
last = trailCurrent;
}
}
currentSize--;
break;
}
trailCurrent = current;
current = current.next;
}
//删除完后,在队尾添加
if (currentSize < maxSize) {//缓存未满时的插入
if (first == null) { //如果缓存为空,添加并重设first、last指针
first = newItem;
last = first;
} else { //如果缓存不为空添加到尾部
last.next = newItem;
last = newItem;
}
currentSize++;
} else { //缓存已满时,先删除队头,再向队尾插入
first = first.next;
currentSize--;
last.next = newItem;
last = newItem;
currentSize++;
}
}
print();
}
public void print() {
LinkNode current = first;
System.out.println();
while (current != null) {
System.out.print(current.page.getNum() + ",");
current = current.next;
}
}
public static void main(String[] args) {
MyLRU fifo = new MyLRU(10);
int arr[] = { 2, 2, 5, 3, 3, 7, 2, 5, 4, 7, 7, 4, 6, 9, 10, 3, 53, 45,
56, 67, 89, 23, 53 };
for (int i = 0; i < arr.length; i++) {
fifo.changePage(new Page(arr[i]));
}
}
}
图解:
图片来源:
- 大小: 13.1 KB
- 大小: 14.7 KB
分享到:
相关推荐
**最近最久未使用(Least Recently Used,LRU)** LRU算法基于“如果一个页面最近被访问过,那么它将来被访问的可能性较大”的假设。当需要替换页面时,LRU选择最近最久未使用的页面。这种策略在实际应用中效果较好...
FIFO算法(First-In-First-Out)是页面置换算法中最简单的一种算法。FIFO算法的原理是将内存中的页面按照它们的调入次序排列,当需要替换页面时,选择最先调入的页面。FIFO算法的优点是实现简单,且易于理解。但是,...
FIFO(First-In-First-Out)页面置换算法是最简单的一种页面置换算法。该算法将内存中的页面按照它们进入内存的顺序排列,并将最早进入内存的页面移除。这种算法的优点是实现简单,但缺点是可能会将经常使用的页面...
1. FIFO算法:FIFO,即First In First Out,是最简单的页面置换算法。该算法按照页面进入内存的顺序进行淘汰,最早进入内存的页面最先被替换出去。尽管实现简单,但FIFO算法存在Belady's异常,即当增加分配给进程的...
LRU(Least Recently Used,最近最少使用)算法则是另一种常用的页面置换策略,它选择最近最久未使用的页面进行替换。这个策略基于“最近使用的页面未来可能还会被频繁使用”的假设。在实际实现中,通常会使用数据...
在这个实验中,我们主要关注两种常见的页面置换算法:FIFO(先进先出)算法和LRU(最近最久未使用)算法。 1. FIFO算法: FIFO(First In First Out)算法是最简单的页面置换策略。它的基本思想是,当发生缺页中断...
在计算机科学领域,缓存管理是优化系统性能的关键部分,其中FIFO(First In First Out)和LRU(Least Recently Used)是最常见的两种缓存替换策略。本篇将深入探讨这两种算法的实现,并以C语言作为编程语言进行阐述...
根据给定文件的信息,我们可以详细地探讨一下在虚拟存储管理中如何实现三种主要的页面置换算法:Optimal (OPT), First-In First-Out (FIFO), 和 Least Recently Used (LRU)。此外,我们还会简要提及Clock置换算法,...
LRU (Least Recently Used) 和 FIFO (First In First Out) 是两种常见的页面替换算法,用于管理内存中的数据页面,尤其在计算机操作系统、数据库系统以及缓存管理等领域有着广泛的应用。这两种算法都是为了解决虚拟...
LRU 算法的核心思想是优先淘汰最近最久未使用的页面。这是因为最近被访问过的页面在未来再次被访问的概率更高。 #### 实现细节: 在给定的代码中,LRU 算法通过 `LRU` 函数来实现。同样地,该函数接收一个整型数组 ...
3. **最近最久未使用法(Least Recently Used, LRU)**:LRU算法根据页面的使用历史来决定替换哪个页面。最近最少使用的页面被认为是最不可能再次被访问的,因此会被优先替换。LRU在实际应用中表现良好,因为它基于...
FIFO(First In First Out,先进先出)和LRU(Least Recently Used,最近最少使用)是两种常见的页面置换算法。 FIFO算法基于简单的队列原理,最早进入内存的页面优先被替换出去。当一个新页面请求到来且内存满时,...
本实验主要关注两种常见的页面置换算法:First-In-First-Out (FIFO) 和 Least Recently Used (LRU)。 FIFO算法基于先进先出的原则,当一个新页面请求进来时,如果所有页帧都已被占用,那么最先进入内存的页面将被...
FIFO(First-In-First-Out)算法是最简单的页面置换算法,它的核心思想是优先淘汰最早进入内存的页面,即在内存中停留时间最长的页面。 FIFO算法的运作方式如下: 1. 初始化:创建一个FIFO队列,用于存储所有当前在...
本篇主要讨论了三种页式管理中的置换算法:OPT(Optimal,理想型淘汰)、LRU(Least Recently Used,最近最久未使用)和FIFO(First In First Out,先进先出)。这些算法的目标是在内存空间有限的情况下,选择合适的...
常见的页面置换算法包括最佳置换算法(Optimal Replacement Algorithm)、先进先出算法(First-In-First-Out, FIFO)、最近最少使用算法(Least Recently Used, LRU)、最少使用算法(Least Frequently Used, LFU)...
FIFO(First-In-First-Out)算法是最简单的页面置换算法。它的工作原理是将最早装入物理内存的页面换出,以腾出空间用于其他进程的使用。该算法的优点是实现简单,但缺点是可能会将一些经常使用的页面换出,从而降低...
其中,FIFO(First-In-First-Out)和 LRU(Least Recently Used)是两种常用的页面置换算法。本文将对这两种算法进行设计和实现。 FIFO 页面置换算法 FIFO 算法是最简单的页面置换算法之一。其基本思想是,当需要...
本文将详细讨论三种常见的缓存淘汰策略:FIFO(First In First Out)、LRU(Least Recently Used)以及OPT(Optimal)。这些策略的Java实现是编程实践中的常见需求,下面我们将逐一探讨它们的原理和实现。 1. FIFO...