`
m635674608
  • 浏览: 4929073 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

缓存算法(页面置换算法)-FIFO、LFU、LRU

    博客分类:
  • java
 
阅读更多

1.FIFO算法

  FIFO(First in First out),先进先出。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为什么这个原则在很多地方都会用到呢?因为这个原则简单、且符合人们的惯性思维,具备公平性,并且实现起来简单,直接使用数据结构中的队列即可实现。

  在FIFO Cache设计中,核心原则就是:如果一个数据最先进入缓存中,则应该最早淘汰掉。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。在FIFO Cache中应该支持以下操作;

  get(key):如果Cache中存在该key,则返回对应的value值,否则,返回-1;

  set(key,value):如果Cache中存在该key,则重置value值;如果不存在该key,则将该key插入到到Cache中,若Cache已满,则淘汰最早进入Cache的数据。

  举个例子:假如Cache大小为3,访问数据序列为set(1,1),set(2,2),set(3,3),set(4,4),get(2),set(5,5)

  则Cache中的数据变化为:

  (1,1)                               set(1,1)

  (1,1) (2,2)                       set(2,2)

  (1,1) (2,2) (3,3)               set(3,3)

  (2,2) (3,3) (4,4)               set(4,4)

  (2,2) (3,3) (4,4)               get(2)

  (3,3) (4,4) (5,5)               set(5,5)

   那么利用什么数据结构来实现呢?

  下面提供一种实现思路:

  利用一个双向链表保存数据,当来了新的数据之后便添加到链表末尾,如果Cache存满数据,则把链表头部数据删除,然后把新的数据添加到链表末尾。在访问数据的时候,如果在Cache中存在该数据的话,则返回对应的value值;否则返回-1。如果想提高访问效率,可以利用hashmap来保存每个key在链表中对应的位置。

2.LFU算法

  LFU(Least Frequently Used)最近最少使用算法。它是基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。

  注意LFU和LRU算法的不同之处,LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的。举个简单的例子:

  假设缓存大小为3,数据访问序列为set(2,2),set(1,1),get(2),get(1),get(2),set(3,3),set(4,4),

  则在set(4,4)时对于LFU算法应该淘汰(3,3),而LRU应该淘汰(1,1)。

  那么LFU Cache应该支持的操作为:

  get(key):如果Cache中存在该key,则返回对应的value值,否则,返回-1;

  set(key,value):如果Cache中存在该key,则重置value值;如果不存在该key,则将该key插入到到Cache中,若Cache已满,则淘汰最少访问的数据。

  为了能够淘汰最少使用的数据,因此LFU算法最简单的一种设计思路就是 利用一个数组存储 数据项,用hashmap存储每个数据项在数组中对应的位置,然后为每个数据项设计一个访问频次,当数据项被命中时,访问频次自增,在淘汰的时候淘汰访问频次最少的数据。这样一来的话,在插入数据和访问数据的时候都能达到O(1)的时间复杂度,在淘汰数据的时候,通过选择算法得到应该淘汰的数据项在数组中的索引,并将该索引位置的内容替换为新来的数据内容即可,这样的话,淘汰数据的操作时间复杂度为O(n)。

  另外还有一种实现思路就是利用 小顶堆+hashmap,小顶堆插入、删除操作都能达到O(logn)时间复杂度,因此效率相比第一种实现方法更加高效。

  如果哪位朋友有更高效的实现方式(比如O(1)时间复杂度),不妨探讨一下,不胜感激。

 

LRU算法的原理以及实现在前一篇博文中已经谈到,在此不进行赘述:

  http://www.cnblogs.com/dolphin0520/p/3741519.html

  参考链接:http://blog.csdn.net/hexinuaa/article/details/6630384

         http://blog.csdn.net/beiyetengqing/article/details/7855933

       http://outofmemory.cn/wr/?u=http%3A%2F%2Fblog.csdn.net%2Fyunhua_lee%2Farticle%2Fdetails%2F7648549

       http://blog.csdn.net/alexander_xfl/article/details/12993565

 

 

http://m.oschina.net/blog/501018

分享到:
评论

相关推荐

    Android代码-这是一个专用于解决Android中网络请求及图片加载的缓存处理框架

    缓存置换算法 - 多种实现,按需选择 先进先出算法(FIFO):最先进入的内容作为替换对象 最近最少使用算法(LFU):最近最少使用的内容作为替换对象 最久未使用算法(LRU):最久没有访问的内容作为替换对象 非最近...

    Python实现LRU算法的2种方法

    在计算机的Cache硬件,以及主存到虚拟内存的页面置换,还有Redis缓存系统中都用到了该算法。我在一次面试和一个笔试时,也遇到过这个问题。 LRU的算法是比较简单的,当对key进行访问时(一般有查询,更新,增加,在...

    一个强大的Python 缓存库,具有 TTL 支持和多种算法选项

    LRU(最近最少使用)作为缓存算法 LFU(最不常用)作为缓存算法 FIFO(先进先出)作为缓存算法 新缓存算法的可扩展性 TTL(生存时间)支持 支持不可散列的参数(字典、列表等) 自定义缓存键 按需部分缓存清除 遍历...

    python-memoization:一个强大的Python缓存库,具有TTL支持和多种算法选项

    mark: LRU(最近最少使用)作为缓存算法 :check_mark: :check_mark: LFU(最不常用)作为缓存算法没有支持 :check_mark: FIFO(先进先出)作为缓存算法没有支持 :check_mark: 新缓存算法的可扩展性没有支持 :check_m

    PLC缓存:持久耐用的SSD缓存,用于基于重复数据删除的主存储

    不幸的是,由经典缓存算法(例如FIFO,LRU和LFU)引起的频繁数据更新不可避免地减慢了SSD的I / O处理速度,同时大大缩短了SSD的寿命。 为了解决这个问题,我们提出了一种新的方法-PLC缓存-可以大大提高I / O性能...

    基于内容价值的缓存替换策略

    缓存替换机制是内容中心网络的重要研究问题之一,考虑到缓存空间的有限...仿真结果表明,相比于传统替换算法 LRU、LFU 和 FIFO,本文提出的方案有效地提升了网络节点的内容缓存命中率,降低了用户获取内容的平均跳数。

    命名数据网络 (NDN) 架构中不同缓存机制的比较调查-研究论文

    网络中的每个路由器根据不同的策略将特定数据存储为缓存,例如最不常用 (LFU)、通用缓存 (UC)、先进先出 (FIFO)、最近最少使用 (LRU) 等。 NDN 是主要功能,其中数据对用户的可用性基于在存储区域中获取和存储适当...

    EHCache的使用

    EHCache支持内存和磁盘的缓存,支持LRU、LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为Hibernate的缓存插件。同时它也能提供基于Filter的Cache,该Filter可以缓存响应的内容并采用Gzip压缩提高响应速度。

    RxCache:适用于Java和Android的本地React式缓存。 现在,它支持堆内存,堆外内存和磁盘缓存

    Memory 默认支持 FIFO、LRU、LFU 算法的实现 Memory 额外支持 Guava Cache、Caffeine、MapDB 的实现 Memory 支持堆外内存(off-heap) Persistence 默认使用 Gson 实现对象的序列化和反序列化 Persistence 额外支持...

    android-common-master

    android-common-lib关于我,欢迎关注微博: 主页: 邮箱: QQ:主要包括:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、...可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等1

    android-comment

    android-common-lib关于我,欢迎关注微博: 主页: 邮箱: 微信:主要包括:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、...可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等1

    CommonUtils:android utils

    android-common-lib 关于我,欢迎关注 微博: 主页: 邮箱: QQ: 主要包括:缓存(图片缓存、预取缓存、网络缓存)、公共View(下拉及底部加载更多ListView、...可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等1

    《计算机操作系统》期末复习指导

    先进先出算法(FIFO)、循环检测法、最近最少使用页面先淘汰(LRU)、最不经常使用的页面先淘汰(LFU)、最近没有使用页面先淘汰(NUR)、最优淘汰算法(OPT)等。 (4)页式存储管理的优、缺点 优点: ...

Global site tag (gtag.js) - Google Analytics