`
m635674608
  • 浏览: 5001570 次
  • 性别: 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

分享到:
评论

相关推荐

    操作系统页面置换算法实现,fifo、lfu、lru、opt,界面由MFC实现

    本项目实现了一个模拟器,用于演示和比较四种不同的页面置换算法:FIFO(先进先出)、LFU(最不常用)、LRU(最近最少使用)以及OPT(最佳页面置换)。界面使用Microsoft Foundation Class (MFC)库来创建,使得用户...

    OPT最佳页面置换算法

    学习OPT算法,不仅可以提升对内存管理的理解,还有助于进一步研究其他内存管理策略,如LRU、LFU、FIFO(先进先出)等,以及更复杂的情况,如多级缓存、虚拟内存等。理解这些概念对于系统编程、嵌入式开发,甚至是...

    GPU功耗管理(缓存置换算法)-需求.docx

    通过对比该算法与LFU(最不经常使用)、LRU(最近最少使用)和FIFO(先进先出)等传统缓存置换策略的功耗和性能,可以得出关于新算法有效性的结论。 总结来说,GPU功耗管理中的缓存置换算法设计是一个关键环节,...

    页面置换算法-课程设计报告.docx

    在本课程设计报告中,学生将深入理解并实践四种不同的页面置换算法:FIFO(先进先出)、LRU(最近最少使用)、OPT(最佳页面置换)和LFR(最近最不频繁使用)。 1. FIFO(先进先出)算法是最简单的页面置换策略,它...

    常用的缓存淘汰算法.pdf

    3. 自适应缓存替换算法(ARC):ARC缓存算法同时跟踪记录LFU和LRU,以及驱逐缓存条目,来获得可用缓存的最佳使用。ARC缓存淘汰算法可以较好地适应不同的缓存场景,且可以较好地解决缓存污染问题。 ARC缓存淘汰算法...

    aaa.rar_FIFO LRU OPT_OPT FIFO LRU_OPT_ LRU_ FIFO_java fifo lru_l

    本文将详细讨论三种常见的缓存淘汰策略:FIFO(First In First Out)、LRU(Least Recently Used)以及OPT(Optimal)。这些策略的Java实现是编程实践中的常见需求,下面我们将逐一探讨它们的原理和实现。 1. FIFO...

    操作系统 LRU算法 实验报告 及 程序代码

    6. **问题讨论**:可能探讨了LRU算法的优缺点,与其他页面替换算法(如FIFO、LFU)的比较,以及可能的优化方向。 通过学习这个实验报告和代码,你可以深入理解LRU算法的工作原理,并掌握如何在实际操作中应用它。这...

    图形化模拟内存中的FIFO,LRU,LFU存储管理

    本项目专注于通过图形化方式模拟三种常见的页面替换算法:FIFO(先进先出)、LRU(最近最少使用)和LFU(最不经常使用)。这些算法是虚拟内存系统中解决缓存冲突的关键策略,用于决定何时以及如何将数据从主存移入或...

    fifo.rar_FIFO LRU_LRU_c fifo_fifo_visual c

    在计算机科学领域,缓存管理是优化系统性能的关键部分,其中FIFO(First In First Out)和LRU(Least Recently Used)是最常见的两种缓存替换策略。本篇将深入探讨这两种算法的实现,并以C语言作为编程语言进行阐述...

    山东大学操作系统实验七内存页面置换算法问题.pdf

    常见的页面置换算法有FIFO(先进先出)、LRU(最近最少使用)、LFU(最不经常使用)以及OPT(最佳页面置换)等。 1. FIFO页面置换算法:这是一种简单的方法,按照页面进入内存的顺序进行淘汰。但FIFO存在Belady异常...

    操作系统LRU算法

    LRU算法在性能上相比其他策略,如FIFO(先进先出)和LFU(Least Frequently Used)有其优势。FIFO简单但可能导致频繁使用的页面被过早淘汰,而LFU虽然考虑了访问频率,但在处理长期不活跃但突然频繁访问的页面时可能...

    先进先出缓存算法

    先进先出(First In First Out,简称FIFO)缓存算法是一种简单的缓存替换策略,它按照数据进入缓存的时间顺序进行管理,当缓存空间不足时,会移除最先进入缓存的数据,以便为新数据腾出空间。这种算法实现简单,但...

    缓存、缓存算法和缓存框架简介.docx

    本文将深入探讨缓存、缓存算法以及缓存框架。 首先,让我们理解缓存的工作机制。缓存通常是一个数据结构,如哈希表,用于存储频繁访问的数据。在上述描述的面试场景中,Programmer One 使用哈希表实现了一个简单的...

    模拟仿真请求分页调度算法

    本文将深入探讨模拟仿真请求分页调度算法,包括OPT(最佳页面替换算法)、FIFO(先进先出)、LRU(最近最少使用)、LFU(最不常用)以及CLOCK(时钟)这五种常见的算法,并介绍如何利用MFC(Microsoft Foundation ...

    模拟LRU算法

    6. **应用场景**:除了操作系统中的页面替换,LRU算法也被广泛应用于数据库缓存、文件系统缓存等场景,以优化数据读取效率。 7. **LRU的变种**:在实际应用中,还有些类似LRU的算法,例如LFU(Least Frequently ...

    页面置换算法要点和难点实际应用.zip

    10. **缓存命中率和缺页率**:这两个指标是评估页面置换算法性能的关键,缓存命中率高意味着更少的磁盘访问,而低缺页率则表明页面替换效果好。 实际应用中,往往需要综合考虑各种因素,如系统资源、应用特性以及...

    缓存:LRU,LFU,FIFO缓存C ++实现

    本篇文章将详细介绍三种常见的缓存替换策略:LRU(Least Recently Used)、LFU(Least Frequently Used)和FIFO(First In First Out),并探讨它们在C++中的实现。 首先,LRU缓存策略基于“最近最少使用的”原则。...

    06丨链表(上):如何实现LRU缓存淘汰算法?1

    常见的策略有三种:先进先出策略FIFO、最少使用策略LFU、最近最少使用策略LRU。 那么,如何用链表来实现LRU缓存淘汰策略呢?链表是一种稍微复杂一点的数据结构,相比数组,它并不需要一块连续的内存空间来存储,...

    操作系统页面置换算法课程设计

    页面置换算法决定了哪些页面应该被换出,常见的算法有:FIFO(先进先出)、LRU(最近最少使用)、LFU(最不常用)、OPT(最佳置换)等。FIFO简单但可能导致Belady's异常;LRU效果较好,但实现较复杂;LFU考虑了使用...

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

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

Global site tag (gtag.js) - Google Analytics