IBM的顺序流预取算法SARC的思考与困惑

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长度的部分。

IBM的顺序流预取算法SARC的思考与困惑_第1张图片

你可能感兴趣的:(IBM的顺序流预取算法SARC的思考与困惑)