LRU表示Least Recently Used,即最近最少被使用的页面替换算法。其理论基础是局部性原理,也就是说最近被访问的对象将在不久以后再次被访问。
对于LRU算法,可以使用一个链表和hashmap来实现。链表中的节点表示缓存的页面,链表中的第一个元素就是要被替换的元素,所以替换的复杂度是O(1)。同时,还维护一个hashmap来建立访问对象和缓存页面的映射关系。
当需要访问某个对象时,先从hashmap中查看该对象是否在缓存中,如果在,则将该缓存页面从链表中取出并插入到链表尾部,并访问对象。否则,从链表头取出一个缓存页面,将要访问的对象写入该缓存并插入到链表尾部,并且在hashmap中更新该项。这样,所有最近被访问的页面总是处于链表的尾部,即表头的元素表示最近最少被使用的可替换的页面。
LRU的实现
在JDK1.5中,LinkedHashMap已经实现了LRU的功能,只需要根据需要重写removeEldestEntry就行了。LinkedHashMap维护着一个运行于所有条目的双向链表。有了这个双向链表,就可以在迭代的时候按照插入的顺序迭代出元素,或者通过LRU算法迭代元素。
在LinkedHashMap的构造方法中,你可以指定accessOrder参数,当其为true时,将按照LRU算法对entry进行遍历;当其为false时,按照插入的顺序进行遍历。其值默认为true。想要详细了解LinkedHashMap可参见 http://boy00fly.iteye.com/blog/1144691
这里贴一个使用LinkedHashMap实现LRU的线程安全的代码
http://www.iteye.com/topic/123856
import java.util.LinkedHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V>
{
private final int maxCapacity;
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
private final Lock lock = new ReentrantLock();
public LRULinkedHashMap(int maxCapacity)
{
super(maxCapacity, DEFAULT_LOAD_FACTOR, true);
this.maxCapacity = maxCapacity;
}
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest)
{
return size() > maxCapacity;
}
@Override
public V get(Object key)
{
try {
lock.lock();
return super.get(key);
}
finally {
lock.unlock();
}
}
@Override
public V put(K key, V value)
{
try {
lock.lock();
return super.put(key, value);
}
finally {
lock.unlock();
}
}
}
分享到:
相关推荐
LRU-K 的主要目的是为了解决 LRU 算法“缓存污染”的问题,其核心思想是将“最近使用过 1 次”的判断标准扩展为“最近使用过 K 次”。相比 LRU,LRU-K 需要多维护一个队列,用于记录所有缓存数据被访问的历史。 LRU...
LRU策略的核心思想是当缓存满时,最近最少使用的数据将被优先淘汰。 首先,我们来看看`hash_table.c`这个源文件。它应该包含了LRU哈希表的具体实现代码。在C语言中,哈希表通常由数组和链表组成,数组提供快速访问...
LRU算法的实现通常依赖于数据结构,如哈希表和双向链表。在C++中,我们可以使用`std::unordered_map`来存储页面及其访问时间,同时使用`std::list`来维护页面的顺序。以下是一个简单的C++实现概述: ```cpp #...
LRU算法的核心思想是:当缓存满时,优先淘汰最近最少使用的数据。这里的“最近最少使用”是指在最近一段时间内被访问次数最少的数据项。 #### 三、实验代码分析 ##### 3.1 定义内存结构 ```c typedef struct page...
自己写的,虽然比较简单,但已经实现了LRU的思想
LRU算法的基本思想是:如果一个页面最近被访问过,那么它在不久的将来可能还会被再次访问。因此,当需要替换页面时,LRU算法会优先选择那些长时间未被访问的页面。实现LRU通常需要一个数据结构来记录每个页面的访问...
本视频笔记主要探讨了三级缓存的实现和Least Recently Used (LRU)算法的应用。以下是对这些主题的详细解析。 首先,我们来理解三级缓存的概念。在Android应用中,通常采用三级缓存策略来高效地管理数据: 1. 内存...
在C语言中实现LRU算法,需要定义结构体来表示页面节点(包括页面号、数据以及前后指针),创建哈希表和链表,实现插入、查找和淘汰操作的函数。`www.pudn.com.txt`可能包含示例代码或进一步的解释,而`用C语言实现...
LRU (Least Recently Used) 算法是一种常用的页面替换策略,它的核心思想是优先淘汰最近最久未使用的页面。在操作系统中,由于内存资源有限,无法将所有的虚拟页面都映射到物理内存中,因此需要通过页面替换算法来...
首先,我们需要理解LRU算法的核心思想。假设有一个固定大小的缓存(或内存),当新的数据请求进来而缓存已满时,LRU算法会选择最近最少使用的数据进行替换。这里的“最近”和“最少使用”是通过记录每个数据项的访问...
LRU算法的基本思想是:当内存满时,新进来的页面会替换掉最近最少使用的页面。这里的“最近”是指最近一次被访问的时间,“最少使用”是指在这段时间内被访问的次数最少。这个策略的假设是,最近经常使用的数据在...
LRU算法的基本思想是优先淘汰最近最久未使用的数据。当内存空间不足时,需要将一部分数据移到磁盘中,LRU算法会选择最近最少使用的数据进行淘汰。它的核心逻辑是基于数据的访问历史来决定哪些数据更可能在未来被频繁...
FIFO是最简单的页面置换算法,它的基本思想是:当需要替换一个页面时,选择最早进入内存的页面进行替换。这种算法基于假设"早来的页面不常用",但并不总是有效,可能会导致Belady's异常,即增加物理内存反而使得...
LRU的核心思想是:最近最少使用的数据在将来被使用的可能性最小,因此应该优先被淘汰。在Java中,LRU缓存的实现通常有两种方式:使用`LinkedHashMap`或自定义数据结构(链表+HashMap)。 ### LRU Cache的`...
LRU算法的核心思想是:当内存满时,最近最少使用的数据会被优先淘汰。也就是说,如果一个数据最近被访问过,那么它在未来被访问的可能性相对较高,而那些很久没有被访问的数据则可能不再需要,因此应该优先移除。 ...
LRU算法的基本思想是:如果一个数据最近被访问过,那么将来被访问的可能性会更高。在内存管理中,LRU用于决定何时将页面交换到磁盘上,以腾出内存供其他进程使用。当一个新页面需要加载但内存已满时,LRU会移除最近...
实验的主要目标包括理解和实现 LRU 算法的调度过程,并计算出访问页面时的命中率。 实验内容分为以下部分: 1. 设计一个虚拟存储系统,其中包含一个可以容纳一定数量页面的驻留集(内存)。在实验中,驻留集的大小...
它的核心思想是,如果一个页面最近被访问过,那么它在短期内被再次访问的可能性较大。因此,当需要淘汰页面时,LRU会选择最近最久未使用的页面。实现上,通常通过维护一个双向链表,将最近访问的页面移动到链表头部...
LRU算法的基本思想是,最近最久未使用的数据应该优先被淘汰。当内存空间不足时,LRU算法会选择最近最少使用的数据页进行淘汰,因为这些数据页被认为在未来最不可能被访问。在数据库中,这意味着如果一个数据页最近...
LRU(Least Recently Used)算法是一种常用的页面替换算法,用于管理有限的内存资源。...通过深入研究这个LRU算法的实现,你不仅可以掌握LRU算法的工作原理,还能了解到如何在实际项目中应用和优化这种缓存策略。