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