在學習linux kernel的過程,經常會cache的概念,從軟體層面的page/buffer cache;再到硬體層面中cpu的l1 l2 l3 cache 、tlb,磁碟內部的硬體cache;以及程式設計時的cacheline對齊,slab著色等等。cache是我們始終繞不開的乙個主題,本文主要介紹處理器內部的硬體快取記憶體。
原因很簡單,提速。cpu處理指令的速度遠遠快於訪問主存的速度,若頻繁的訪問主存,會大幅拉低整個系統執行程式的效率,而cpu訪問cache的速度則很快,快到和系統訪問cpu內部暫存器的速度接近,所以使用cache能減少cpu訪問主存的次數,從而達到系統提速的目的。
每個記憶體位址代表的儲存單元是1 byte,cache和記憶體之間傳輸卻不是以單個byte進行的,而是以cache line為單元。常見的cache line大小有32、64、128 bytes。使用cache line很明顯的乙個原因是利用了程式訪問的空間區域性性,短時間內程式訪問記憶體空間中的資料或是指令大概率會在一段連續的位址範圍內,所以一次性從主存中取一段cache line大小的連續記憶體,可以減少訪問記憶體的次數。
armv8架構的cortex-a57的l1 d-cache採用了2路組相連快取(2-ways set associative), i-cache採用了3路組相連快取;l2的i-cache和d-cache都使用了16路組相連快取。
我們知道當cpu去讀取某位址的記憶體前,會先去訪問cache,如果cache命中就直接從cache裡獲取資料。那檢查命中是怎麼個流程呢?
假設我們有乙個32kb的cache是4路組相連,且cache line大小為32 bytes。那麼組的大小是32kb/4=8kb,每組的cache line數量是8kb/32b=256個。再限定cpu位址位寬是48bit,那判斷cache是否命中的資訊就全在這48個bit中了。
bit0--bit4(2^5=32)用來確定cache line中的32個byte具體哪個byte;bit5--bit12(2^8=256)用來確定256個cacheline中具體哪路cacheline(由於我們有4路,所以會找到4個cacheline),如何確定是4路中的哪一路呢?而且如果只依據bit5--bit12去定位cacheline,那將會有2^35個可能對應到這4路cache line。所以每個cache line還會配乙個tag用來解決上面的兩個問題,tag儲存了cache line對應記憶體位址的bit47--bit13,這樣所有的位址都用上了,從而能對應到唯一的一條cache line(對應不到?那就是cache miss咯)。
如上圖。關於cache line中的flags,每個cache line還會包含v(valid)和d(dirty)的兩個flags用於表示當前cache line是否valid,以及cache line中的資料是否dirty,有點類似於多級頁表中pte上的present和dirty位。
直接對映的方式可大致等同與多路組相連中1路組相連的情況。但從快取效果上看,直接對映的缺點(還用上面的32kb cache舉例)在於:每個bit5--bit12的位址一樣的記憶體塊有2^35個,而這2^35個記憶體塊只能對應乙個index固定的cache line,若該cache line快取了一塊記憶體資料,那下次再有資料落在這2^35個可能中的任意一記憶體塊中,前乙個cache line中的資料就會被沖掉,還要重新訪問記憶體填充cache line,這種情況被成為cache顛簸(cache thrashing)。於是出現了多路組相連快取,更多的組可以減少cache thrashing發生的概率。
全相連快取可以理解為直接對映快取中去掉index段,bit5--bit47全部存放在tag中,沒有了index的限制,意味著每條cache line可以對應任意乙個記憶體塊。你可能會覺得這樣不是最好的嗎?倘若cache較大時,cache line就會變得很多很多,當判斷是否cache hit時,需要遍歷大量的tag,不夠高效,且增加了硬體設計的複雜性。所以全相連只適用於cache容量較小的情況。
主存和cache每一塊相等 多核Cache一致性
經過這麼多篇文章的介紹,我們應該已經對cache有乙個比較清晰的認識。cache會面臨哪些問題,我們該怎麼處理這些問題。現在我們討論多核cache一致性問題。在摩爾定律不太適用的今天,人們試圖增加cpu核數以提公升系統整體效能。這類系統稱之為多核系統 簡稱mp,multi processor 我們知...
謹慎投資每一塊錢
十五世紀,哥倫布開闢了橫渡大西洋到美洲的航路。哥倫布的出海得到了西班牙女王伊莎貝拉的支援,後人推算,女王大約資助了3萬美元,哥倫布與女王簽下乙個投資方案,哥倫布獲得航海探險收益的10 和5 的 剩餘歸女王所有。四百多年後的1962年,股神 巴菲特在其合夥人公司的年報中為伊莎貝女王重新算了一筆賬,粗略...
乙個完整的url每一塊的作用
解析鏈結 完成客戶端和伺服器端互動的過程 資料的傳輸 類似於快遞公司 資料互動 1.客戶端向伺服器傳送資料 2.伺服器上客戶端傳送資料 3.兩台伺服器之間也可以相互傳送資料 https 比http更加安全,http 超文字傳輸協議 ftp 往伺服器上上傳專案的 購買的是一級網域名稱 qq.com 二...