1. 程式人生 > >Arm Cache學習總結

Arm Cache學習總結

detail 原則 分享 spa aid cor 什麽 file 先進先出

cache,高速緩存,其原始意義是指訪問速度比一般隨機存取內存(RAM)快的一種RAM,通常它不像系統主存那樣使用DRAM技術,而使用昂貴但較快速的SRAM技術。

1、cache映射方式

cache中的數據就是物理內存中的數據的子集,那麽對於物理內存的一個數據,根據cache中可以放置這個數據位置的多少,可以分為三種:①如果cache中只有一個位置可以容納這個數據,則為直接映射的cache;②如果cache中有多個地方可以放置這個數據,它就是組相聯的cache;③如果cache中的任何地方都可以放置這個數據,那麽它就是全相連的cache;如下圖所示

技術分享圖片

2cache的結構

更詳細的講,

cache的結構其實和內存的結構類似,也包含地址和內容,只是cache的內容除了存的數據(data)之外,還包含存的數據的物理內存的地址信息(tag),因為CPU發出的尋址信息都是針對物理內存發出的,所以cache中除了要保存數據信息之外,還要保存數據對應的地址,這樣才能在cache中根據物理內存的地址信息查找物理內存中對應的數據。(當然為了加快尋找速度,cache中一般還包含一個有效位(valid),用來標記這個cache line是否保存著有效的數據)。一個tag和它對應的數據組成的一行稱為一個cache line。如下圖所示,下表中的一行就是一個cache line

技術分享圖片

3 cache的基本結構

具體的DataValidTag各有多大,在介紹了內存的地址劃分之後再在下文中講。

3cache中去尋找對應的數據

知道了cache的結構之後,如何在cache中去尋找對應的數據呢?簡單起見,我們先選擇 直接映射的cache組成方式進行下文的分析。

首先對於一段物理內存(block),該物理內存上的每個字節的地址劃分為以下幾段:[3]

技術分享圖片

4 處理器物理內存地址的劃分

這樣的話物理內存中的數據到cache的映射關系如下圖5所示:

技術分享圖片

5 cache的查找過程

上圖的映射原則就是:根據物理地址的中間三位(index字段)來定位當前數據應該在

cache的哪一行,把物理地址的tag字段和該地址對應的內容放入對應的cache linetag字段和data字段,並把相應的valid位置1。那麽在之後進行cache尋找的時候就可以根據cache linetag字段來辨認當前line中的數據是數據哪個block的。

上圖5中的地址00 000 00~11 111 11按照圖4的原則進行地址劃分:地址的最高兩位為Tag字段;中間三位為index字段;最低兩位為Block Offset 字段;由於Block Offset是兩位,也就是一個block的大小是2²=4個字節的數據,也就是一個cache linedata字段包含4個字節的數據;index3位,說明cache共包含2³=8個組(對於直接映射的cache,也稱為8個行);很明顯,cache的一個行中只能存儲1 (Block )=4字節的數據,但是按照圖5的映射方式,會有2^(tag位數) = 2^2 = 4塊的數映射到同一個行,此時通過Tag字段的比較來辨別是不是我們要取數據的地址,如果不是的話,也就是發生了cache的缺失。如圖5Block 0Block 1index字段都是000,按照上面的理論它們都應該映射到第 000=0行(這兒的行也就是組,因為圖5是直接映射的cache),但是現在第0行的內容是KLMN,也就是Block 1的內容,為什麽呢?仔細看該cache linetag=01,映射到第0行的塊只有Block 1tag字段=01,所以可以得知此時該cache line中存儲的數據是Block 1的數據,此時如果CPU發出的訪存請求是訪問Block 0 的話,也就是發生了缺失。此時進一步定量分析的話,共有4個數據塊競爭使用cache 0行的位置,也就是說cache的命中率為25%

上面的過程總結起來就是:物理內存的索引字段(Index)選擇cache 的行,通過對比物理內存和cache lineTag來判斷是否命中。塊偏移字段(Block Offset)可以從cache line的數據塊中選擇期望數據。註意在這個過程中cacheindex是不占空間的,它就類似於物理內存的地址,對於物理內存來說是通過地址去尋找數據,對於cache來說,是通過index來找到對應的cache line,或者更通俗的講就是:cache line的地址對應的就是物理內存的index字段。

此時該cache的容量計算如下:每一個cache line的數據字段占4個字節,共2³=8行,所以數據占據4×8=32個字節,一個cache linetag字段和valid位占2+1=3bit,整個cachetag+valid=3bit×8=24bit=3Byte,通常情況下我們都是一cache中數據部分占的空間表示cache的容量,也就是32字節,但是實際上,它還額外多占用了3字節的存儲空間[4]

5的分析是針對直接映射的cache進行的,對於組相聯或者全相連的cache的分析與之類似。如果是組相連的cache,每個組(set)裏面包含多個行(line),通過內存地址的index字段來尋址組,確定組之後再根據tag來確定是否命中;對於全相連的cache,就不需要index字段了,因為全相連的cache相當於只有一個組的組相連cache。這是只需要根據要尋址的地址的tag來逐一與cache中的tag字段比較,如果有與之匹配的cache line,也就是cache hit了,如果遍歷整個cache,也沒有找到匹配的cache line,那就是cache miss了。

註:為了敘述的簡單性,省略了內存地址通過TLB的的虛實轉換部分,由[1]可知,內存地址的Tag部分其實是需要先經過TLB的轉化才能夠去和cache linetag部分去進行匹配的。

4cache的讀寫機制

cache的讀寫一般遵循兩種機制:cache-throughcache-back

cache-through:數據更新時,在寫入緩存之後,立即也將數據寫入內存,如果此時請求指定的地址沒有對應的緩存,那麽直接寫入內存。

cache-back:數據更新時,在寫入緩存之後,不會立即更新對應的內存,只有當該緩存被用於其他的內存數據(即數據被替換出緩存)時,被修改的緩存中的數據才會被覆蓋式地寫入到對應的內存中。

技術分享圖片

技術分享圖片

備註:

(1)“選擇cache block”的算法有很多種,比如:最久未使用算法(LRU)、先進先出算法(FIFO)、最近最少使用算法(LFU)、非最近使用算法(NMRU)等。

(2)DRAM,動態隨機存取存儲器(Dynamic Random Access MemoryDRAM)是一種半導體內存,主要的作用原理是利用電容內存儲電荷的多寡來代表一個二進制比特(bit)是1還是0。由於在現實中電容會有漏電的現象,導致電位差不足而使記憶消失,因此除非電容經常周期性地充電,否則無法確保記憶長存。由於這種需要定時刷新的特性,因此被稱為“動態”內存。

(3)SRAM,靜態隨機存取存儲器(Static Random-Access MemorySRAM)是隨機存取存儲器的一種。所謂的“靜態”,是指這種存儲器只要保持通電,裏面儲存的數據就可以恒常保持[1]。相對之下,動態隨機存取存儲器(DRAM)裏面所儲存的數據就需要周期性地更新。然而,當電力供應停止時,SRAM儲存的數據還是會消失(被稱為volatile memory),這與在斷電後還能儲存資料的ROM或閃存是不同的。

5 文件Cache相關API及其實現

Linux內核中與文件Cache操作相關的API有很多,按其使用方式可以分成兩類:一類是以拷貝方式操作的相關接口,如read/write/sendfile等,其中sendfile2.6系列的內核中已經不再支持;另一類是以地址映射方式操作的相關接口,如mmap等。

第一種類型的API在不同文件的Cache之間或者Cache與應用程序所提供的用戶空間buffer之間拷貝數據,其實現原理如圖7所示。

技術分享圖片

第二種類型的APICache項映射到用戶空間,使得應用程序可以像使用內存指針一樣訪問文件,Memory map訪問Cache的方式在內核中是采用請求頁面機制實現的,其工作過程如圖8所示。

技術分享圖片

首先,應用程序調用mmap(圖中1),陷入到內核中後調用do_mmap_pgoff(圖中2)。該函數從應用程序的地址空間中分配一段區域作為映射的內存地址,並使用一個VMAvm_area_struct)結構代表該區域,之後就返回到應用程序(圖中3)。當應用程序訪問mmap所返回的地址指針時(圖中4),由於虛實映射尚未建立,會觸發缺頁中斷(圖中5)。之後系統會調用缺頁中斷處理函數(圖中6),在缺頁中斷處理函數中,內核通過相應區域的VMA結構判斷出該區域屬於文件映射,於是調用具體文件系統的接口讀入相應的Page Cache項(圖中789),並填寫相應的虛實映射表。經過這些步驟之後,應用程序就可以正常訪問相應的內存區域了。

參考博客

https://blog.csdn.net/baidu_35679960/article/details/78610804

https://blog.csdn.net/wangwei222/article/details/79748597

https://www.cnblogs.com/pangblog/p/3362171.html

Arm Cache學習總結