当前位置:首页 » 文件管理 » lru缓存机制原理

lru缓存机制原理

发布时间: 2023-02-19 20:24:22

⑴ lru算法是什么

LRU是Least Recently Used的缩写,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。

该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最少使用的页面予以淘汰。

特点:

LRU 算法弊端是存在偶发性、周期性的批量操会降低缓存的命中率,对缓存造成污染,下面几个就是改进算法。

LRU-K会记录每条数据的访问历史,当达到 k 时,才将数据存放到缓存,在缓存内存回收时,缓存中越接近 k 的数据被优先删除。

Two queues(2Q)相当于 LRU-2,区别是访问历史(首次访问)数据缓存于 FIFO 队列,二次及以上的数据存放LRU缓存,FIFO 队列数据遵循该缓存的内存回收机制,LRU缓存数据遵循该缓存的内存回收机制。

⑵ Glide ② — 缓存机制

阅读本文需要先了解 Glide加载流程

首先介绍一下Glide中对图片资源的封装类: EngineResource

在活动缓存中,使用了一个map用来存放EngineResource对象,这里需要注意一个操作,就是这个EngineResource对象是用WeakReference包裹的,并且通过ReferenceQueue监听了EngineResource的回收,在回收的时候会清理当前的活动缓存内容;
下面分析一下源码是如果实现的:
首先,自定义一个WeakReference类,将key和resource传进入(用于在WeakReference回收的时候释放),传入一个ReferenceQueue对象,用于监听WeakReference回收

开启一个子线程,在循环中监听ReferenceQueue的返回值,通过这个返回值,判断WeakReference有没有回收,监听的方法是ReferenceQueue.remove(),这是一个阻塞方法;所以要开子线程;

LruResourceCache继承了LruCache类,关于LruCache类,简单提一下,具体的可以参考我之前的博客 LruCache实现 ,LruCache继承了LinkedHashMap,LinkedHashMap有一个特点,就get后的数据会移动到队列,这就是Lru思想:固定一个容量,put的时候如果超过容量了,将最后一个节点删除,get的时候将get的这个节点移动到队列的头部;

onItemEvicted()方法是LruCache的一个空方法,调用的时机是在put的时候判断是否超过容量,如果超过容量了,就淘汰最后一个节点,并调用这个方法;

活动缓存和内存缓存都是缓存在内存中的,活动缓存缓存的是正在使用的图片资源,当图片不使用时会放到内存缓存中,提出活动缓存的目的:单一的内存缓存由于Lru的淘汰机制会导致图片加载不稳定

首先介绍一个磁盘缓存方案DiskLruCache(非Google官方编写,但获得官方认证),关于这个磁盘缓存方案的理解可以看郭林的这片文章:
Android DiskLruCache完全解析,硬盘缓存的最佳方案

从上一篇文章知道,Glide加载操作是通过 Engine 来驱动的

Engine的load()中,首先尝试从 活动缓存 和 内存缓存 获取缓存,如果没有缓存再启动EngineJob和DecodeJob; 上面介绍了缓存的获取,下面看一下缓存的存放,肯定是在获取到图片后的回调中存放的

在DecodeJob获取到图片数据后,会回调很多接口,在回调中会将其放入 活动缓存 ,当图片不在使用的时候,就会放入内存缓存,根据上面介绍的活动缓存规则,当 EngineResource 计数为0时就应该放入内存缓存;

当资源引用为0,回调onResourceReleased(),从活动缓存移除,放入内存缓存;

上面介绍了活动缓存和内存缓存的存放和获取,下面看一看磁盘缓存的存取;

还记得 DataFetcherGenerator 接口吗?这个接口是DecodeJob用于获取数据的,有三个具体的实现:

我们在上一篇具体介绍的是网络文件的获取,这里的磁盘缓存使用的就是 DataCacheGenerator(缓存文件) 这个Generator了

上篇文章知道DecodeJob是一个Runnable任务,在run()会调用runWrapped(),在runWrapped()中会做三种事情:

在runWrapped()的解码操作中会执行decode(),在decode()中,会disk put操作;

Glide的磁盘缓存是基于DiskLruCache 实现的,Glide直接使用的是DiskLruCacheWrapper对象对DiskLruCache 的封装;

⑶ 联网缓存是什么情况

CPU缓存是介于CPU和内存之间的临时内存。它的容量比内存小,但交换速度快。缓存中的数据是内存的一小部分,但这一小部分会在短时间内被CPU访问。当CPU调用大量数据时,可以避开内存,直接从缓存中调用,从而加快读取速度。可以看出,给CPU增加缓存是一种高效的解决方案,这样整个内存(cache memory)就变成了一个高速存储系统,既有缓存又有内存。缓存对CPU的性能影响很大,主要是CPU的数据交换顺序和CPU与缓存之间的带宽造成的。缓存是为了解决CPU速度和内存速度的速度差。将内存中CPU最频繁访问的数据和指令复制到CPU中的缓存中,这样CPU就可以不像“蜗牛”那样频繁的从内存中取数据,CPU只需要从缓存中取,比内存快很多。这里,需要指出的是:1。因为缓存只是内存中少量数据的副本,所以CPU在缓存中查找数据时,会出现找不到的情况(因为这些数据还没有从内存中复制到缓存中)。这个时候CPU还是会在内存中搜索数据,这样系统的速度会变慢,但是CPU会把这些数据复制到缓存中,以免下次再从内存中取回来。2.因为随着时间的变化,最频繁访问的数据并不是一成不变的,也就是说,刚才不频繁访问的数据此时已经需要频繁访问了,但刚才是最频繁访问的数据,现在是不频繁访问的,所以要按照一定的算法频繁替换缓存中的数据,这样才能保证缓存中的数据是最频繁访问的数据。缓存的工作原理【编辑本段】缓存的工作原理是,当CPU要读取一条数据时,先从缓存中查找,如果找到,立即读取并发送给CPU处理;如果没有找到,则以相对较慢的速度从内存中读取,并发送给CPU进行处理。同时将这个数据所在的数据块转移到缓存中,这样以后就可以从缓存中读取整个数据,而不需要调用内存。正是这种读取机制,使得CPU读取缓存的命中率非常高(大部分CPU可以达到90%左右),也就是说,CPU下次读取的数据有90%在缓存中,只有10%左右需要从内存中读取。这大大节省了CPU直接读取内存的时间,也使得CPU在读取数据时基本上不需要等待。一般来说,CPU读取数据的顺序是先缓存后内存。一级缓存和二级缓存【编辑本段】为了区分这两个概念,我们先来看看RAM。相对于RAM,RAM是断电后信息消失的那种,ROM断电后不会消失。RAM有两种,一种是静态RAM和SRAM。一个是动态RAM和DRAM。前者的存储速度比后者快很多,我们现在用的内存一般都是动态RAM。有菜鸟说,为了提高系统速度,就不能直接扩展缓存吗?扩展越大,缓存的数据就越多,系统就越快?缓存通常是静态RAM,速度很快,但是静态RAM的集成度低(存储同样的数据,静态RAM的体积是动态RAM的6倍),价格高(同样容量的静态RAM是动态RAM的4倍),所以可以看出扩展静态RAM作为缓存是一个非常愚蠢的行为,但是为了提高系统的性能和速度,就必须扩展缓存。这样,就有了一个折中的方法。不是扩展原有的静态ram缓存,而是增加一些高速动态RAM作为缓存。这些高速动态RAM比传统的动态RAM快,但比原来的静态RAM缓存慢。我们把原来的静态RAM缓存称为一级缓存,后面增加的动态RAM称为二级缓存。一级缓存和二级缓存的内容是内存中频繁访问的数据的副本(映射),它们的存在是为了减少高速CPU对慢速内存的访问。通常CPU找数据或指令的顺序是:先在一级缓存里找,找不到就在二级缓存里找,找不到就要在内存里找。缓存技术的发展【编辑本段】最早的CPU缓存是一个整体,容量很低。英特尔公司从奔腾时代就开始对高速缓存进行分类。当时集成在CPU内核中的缓存还不足以满足CPU的需求,制造工艺的限制也无法大幅提升缓存容量。因此,出现了与CPU集成在同一电路板或主板上的缓存。此时CPU内核集成的缓存称为一级缓存,外部缓存称为二级缓存。一级缓存包括数据缓存(D-Cache)和指令缓存(I-Cache)。它们分别用于存储数据和执行这些数据的指令,同时可以被CPU访问,减少了因争用缓存而产生的冲突,提高了处理器效率。当英特尔推出奔腾4处理器时,它用容量为12KμOps的新一级跟踪高速缓存取代了指令高速缓存,这意味着它可以存储12K微指令。随着CPU制造技术的发展,L2缓存可以很容易地集成在CPU内核中,其容量也在逐年增加。现在用是否集成到CPU来定义一级和二级缓存是不准确的。而且,随着L2缓存整合到CPU内核中,以前L2缓存和CPU大差距分频的情况也改变了。此时与主频同速工作,可以为CPU提供更高的传输速度。L2缓存是CPU性能的关键之一。增加L2缓存容量可以在不改变CPU内核的情况下大幅提高性能。而同一个核的高端和低端CPU的区别往往在L2缓存,可见L2缓存对CPU的重要性。当CPU在缓存中找到有用的数据时,称为命中。当缓存中没有CPU需要的数据时(这称为未命中),CPU会访问内存。理论上,在一个有L2缓存的CPU中,读取L1缓存的命中率是80%。也就是说,在CPU的一级缓存中找到的有用数据占总数据的80%,剩下的20%是从二级缓存中读取的。由于无法准确预测要执行的数据,读取L2缓存的命中率在80%左右(从L2缓存读取的有用数据占总数据的16%)。然后其他的数据都要从内存中调用,但这已经是相当小的比例了。目前更高端的CPU也会有三级缓存,是为读取二级缓存后遗漏的数据而设计的。在三级缓存的CPU中,只需要从内存中调用5%左右的数据,进一步提高了CPU的效率。为了保证CPU访问时的高命中率,缓存中的内容要用一定的算法进行替换。一种常用的算法是“最近最少使用算法”(LRU算法),这是为了消除最近最少访问的行。因此,有必要为每一行设置一个计数器。LRU算法是将命中行的计数器重置为零,并将其他行的计数器加1。当需要替换时,消除行计数器的计数值最大的数据行被消除。这是一种高效科学的算法,其计数器清零过程可以从缓存中清除一些频繁调用后不再需要的数据,提高缓存的利用率。在CPU产品中,一级缓存的容量基本在4KB到64KB之间,二级缓存的容量分为128KB、256KB、512KB、1MB、2MB、4MB等。一级缓存容量和二级缓存容量差别不大是提升CPU性能的关键。L2缓存容量的增加是由CPU的制造工艺决定的,容量的增加必然导致CPU中晶体管数量的增加。要在有限的CPU面积上集成更大的缓存,对制造工艺的要求会更高。目前主流的CPU L2缓存在2MB左右,其中Intel公司在2007年陆续推出了台式机用4MB和6MB L2缓存的高性能CPU,但价格相对较高。对于配置没有太高要求的朋友,一般双核CPU配2MB L2缓存基本可以满足日常上网需求。
嗯,怎么说呢?很抽象...比如我和你之间的一个小仓库,你给了我一批5吨的货物,叫我去取,但是我的车一次只能拖3吨,所以你可以把5吨的货物全部放进仓库,我花两次时间去搬,这样可以节省你的时间...让我们专业点...以新浪为例...第一次访问新浪对我来说有点慢。现在新浪的主页已经完全开放了。好的,我会做的。网页关闭了…然后我这个时候打开新浪,完全打开了。不知道大家平时有没有注意到,没有这个东西,就是第一次访问缓存的时候,网页上的一些信息,比如flash图片和文字,是下载到你的电脑上,也就是你的缓存里的。这个缓存可以设置大小…当缓存满了,你可以把文件放入其中,并在缓存中保持最长的时间。挤出上面的——下载一些资料到自己电脑的缓存里,然后你访问网页电脑。这时候他不是先找这个站点能不能连接到这个站点,而是说他先去缓存里找一下,有没有你现在想访问的信息。如果有,他直接从这台电脑上打电话找到并连接到你想访问的网站...这是缓存,不知道你懂不懂...呵呵,不会表达。
缓存大小是CPU的重要指标之一,其结构和大小对CPU速度有很大影响。简单来说,缓存就是用来存储一些常用的或者即将出现的数据或者指令。当需要这些数据或指令时,可以直接从缓存中读取,这比读入内存甚至硬盘要快得多,可以大大提高CPU的处理速度。所谓处理器缓存通常是指L2缓存或外部缓存。即缓存是介于CPU和主存DRAM(动态RAM)之间的一种小规模但高速的存储器,通常由SRAM(静态随机存取存储器)组成。用于存储CPU经常使用的数据,使CPU不必依赖于速度较慢的DRAM(动态随机存取存储器)。L2缓存一直是一种速度极快且价格昂贵的存储器,称为SRAM (static RAM),SRAM(Static RAM)是静态存储器的缩写。因为SRAM采用和CPU一样的半导体工艺,所以和DRAM相比,SRAM的存取速度更快,尺寸更大,价格也更高。处理器缓存的基本思想是用少量的SRAM作为CPU和DRAM存储系统之间的缓冲,即缓存系统。8486及更高级别的微处理器的一个显着特点是在处理器芯片中集成了SRAM作为缓存,由于这些缓存都安装在芯片中,所以称之为片上缓存。86片上缓存的容量通常是8K。奔腾等高档芯片16KB,Power PC可达32KB。奔腾微处理器通过使用数据和双通道高速缓存技术进一步改进了片上高速缓存。相对来说,片上缓存容量小,但是非常灵活方便,大大提高了微处理器的性能。片上缓存也称为一级缓存。由于486、586等高端处理器时钟频率较高,一旦一级缓存未命中,性能会明显变差。在这种情况下,采用的方法是在处理器芯片外部添加缓存,称为L2缓存。L2缓存实际上是CPU和主存之间的真正缓冲区。因为系统板上的响应时间远低于CPU,没有L2缓存是不可能达到486、586等高端处理器的理想速度的。L2缓存的容量通常比L1缓存大一个数量级以上。在系统设置中,用户通常需要确定是否安装了L2缓存及其大小。L2缓存的大小一般为128KB、256KB或512KB。256KB或512KB同步缓存广泛应用于486以上的微机。所谓同步,就是缓存和CPU以相同的时钟周期、相同的速度同步工作。与异步缓存相比,性能可以提高30%以上。目前PC及其服务器系统的发展趋势之一是CPU频率越来越高,系统架构越来越先进,主存DRAM的结构和访问时间提升缓慢。因此,缓存技术越重要,PC系统中的缓存就越大。大多数用户已经把缓存作为评价和购买PC系统的一个重要指标。

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:710
制作脚本网站 发布:2025-10-20 08:17:34 浏览:973
python中的init方法 发布:2025-10-20 08:17:33 浏览:684
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:836
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:742
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1083
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:313
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:193
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:881
python股票数据获取 发布:2025-10-20 07:39:44 浏览:839