ARM基礎學習-Cache和寫緩衝器

Cache介紹

CPU的主頻可以達到200MHZ,而一般性能的主存儲器操用DRAM。其存儲週期僅爲100ns-200ns,主存儲的性能將會影響整個系統的性能,Cache和寫緩衝區位於主存儲區和CPU之間,主要用來提高存儲系統性能;

而cache經常與寫緩衝器(write buffer)一起使用,使用writer buffer的目的是,將處理器和cache從較慢的對主存的寫操作中脫離出來。
這裏寫圖片描述

在處理器和MMU之間的cache稱爲邏輯cache,邏輯cache在虛擬地址空間存儲數據,處理器可以直接通過cache訪問數據,而無需通過MMU。邏輯cache又稱爲虛擬cache。

在MMU與物理存儲器之間的cache稱爲物理cache,當處理器訪問存儲器時,MMU必須先把虛擬地址轉換成物理地址,cache存儲器纔可以向處理器內核提供數據。

這裏寫圖片描述

通過引入cache和寫緩衝區,存儲系統的性能得帶很大提高,但是也帶來了一些問題:
1. 由於數據存在於系統中不同的物理位置,可能造成數據的不一致性;
2. 由於寫緩衝區的優化作用,可能有寫操作的執行順序不是用戶期望的順序,從而造成操作錯誤;

cache工作原理

在cache存儲系統中,把cache和主存儲器劃分成相同大小的快,因此主存地址可以由塊號B和塊內地址W兩部分組成,同樣cache的地址也可以由塊號b和塊內地址w組成;

這裏寫圖片描述

當CPU要訪問cache時,CPU送來主存地址,放到主存地址寄存器中,通過地址變換部件把主存地址中的塊號B變換成cache的塊號b,並放到cache地址寄存器當中;同時將主存地址中的塊內地址W直接作爲cache的塊內地址w裝入到地址寄存器當中,如果變換成功(cache命中),就用cache的地址區訪問cache,從cache中讀取數據送到CPU中;如果不成功,則產生cache失效信息,並且用主存地址訪問主存儲器,從主存儲器讀出一個字送往CPU,同時把包含被訪問字在內的一整塊都從主存儲器當中讀取出來,放到cache中去;如果cache滿了,通過替換策略來騰出空間;

cache結構

圖12.4是一個4KB大小的cache存儲器,這個cache存儲器分爲256行,每行由三部分組成:目錄存儲段,狀態信息段和數據項段。

目錄存儲段:用來記錄每個cache行所對應的主存中的地址,即告訴cache這個行裏存放的數據時從主存的什麼地方拷貝進來的。這個目錄項裏的數據被稱爲“cache標籤”;

狀態信息段:用來記錄狀態信息的狀態位,兩個常見的狀態信息位是有效位(valid bit)和髒位(dirty bit)。有效位用來標記當前的cache行是活動的,即當前的cache行已經存放了從主存中取得的數據,並且可以被處理器所使用。髒位用來標記該cache行中所含的內容是與主存中的內容是否一致,即該cache行中的數據已經被改變,但還沒有被寫回到主存中,主存中的數據還是舊的數據。

數據項段:從主存中拷貝來的數據放在數據項段;

這個cache存儲器擁有4KB的大小,被分成256行,而每行所佔的大小爲4個字(16字節)大小,所以爲4KB。注意cache標籤和狀態信息位所佔的空間並不計算在內。

這裏寫圖片描述

cache的映射

cache的映射方式有三種:直接映射,組相聯映射和全相聯映射;

(1)直接映射

這裏寫圖片描述

上圖12.5便是一個直接映射的顯示,在直接映射cache中,由於主存的容量要遠遠大於cache的容量,所以爲了讓大容量的主存能夠全部映射到小容量的cache中,往往是主存中的多個地址對應cache中的一行。在上圖12.5的例子中行,組索引的值爲0x82,於是便找到了cache存儲器中對應的一個cache行。

注意,因爲這一個cache行對應了多個主存地址,在本例中一個cache行對應了1M的主存地址範圍,而在任一時刻,該cache行只能對應着1M地址範圍中的一個主存地址,所以要用標籤再確定該cache行中具體的一個主存地址。用cache行中的cache標籤與標籤域中的標籤比較,如果相等,則cache命中,然後便對該cache行進行讀寫操作。如果不相等,則cache失效,那麼這個cache行的整個數據會被刪除,並替換爲CPU要訪問的主存地址的內容,同時也將數據送到處理器中,這個過程稱爲替換。

優點:地址映象方式簡單,數據訪問時,只需檢查區號是否相等即可,因而可以得到比較快的訪問速度,硬件設備簡單。
缺點:替換操作頻繁,命中率比較低。

(2)組相聯映射

直接映射雖然簡單方便,但是如果程序同時用到了對應於同一個cache行中的兩個主存地址,那麼就會發生衝突,結果就是導致這個cache行不停的進行替換操作。所以就有了組相聯映射;

組相聯映射將這cache存儲器中的256個行分爲了4路,每路有64個cache行。這時根據組索引找到的 cache行不再是一個,而是同時找到 4個 cache行,所以才被稱爲組索引。每路中包含一個cache行。

因爲現在每路中有 64 個 cache 行,所以組索引的寬度變成了6位,而標籤域的標籤寬度變成了12位。

直接映射中組索引一次只能對應一個cache 行,而現在組相聯映射中組索引一次能對應4個cache行,所以現在主存中的一個地址可以存放到4個cache行中的任意一行。 而在直接映射中,主存中的一個地址只能存放到對應的一個cache行中。所以一個cache行被替換的概率減少爲原來的四分之一。

這裏寫圖片描述

優點:塊的衝突概率比較低,塊的利用率大幅度提高,塊失效率明顯降低。
缺點:實現難度和造價要比直接映象方式高。

(3)全相聯映射

隨着cache的相聯度提高,衝突的可能性小了。理想的目標是,儘量提高組相聯程度,使主存中的一個地址能夠映射到cache存儲器中的任意的cache行,這樣的映射關係被稱爲全相聯映射。

簡單來說直接映射可以看成是一個只有1路的組相聯映射,每路有256個cache行。上面的組相聯映射有4路,每路有64個cache行。而全相聯映射有很多路,每路中只有一個cache行。

這裏寫圖片描述

優點:命中率比較高,Cache存儲空間利用率高。
缺點:訪問相關存儲器時,每次都要與全部內容比較,速度低,成本高,因而應用少。

寫緩衝區

寫緩衝器是一個非常小的告高速存儲緩衝器,用來臨時存放處理器將要寫入到主存中的數據,在沒有寫緩衝器的系統中,處理器直接寫數據到主存中。在帶有寫緩衝器的系統中,cache直接將數據先寫到寫緩衝器中,然後寫緩衝器再以低速寫入主存中。這就將高速的CPU和cache從對主存的低速讀寫中脫離了出來。

寫緩衝器同時還改善了cache的性能,這體現在cache行被替換時。當cache控制器要替換出一個髒的cache行時,它只將該cache行中的數據放入寫緩衝器中,而不寫入主存。這樣就可以快速填充新的cache行數據,處理器就可以繼續從cache存儲器中讀/寫數據。

寫緩衝器中的數據在沒有被寫入主存之前,是不能被讀取的。同樣,被替換的cache行在寫緩衝器中時也不能進行讀操作。這也是爲什麼寫緩衝器的深度通常比較小的原因之一,一般只有幾個cache行的深度。

cache替換策略

替換策略用於選擇要替換cache行中的數據,應該替換哪個cache行。總的來說,組索引在各個way(路)中選擇可用的一組cache行,而替換策略決定在該組中哪一路中的cache行會被新的數據替換。

1.輪轉法: 簡單地將當前分配的cache行的下一行作爲被替換的行。

2.僞隨機替換法:從特定的位置上隨機地選出一行替換出去。

大多數ARM核兩種策略都支持,相比之下,輪轉法有更好的可預測性。然而,輪轉法在存儲器訪問發生很小的變化時,有可能照成cache性能有較大的變化。

清理和清除cache

ARM使用清理和清除表示對cache的兩種基本操作。

清理就是把髒的(即被改寫過的)cache行強制寫到主存,並把cache行中的髒位清零。清理cache可以重建cache和主存之間的一致性,它只是用在回寫策略的D-cache上。

清除就是指清除cache中存儲的全部數據,其實就是將cache使無效,將cache行中的有效位清零,讓所有訪問這個cache行的操作都不命中。

對cache進項清理和清除的操作是通過協處理器CP15中的寄存器C7實現的,具體操作指令看CP15協處理器寄存器詳解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章