ARC算法分析与实现

本文详细介绍了ARC(Adaptive Replacement Cache)算法的结构、FRC(Fixed Replacement Cache)算法,以及ARC如何通过四种操作来调整缓存内容,确保缓存效率。在不同访问情况下的处理策略包括命中、在缓冲区中、不在任何队列中的访问,以及针对缓存大小的适应性调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ARC算法分析与实现

ARC算法是2003年提出的缓存替换算法,是众多针对LRU算法的改良算法之一。
本文仅从模拟实现角度分析ARC算法,可以说就是解释ARC算法的内容,而不会将重点放在ARC算法的原理和解释其优越性上,同时代码实现也仅可用于模拟,不是针对具体应用。

FRC

ARC的结构是两个LRU队列,我们称其为 L1L1L1L2L2L2L1L1L1存储首次被访问的页,而L2L2L2存储被访问过两次及以上的页。当然这里被访问两次及以上是指在被从这两个LRU队列中淘汰之前再次被访问,因为从两个LRU队列中淘汰的页的访问就不会再被保留了。
假设我们的缓存大小为ccc,那么两个队列总共的最大长度为2c2c2cL1L1L1队列的最大长度为ccc,而L2L2L2在不超过最大总长度的情况下可以侵占L1L1L1的空间。自然,我们缓存不会将两个LRU中的页全部存储。ARC只存储两个LRU队列的前面一部分(假设我们把MRU一端称为前面/top,LRU一端称为后面/bottom),只有这一部分是存储具体内容的,而尾端只有页号,没有内容,不占用太多的空间。具体是前几个呢?ARC算法给出了精细的调控。
我们把L1L1L1中保存的部分称为T1T1T1T2T2T2 for L2L2L2),T1T1T1的长度记为t1t1t1t2t2t2 for T2T2T2)。ARC为T1T1T1的长度设置了一个目标大小ppp0≤p≤c0\leq p\leq c0pc,这个ppp代表了ARC更倾向于保留初次访问的数据还是再次访问的数据。当t1>pt1>pt1>p时,我们优先淘汰T1T1T1中的页,当t1<pt1<pt1<p时,我们优先淘汰T2T2T2中的页,总之,是让T1T1T1的长度稳定在ppp附近(注意,新插入的页在T1T1T1还是T2T2T2中是由它是否是初次访问决定的,因此我们只能通过选择淘汰哪一个列表的页来调整T1T1T1的长度)。而当t1=pt1=pt1=p时,作者表示这个时候的淘汰策略可以任意一点,如果miss页在B1B1B1中则淘汰T2T2T2中的页,否则淘汰T1T1T1中的页。
以上其实是给定ppp的算法的简单描述,作者将这个算法称作FRC算法(Fixed Replacement Cache),那么我们的ppp是怎么确定的呢,这就是ARC算法Adaptive的地方了。接下来我开始具体分析ARC算法。

ARC算法中包含的操作

我们可以想象两个LRU队列,在T部和B部的分界处有一块可移动的隔板,在最前端有一个可插入的缝隙。隔板和缝隙的位置
这两个隔板之间的部分就是存储在缓存中的部分,而缝隙就是最近一次访问的页可能插入的位置。一方面,两个隔板之间的最大距离不可能超过缓存的大小,即ccc;另一方面,我们只考虑隔板向自身队列的头部(top端)移动,在算法中不会将隔板向尾部移动,因为隔板b1b1b1向头部移动意味着T1T1T1的LRU页从缓存中删除,滚向B1B1B1,这是可能的,而隔板向尾部移动则代表B1B1B1的MRU页变成T1T1T1的LRU页,这是不可能的,这种移动没有合理性。
隔板的移动会改变缓存的长度,不会改变L1L1L1或者L2L2L2的长度;而在两个缝隙之一插入元素,则既会改变L1,L2L1,L2L1L2的长度也会改变缓存的长度。除了以上两个操作,当然还有第三个和第四个操作,那就是从L1,L2L1,L2L1L2的尾端淘汰元素的操作以及把两个队列中被访问的元素删除的操作(要移到MRU位置去)。
再次总结一下我们可使用的四种操作:
1)将两个隔板之一向尾部移动一个单位
2)在两个缝隙之一插入新访问的页
3)从两个LRU队列之一的尾部淘汰一个页;
4)(如果新访问的页在缓存中)从L1∪L2L1 \cup L2L1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值