• 沒有找到結果。

Buffer Cache 置換演算法

第三章 設計與實作

3.1 Hybrid Disk-Aware Buffer Cache 管理機制

3.1.1 Buffer Cache 置換演算法

首先,如圖二所示,我們的演算法將buffer cache分成了FIFO list和LRU list。LRU list 用來保存最近使用過的資料。然而,眾所周知地,若整個buffer cache只有一個LRU list,

則一個大量的sequential access就可以將系統常用的資訊從buffer cache中剔除出去。為了 避免這種情況發生,我們多加了一個FIFO list。當資料從硬碟讀取入主記憶體時,它會 先被放入FIFO list的前端。在FIFO list中使用頻率高的資料才會被搬入LRU list當中。因 此,只使用到一次的資料會存在FIFO list中。當進行buffer cache置換時,FIFO list會從尾 端被置換,而LRU list內的資料不會被置換。因此一個大量的sequential access也無法將 系統常用的資訊從buffer cache中剔除出去。

圖二 Data 進入 FIFO 和 LRU 的動作

圖三 避免資料重覆的作法

此外,此演算法必須減少主記憶體與flash memory內資料的重複性。所有的second level cache都會有資料重複的問題[36],當然此處也不例外,當我們不對主記憶體和flash memory中cache的重複資料做妥善處理時,我們可能會面臨兩邊資料過於重複的窘境。

這個問題會造成系統在主記憶體找不到資料(即miss)時,在flash memory也沒有的機率變 得非常高,如此一來second level cache也就喪失了原本的功能。因此,我們的演算法應 該要避免記憶體和flash disk資料的重複。

為了減少main memory和flash間資料大量重複的缺點,我們提出了一個簡單的方 式,如圖三,當讀取資料時,若資料是從flash memory中讀取上來,我們利用一個叫做 already_in_flash的參數記錄這件事情,在buffer cache要剔除 block的時候,我們從FIFO list尾端往前搜尋一定的長度(圖三(1)),優先置換此長度中最尾端的一個從flash memory 讀上來的資料(圖三(2))。這樣的做法除了可以降低資料重複率之外,也考慮到因為從flash

memory讀取資料比硬碟快,所以將靠近尾端的一個從flash memory讀上來的資料優先換 出,下一次要讀取這份資料時所花費的時間也比從硬碟中拿其他資料比較起來負擔較 小。圖四即為我們buffer cache的置換演算法。我們假設LRU.head與LRU.tail分別代表LRU list的頭尾。FIFO.head與FIFO.tail也分別代表FIFO list的頭尾。而demote_length代表要從 FIFO list尾端搜尋的長度。Cache的絕對值代表現有在buffer cache的block數目,而Cache max size代表buffer cahce中最多能保存的block數目。首先,我們先假設X是一個系統要 存取的block。如果X在LRU list中,我們就將X移至LRU.head。否則若X在FIFO list裡面,

我們會將X移去LRU.head。如果X不在兩個list中,表示X是從hybrid disk讀上來的資料,

但是因為X原本不在Cache之中,而我們要將X移入FIFO list所以我們先檢查Cache是否有 多餘的空間。若沒有,就呼叫evict()這個函式來將FIFO.tail的block剔除。接者將X移到 FIFO.head並且檢查X是否是從flash memory中取得。如果是,我們將此block的

already_in_flash的參數設成1。

在evict()函式中,我們先檢查FIFO list後面一段blocks(長度為demote_length)。如 果在這段距離中有任何block的already_in_flash參數為1,我們就將這個block剔除。如果 在demote_length的距離中,沒有任何block的already_in_flash參數為1,就將FIFO.tail所對 應的block剔除。而在剔除FIFO的block之後,為了維持FIFO list和LRU list的數量平衡,

我們利用adjust_list( )這個函式在cache做剔除時去調整FIFO list and LRU list之間平衡,

其方式就是汰換一些長久在LRU list之中不被使用的block進入FIFO list中。

圖四 置換演算法

相關文件