現代儲存器一共包括以下幾種:
暫存器直接和cpu進行互動資料的儲存器 (速度最快)與cpu1級快取記憶體互動
cpu 1級快取記憶體
直接嵌在cpu內部,每個cpu獨有的
cpu 2級快取記憶體
在cpu外部,也是每個cpu獨有
cpu 3快取記憶體
所有cpu共享的快取
記憶體與快取記憶體互動、通過cpu控制dma與記憶體做互動
硬碟通過cpu控制dma與記憶體做互動
上圖的儲存器速度,從上到下依次遞減。
我們通過命令 sysctl -a 檢視一二**快取的大小一級快取的大小為 32k,二級256k 3級 6m
快取記憶體的內部結構:
由於cpu的速度太快了,記憶體完全跟不上cpu的運算速度,所以我們引入了乙個cpu高階快取的儲存器。20ghz的cpu一秒能有20億個時鐘週期,也就是執行20億個指令。光靠記憶體傳輸,速度完全跟不上
由上圖,我們可以看出訪問1級快取的速度和訪問記憶體速度差了100倍。
首先快取之所以快。其中乙個原因是因為它離cpu近,物理方面的限制
快取的成本比記憶體成本貴太多了。
綜合上面兩個原因,我們只能限制快取的大小。
為了讓快取記憶體能更有效的利用,引入了時間區域性性原理和空間區域性性原理。
即使用了lru演算法,保證熱點資料一直在快取記憶體中,我們就不用頻繁去訪問記憶體
lru是least recently used的縮寫,即最近最少使用,是一種常用的頁面置換演算法,選擇最近最久未使用的頁面予以淘汰假設我們訪問了載入了當前的資料,一定會載入下一條資料。有了空間區域性性就會把下一條資料載入到快取記憶體中。我們來看一段**,分析其效能:
輸出結果為public static void main(string args)
time spent is 31ms
time spent is 26ms
我們首先來分析 迴圈1,執行了64 * 1024 * 1024次arr[i] *= 3
第二個迴圈,每次+16,意味著執行了4*1024*1024次arr[i] *= 3
兩者執行arr[i] *= 3的次數相差了16倍,但是執行時間卻只差了5ms,有問題!
我們來看下面這個圖
為了合理分配我們的快取記憶體,我們把快取分為塊,其中每個塊cache line 64個位元組(乙個位元組等於8位)。
我們使用了如上圖的方法,我們的快取塊一共有8塊,取記憶體中的位址後3位作為快取塊的位址,與之類似的方法,5%8=0,21%8=5,那麼此時的快取都命中在5這個快取塊中。
所以如果我們查詢的記憶體資料在快取塊中,那麼就不用再去查詢記憶體了。
我們在每個cache line中放置乙個標誌位,標誌當前是屬於哪個組的,block5還是block21的。實際上我們取記憶體位址的高二位來判斷該cache line屬於哪個記憶體塊
根據記憶體位址,取後三位 定位到cache line。
cache line中還有資訊是標識當前資訊是否是有效的,如果一開始並沒有從記憶體讀資料的情況
判斷cache line 是否為要查詢的組,也就是取記憶體高二位和cache line中的組資訊進行對比。
根據記憶體位址的offset位,從data block 資料中讀取資料
上圖就是記憶體和快取記憶體的對映關係,cpu直接從cache line中拿實際資料就行了。
接下來就可以解釋 為什麼上面的**-迴圈1中執行了31ms,迴圈2中執行了26ms。
假設只用到了一級快取: 1kb能儲存16個cache line(1024/64) ,一級快取有 16*32=512個cache line
因為每個int型別占用4個位元組,所以當它執行16次的時候,已經執行了64個位元組,也就是乙個cache line,每64個位元組從記憶體中拿一次block到cache line ,所以速度是差不多的。
CPU的快取記憶體儲存器的理解
參考 cpu的快取記憶體儲存器知識整理 基於快取的儲存器層次結構行之有效,是因為較慢的儲存裝置比較快的儲存裝置更便宜,還因為程式往往展示區域性性 1.通用快取記憶體儲存器結構介紹 乙個通用的快取記憶體儲存器會有s 2 s個set 組 每個set含有e個line 既通常所說的cache line 每個...
CPU的快取記憶體儲存器知識整理
基於快取的儲存器層次結構行之有效,是因為較慢的儲存裝置比較快的儲存裝置更便宜,還因為程式往往展示區域性性 時間區域性性 被引用過一次的儲存器的位置很可能在不遠的將來被再次引用。空間區域性性 如果乙個儲存器位置被引用了一次,那麼程式很可能在不遠的將來引用附近的乙個儲存器位置。乙個通用的快取記憶體儲存器...
CPU快取記憶體行
cpu 為了更快的執行 於是當從記憶體中讀取資料時,並不是唯讀自己想要的部分。而是讀取足夠的位元組來填入快取記憶體行。根據不同的 cpu,快取記憶體行大小不同。如 x86是 32bytes 而alpha 是64bytes 並且始終在第 32個位元組或第 64個位元組處對齊。這樣,當 cpu訪問相鄰的...