FIFO、LRU、LFU的含义和原理(转)

题目:请简要介绍FIFO、LRU、LFU的含义和原理

 

含义:

FIFO:First In First Out,先进先出
LRU:Least Recently Used,最近最少使用

LFU:Least Frequently Used,最不经常使用

以上三者都是缓存过期策略。

原理和实现:

一、FIFO按照“先进先出(First In,First Out)”的原理淘汰数据,正好符合队列的特性,数据结构上使用队列Queue来实现。

如下图:

1. 新访问的数据插入FIFO队列尾部,数据在FIFO队列中顺序移动;

2. 淘汰FIFO队列头部的数据;

二、LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:

1. 新数据插入到链表头部;

2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;

3. 当链表满的时候,将链表尾部的数据丢弃。

三、LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。

LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。

具体实现如下:

1. 新加入数据插入到队列尾部(因为引用计数为1);

2. 队列中的数据被访问后,引用计数增加,队列重新排序;

3. 当需要淘汰数据时,将已经排序的列表最后的数据块删除。

时间: 2024-10-06 05:48:32

FIFO、LRU、LFU的含义和原理(转)的相关文章

缓存失效策略(FIFO,LRU,LFU)

当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据.常用的淘汰算法有下面几种: 1. FIFO:First In First Out,先进先出.判断被存储的时间,离目前最远的数据优先被淘汰. 2. LRU:Least Recently Used,最近最少使用.判断最近被使用的时间,目前最远的数据优先被淘汰. 3. LFU:Least Frequently Used,最不经常使用.在一段时间内,数据被使用次数最少的,优先被淘汰.

操作系统的页面置换C++算法:OPT FIFO LRU CLOCK 计算缺页率

暴力直接上代码,主要是用了vector来实现,有些方法比较费时,不太好,请各位大神斧正.这是个人的作业,  这是代码下载页http://download.csdn.net/detail/l631068264/7644569   里面还有多级反馈队列进程调度的MFC版 #include <iostream> #include <algorithm> #include <vector> #include <stdio.h> #include <stdlib

Mybatis(七)-- LRU LFU 算法

这篇博客主要介绍LRU LFU 算法,因为在Mybatis的缓存中会用到,所以放到这个系列中了.此外,这是我翻译的一篇文章,觉得原文已经写的很好了,所以就直接翻译一下,留作知识整理. 英文原文出处如下: https://xuri.me/2016/08/13/lru-and-lfu-cache-algorithms.html 鼓励大家多读读英文的资料.好处不多说.自己体会. 在此声明,文章只是翻译了一个大体意思,有些词汇翻译的不准确,不要砸我. 最少最近使用(LRU) 丢弃掉最近期间最少使用的项目

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

转自:http://www.cnblogs.com/dolphin0520/ 1.FIFO算法 FIFO(First in First out),先进先出.其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为什么这个原则在很多地方都会用到呢?因为这个原则简单.且符合人们的惯性思维,具备公平性,并且实现起来简单,直接使用数据结构中的队列即可实现. 在FIFO Cache设计中,核心原则就是:如果一个数据最先进入缓存中,则应该最早淘汰掉.也就是说,当缓存满的时候

LRU LFU FIFO 转载

-------------------------------------->href--------------------------> http://blog.chinaunix.net/uid-13246637-id-5185352.html 最近在做笔试题,其中虚拟存储管理中几种缺页中断算法经常考到,虽然这类题可说非常简单,但概念上却容易混淆而且如果不掌握正确的做法很容易出错,因此觉得有必要把这三种算法的实现过程理一遍,并从源代码级别去思考它们的实现. 首先推荐一个博客,对这两个算法

深入理解Java中的引用的含义与原理

一句话:引用就是指向那个对像. String str="aa"; str有本身的内存,是一个变量,而对像"aa"也有它自己的内存空间.这时候说str引用"aa"这个对像. String tt=null; 这里的tt也是一个引用变量,但是它没有引用具体的对像. String str="aa"; String tt=str; 这里str与tt都是一个引用变量(属于String类型的,只能引用String类型对像),记住:str它的

HashMap,LinkedHashMap,LRU,LFU等实现

HashMap http://blog.csdn.net/kimylrong/article/details/21654405 http://blog.csdn.net/vking_wang/article/details/14166593 LinkedHashMap http://www.cnblogs.com/children/archive/2012/10/02/2710624.html http://zhangshixi.iteye.com/blog/673789 对比  http://

内存映射的原理

由于所有用户进程总的虚拟地址空间比可用的物理内存大很多,因此只有最常用的部分才与物理页帧关联.这不是问题,因为大多数程序只占用实际可用内存的一小部分. 在将磁盘上的数据映射到进程的虚拟地址空间的时,内核必须提供数据结构,以建立虚拟地址空间的区域和相关数据所在位置之间的关联.例如,在映射文本文件时,映射的虚拟内存区必须关联到文件系统的硬盘上存储文件内容的区域.如图所示: 当然,给出的是简化的图,因为文件数据在硬盘上的存储通常并不是连续的,而是分布到若干小的区域.内核利用address_space数

LintCode链表题总结

由于链表本身结构的单一性,链表的题目很少会有很大的变种,基本都是围绕几个基本的考点出题目.所以链表的题目比较好掌握,但是链表的题目又不太容易一次就AC通过,由于边界情况未考虑.空指针(比如head.next不存在但是却给head.next赋值了,就会抛出nullpointer的错误).越界等边界情况,我们需要在测试用例的时候多考虑边界条件.在模拟计算的时候一定要用纸和笔把中间的操作过程给画出来,这样比较容易形成思路. 在LintCode的ladder1中,链表那一章有如下这一些题目: 此外,Li