三種快取模式(Cache Pattern)

2021-06-27 09:43:39 字數 2809 閱讀 1005

cup和記憶體資料交換的效率不高,這是指令流水線式處理器的瓶頸之一。我們可以通過儲存層次(memory hierarchy)的方式來解決這個問題。這個儲存層次內有:

1、容量小的、高速的快取

2、容量較大的、慢一點記憶體

3、容量很大的、但很慢的硬碟

2、檢查記憶體(main memory):如果a在主存裡,那就返回a並把它放在快取裡,否則執行第3步

3、如果a不在快取和記憶體裡,a必然在硬碟(disk)裡。我們把a放入主存和快取,並且返回資料。

為了簡化這個結構,我們在這裡假設a不會在硬碟裡。所以如果在快取裡沒有,必在主存裡。

快取是很小而且很快的儲存單元,它儲存了儲存器的臨時備份。在6.004課程中,你可以假設乙個cpu內部的clock速率,在這樣的速率下,一次cache hit會在乙個時間週期(cycle)內返回cache儲存的資料。而且一次失敗的cache查詢後,cpu會暫停,知道資料在記憶體中被找到。如果cache miss的概率不是很高,那麼使用cache可以顯著提高記憶體的平均讀取時間。

t = t(cache) + miss_rate * t(memory)

cache很有用,因為它利用了locality的策略:

如果你得到了a位置的資料,你很有可能不久還要使用它。每當有一次cache miss,這個記憶體位址就會進入cache,並且替代一些cache中的很久沒用的資料。

乙個快取包括很多條線(cache line)。一條cache line包括:

1、乙個有效位(valid bit),用來表示這條線中的資料是否有效。

2、乙個可選的狀態位(state bit),用來表示這個資料是否被修改過(dirty),是否是唯讀(read-only),等等

3、乙個標籤,是由記憶體位址生成的

4、以及位址對應的資料

我們將會討論3種快取,全關聯快取是其中之一。它和其他結構的區別是,全關聯快取可以把資料放在任何地方

當乙個記憶體位址送給乙個全關聯記憶體時,這個位址標籤就和cache中的所有有效線路(valid line)進行對比,如果tag相同,算作cache hit。這條線路的資料就被傳送給cpu,否則算作一次cache miss。

如果cache中所有的線路都是有效的(cache是滿的),發生了一次cache miss。我們就需要做一次資料替換(把得到的資料和cache中某個資料進行替換)。替換的原則我們會在後文中提到。如果被線路有效並且被修改過(v =1,d = 1),那我們就必須把這線路中的資料寫回主存。如果沒被修改過,我們直接覆蓋這線路。

關於全關聯快取,有一些有用的等式:

capacity  = # lines * ( 1 valid bit + s status bits + t tag bits + d data bits)

在 6.004課程中,有一些特別的數值: t = 30 bits, d = 32 bits

下面這些例子展示了三次取指操作。從乙個空的全關聯快取開始。每幅圖展示了cache在下方注釋內容被執行後的狀態。

直接對映快取記憶體比全關聯快取便宜。因為整個快取中只有乙個標籤比較器(tag comparator)。這和全關聯快取器中每一條線路都有乙個比較器不同。

但在直接對映快取記憶體中,位址衝突是存在的,這可能會影響cache的效果。

給出乙個記憶體位址後,index會選擇快取線路。如果目標tag和快取中的tag相等,就達成一次cache hit。這條快取中的資料會被傳送給cpu。

如果快取中沒有index對應的線路,我們需要去主存,主存中的資料替換了快取中的index對應的線路的資料。如果線路中的資料是有效的並且被修改過(v=1, d=1)。快取必須把那個資料寫進記憶體再扔掉。

看到這裡,我們肯定會思考,全關聯快取和直接對映快取記憶體哪個更好,這取決於資料獲取的模式(memory access pattern)。不同的模式和資料替換策略(replacement strategy,就是發生cache miss後的資料替換規則)在不同的快取結構中各有千秋。

這裡是一些關於直接快取記憶體的有用的等式:

capacity = # lines * ( 1 valid bit + s status bit + t tag bits + d data bits)

# lines = 2^(# index bits)

下面這些例子展示了四次取指操作。從乙個空的直接快取記憶體開始。每幅圖展示了cache在下方注釋內容被執行後的狀態。

Elasticsearch 三種快取介紹

filter cache query cache query cache也稱為filter cache,顧名思義它的作用就是對乙個查詢中包含的過濾器執行結果進行快取。比如我們常用的term,terms,range過濾器都會在滿足某種條件後被快取,注意,這裡的bool過濾器是不會被快取的,但bool過...

FIFO LRU LFU三種快取演算法

先進先出,如果快取容量滿,則優先移出最早加入快取的資料 其內部可以使用佇列實現。1 object get key 獲取儲存的資料,如果資料不存在或者已經過期,則返回null。2 void put key,value,expiretime 加入快取,無論此key是否已存在,均作為新key處理 移除舊k...

FIFO LRU LFU三種快取演算法

先進先出,如果快取容量滿,則優先移出最早加入快取的資料 其內部可以使用佇列實現。1 object get key 獲取儲存的資料,如果資料不存在或者已經過期,則返回null。2 void put key,value,expiretime 加入快取,無論此key是否已存在,均作為新key處理 移除舊k...