SARC为IBM的顺序流预取算法。现在想实现这个算法,但是最大的困惑是如何才能保证替换线程可以很好的完成任务。
该Cache算法中的元素是以块(页面)为元素进行存储的。
1.RANDOM 命中
将该元素放到RANDOM的MRU端
2.SEQ命中
调整参数,然后放到MRU端,并重新计算SeqCount。
若SeqCount(i-1)=0 SeqCount(i)=1
3.两个链表都未命中
3.1 x-1在缓存中,
如果块号为x-1已经达到了阈值,预取出x,x+m,并放入到SEQ中。
否则放入到RANDOM,更新SeqCount=SeqCount(x-1)+1
3.2如果x-1未在缓存中,则设置SeqCount(x)=1
预取部分的实现
替换部分的实现
这个算法是需要预先为cache申请空间的,因为如果不预先申请空间,FreeQ的长度就会一直为0, 然后会将刚刚放入到里面的元素evict掉,length=1,但是此时又有新的请求要读页面,那么length又等于0。但是如果刚开始给FreeQ的长度设置为2000,为系统预留内存空间2G(块大小为1M),FreeQThreshold=5 ,那么在最开始的时候SARC里面的块就不会被无辜替换了。直到空间都消耗完了,length<5的时候,这时会调用替换算法替换出较早的页面或者自适应的替换掉SEQ中超过desire长度的部分。