直接映射、組相聯、全相聯的差異:快取架構比較

快取必須決定記憶體的每個區塊可以放在哪裡。直接映射快取中,每個區塊只能放在一個快取列,簡單而快速,但當兩個區塊爭用同一列時就會發生衝突。全相聯快取中,區塊可以放在任何地方,衝突消失,但需要與所有快取列比較。組相聯是折衷方案,可放在一個組內的數個路(way)之中的任一個。大部分CPU的快取是組相聯。

項目直接映射組相聯全相聯
區塊可放置的位置由索引位元決定的1個快取列一個組內的路(例如4個或8個)中的任一個快取內的任何快取列
一次存取的標籤比較1次每個路各1次(例如8次)並行比較所有快取列
命中時間最快略慢最慢
硬體成本與功耗最小中等最大。每個快取列都需要比較器
衝突未命中最多隨路數增加而減少無。只剩強制未命中與容量未命中
替換策略不需要。只有一個選擇在組內選擇(LRU或其近似)在所有快取列中選擇
主要用途小而簡單的快取、部分微控制器大部分CPU的L1、L2、L3快取。多為4〜16路TLB或犧牲快取等小型結構

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

直接映射
簡單、低功耗與速度,比命中率更重要時。
組相聯
大部分快取的實際選擇。有數個路,就能以少許成本消除大半的衝突未命中。
全相聯
命中率重要,且能負擔比較成本的非常小型結構。

常見問題

什麼是衝突未命中?

明明還有其他空的快取列,卻因為兩個區塊對應到同一位置而發生的未命中。直接映射最多,全相聯則不會發生。

8路快取在一次存取中比較幾個標籤?

所選組的每個路各一個,共8個。

為什麼大部分CPU的快取是組相聯?

因為有數個路,就能以少許成本消除大半的衝突未命中,而全相聯每個快取列都需要比較器。

全相聯用在哪裡?

用在TLB或犧牲快取等命中率最重要、且能負擔比較成本的小型結構。

相關名詞的解說

直接映射快取
每個位址的資料在快取中可放置的位置只固定在一處的快取結構。電路簡單、命中時間短,但容易發生爭用同一位置的衝突失誤。
組相聯快取
資料可放在由位址決定的某一組內的多個位置(路)中任一處的快取結構。n路的話,每次存取要並行比對n個標籤。
全相聯快取
任何資料都可放在快取內任何位置的快取結構。不會發生衝突失誤,但必須與所有標籤比對,不適合大型快取。用於TLB等。
快取行
快取與下層之間讀寫資料的單位。也稱為快取區塊。多數CPU為64位元組,位址的低位元表示行內的位置(位移)。

相關的比較