CPU的快取記憶體儲存器知識整理

2022-03-30 03:43:06 字數 3499 閱讀 7183

基於快取的儲存器層次結構行之有效,是因為較慢的儲存裝置比較快的儲存裝置更便宜,還因為程式往往展示區域性性:

時間區域性性:被引用過一次的儲存器的位置很可能在不遠的將來被再次引用。

空間區域性性:如果乙個儲存器位置被引用了一次,那麼程式很可能在不遠的將來引用附近的乙個儲存器位置。

乙個通用的快取記憶體儲存器會有s = 2 ^ s個set(組)

每個set含有e個line(既通常所說的cache line)

每個line又包含1位vaild bit、 t位tag、b = 2 ^ b bytes cache block(真正儲存資料的地方)。

通常我們說的cache line 64位 32位,實際上是說的cache line中cache block是64位32位。

假設我們的儲存器位址有m位,共m = 2^m個不同的位址。我們看一下各個變數之間的關係。

cache快取資料的大小c = (sizeof set * number of set) = (size of block * lines a set) * number of set = b * e * s

記憶體大小2^m cache line大小2^b 記憶體的cache line個數2^(m-b)

2^(m-b)個cache line分到2^s個set裡, 每個set會有2^(m - b –s)個cache line,這個數字不是e,是指會有2^(m – b –s)個cache line落到這個set 裡面,那麼就需要有m-b-s位tag,標記出當前是哪個cache line落到這個set裡面了。也就是說t = m - b –s。

如上圖所示,m位位址的記憶體,需要s位做索引,選set,t位做tag,選cache line,然後b 位做偏移取具體位址的記憶體。

快取記憶體確定乙個請求是否命中,然後抽取出被請求的字的過程,分為三步1)組選擇2)行匹配3)字抽取。

直接對映每個組只有一行e=1

選組位址中取s bits選組

選行位址中取t bits與cache line中t bits tag匹配,匹配則命中,不匹配則cache miss

字抽取位址中的b bits就是cache line中偏移,在命中的cache line中的取字。

直接對映不命中時,不需要什麼策略,直接把索引的組中的cache line替換掉即可。

組相連對映中,乙個組包括多個cache line,目前常見的有四路組相連對映,16路組相連對映,即乙個set中有4個或16個cache line。對比直接對映,set 個數要比直接對映的少。因此s會小,相應的落到每個set中的cache line會多,因此t會大。

選組組相連對映的組選擇與直接對映一致。

選行cache line的選擇時,因為乙個set中有多個cache line,因此需要搜尋set中的每個cache line的tag,對比檢查是否命中。

字抽取與直接對映一致

組相連對映對於乙個index就會有多個行與之相對應,比較每行的tag是否與想要的位址相符合,這樣就會大大增加命中的機率,避免了一小段程式中頻繁cache失效的問題。

組相連對映不命中時,由於索引到的組中會有多個cache line,因此會有多種演算法選擇到底替換哪個cache line。

全相連對映就是組相連對映只有乙個組的情況。

選組全相連對映組選擇很簡單,只有乙個組,不需要組索引,s = 0,位址只被劃分為乙個標記tag,和乙個偏移。

選行全相連對映cache line選擇時,需要多快取中的所有cache line進行搜尋對比。

字抽取與之前一致

全相連對映需要大量的搜尋cache line進行對比,導致構造乙個又大又快的全相連快取記憶體很困難,而且很昂貴。因此全相連快取只適合做小的快取記憶體,比如tlb。

以上內容來自《深入理解計算機系統》6.4

以下內容來自網際網路

邏輯cache,virtual index virtual tagged是純粹用虛擬位址來定址,邏輯位址索引邏輯位址tag,這種方式帶來了很多的問題,每一行資料在原有tag的基礎上都要將程序標識加上以區分多個程序之間的相同位址,而在 處理共享記憶體時也比較麻煩,共享記憶體在不同的程序中的虛擬位址不相同,如何同步是個問題。

物理cache,physical index physical tagged,實體地址索引和實體地址tag,是一種最容易理解的操作方式,cache針對實體地址進行操作,簡單粗暴,而且不會有歧義。但是這種方式的缺陷也很明顯,在多程序作業系統 中,每個程序擁有自己獨立的位址空間,指令和**都是以虛擬位址的方式存在,cpu發出的memory access的指令都是以虛擬位址的方式發出,這樣的話,對於每乙個memory access的操作,都要先等待mmu將虛擬位址翻譯為實體地址,這是一種序列的方式,效率較低。

現在比較多的是採用virtual index physical tagged的方式,virtual index的含義是當cpu發出乙個位址請求之後,低位位址去和cache中的index匹配, physical tagged是指虛擬位址的高位位址去和mmu中的頁表匹配以拿到實體地址(index和取實體地址這兩個過程是並行的),然後用從mmu中取到的物理地 址作為tag(或者tag的一部分)去和cache line的tag位匹配,這樣既保證了同一位址在cache中的唯一性(有個例外,cache alias)又能將mmu和cache並行工作,提高了效率。

這種方式帶來的唯一問題就是cache alias,即乙個實體地址快取到兩個cache line中。當程序間通過共享記憶體方式通訊,或者乙個程序通過mmap的方式核心與應用層共享記憶體,就會出現同同一塊物理記憶體,以多個虛擬位址訪問的情況。就容易導致一塊物理記憶體快取到兩個cache line中。

由於共享記憶體是頁對其的,因此多個程序空間的共享記憶體,或者核心態使用者態的共享記憶體,其實體地址不同,但其頁偏移是相同的。

假如頁大小為p = 2^p 位元組,cache line為 c = 2^c 位元組,那麼共享記憶體的不同虛擬位址其低p位是一致的,假如位址0 -> c位用於block offset,c -> p 位用於set index,那麼就可以避免cache alias的問題。

但如果set index 位數 > p -c ,那肯定會出現cache alias的問題,因為同一塊物理記憶體,不同的虛擬位址,其set index不同。

針對於cache alias問題,目前的方案是由作業系統來保證,對於同一實體地址在不同程序空間的虛擬位址,要保證他們index相同,落在同乙個set,就需要保證他們虛擬位址的差值是cache大小的整數倍。同時已經有些cpu廠商在開發監視模組,試圖在硬體層面解決類似的同步問題。

儲存器 cpu快取記憶體1

現代儲存器一共包括以下幾種 暫存器直接和cpu進行互動資料的儲存器 速度最快 與cpu1級快取記憶體互動 cpu 1級快取記憶體 直接嵌在cpu內部,每個cpu獨有的 cpu 2級快取記憶體 在cpu外部,也是每個cpu獨有 cpu 3快取記憶體 所有cpu共享的快取 記憶體與快取記憶體互動 通過c...

CPU的快取記憶體儲存器的理解

參考 cpu的快取記憶體儲存器知識整理 基於快取的儲存器層次結構行之有效,是因為較慢的儲存裝置比較快的儲存裝置更便宜,還因為程式往往展示區域性性 1.通用快取記憶體儲存器結構介紹 乙個通用的快取記憶體儲存器會有s 2 s個set 組 每個set含有e個line 既通常所說的cache line 每個...

CPU快取記憶體行

cpu 為了更快的執行 於是當從記憶體中讀取資料時,並不是唯讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 cpu,快取記憶體行大小不同。如 x86是 32bytes 而alpha 是64bytes 並且始終在第 32個位元組或第 64個位元組處對齊。這樣,當 cpu訪問相鄰的...