Cache訪問失效分為強制性失效/冷失效(compulsory miss/cold miss)、容量失效(capacity miss)和沖突失效(conflict miss)。其中容量失效和沖突失效概念非常相近,理解起來不容易區別。
概念
- 強制性失效:CPU第一次訪問相應cache塊,cache中肯定沒有該cache塊,引起的失效叫做強制性失效。這是不可避免的。
- 容量失效:有限的cache容量導致cache放不下而替換出cache塊,被替換出去的cache塊再被訪問,引起的失效叫做容量失效。
- 沖突失效:在直接相聯或組相聯的cache中,不同的cache塊由於index相同相互替換,引起的失效叫做沖突失效。
#理解
如果兩個cache塊指向同一個cache位置,替換后,訪問被替換cache塊到底是屬於容量失效還是沖突失效呢?
主要看當前cache的存儲情況。
假設這里有32KB大小的直接相聯cache。
情況一(容量失效):如果有一個64KB大小的數組需要重復訪問,數組的大小遠遠大於cache大小,沒辦法全部放入cache。第一次訪問數組發生的失效全都是強制性失效。之后再訪問數組,再發生的失效則全都是容量失效,這時cache已經存滿,容量不足以存儲全部數據。
情況二(沖突失效):如果有兩個8KB大小的數據需要來回訪問,但是這兩個數組都映射到相同的地址,cache大小足夠存儲全部的數據,但是因為相同地址發生了沖突需要來回替換,發生的失效則全都是沖突失效(第一次訪問失效依舊是強制性失效),這時cache並沒有存滿。
避免容量失效只能通過增加cache大小實現,而避免沖突失效則可以通過提高相聯度,優化替換策略,優化代碼,增大cache容量等很多措施實現。