本節書摘來自華章出版社《深入淺出dpdk》一書中的第2章,第2.2節cache系統簡介,作者朱河清,梁存銘,胡雪焜,曹水 等,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
2.2 cache系統簡介
随着計算機行業的飛速發展,cpu的速度和記憶體的大小都發生了翻天覆地的變化。英特爾公司在1982年推出80286晶片的時候,處理器内部含有13.4萬個半導體,時鐘頻率隻有6mhz,内部和外部資料總線隻有16位,位址總線24位,可尋址記憶體大小16mb。
而英特爾公司在2014年推出的haswell處理器的時候,處理器内部僅處理器本身就包含了17億個半導體,還不包括cache和gpu這種複雜部件。時鐘頻率達到3.8ghz,資料總線和位址總線也都擴充到了64位,可以尋址的記憶體大小也已經開始以tb(1t=1024gb)計算。
在處理器速度不斷增加的形勢下,處理器處理資料的能力也得到大大提升。但是,資料是存儲在記憶體中的,雖然随着ddr2、ddr3、ddr4的新技術不斷推出,記憶體的吞吐率得到了大大提升,但是相對于處理器來講,仍然非常慢。一般來講,處理器要從記憶體中直接讀取資料都要花大概幾百個時鐘周期,在這幾百個時鐘周期内,處理器除了等待什麼也不能做。在這種環境下,才提出了cache的概念,其目的就是為了比對處理器和記憶體之間存在的巨大的速度鴻溝。
2.2.1 cache的種類
一般來講,cache由三級組成,之是以對cache進行分級,也是從成本和生産工藝的角度考慮的。一級(l1)最快,但是容量最小;三級(llc,last level cache)最慢,但是容量最大,在早期計算機系統中,這一級cache也可以省略。不過在當今時代,大多數處理器都會包含這一級cache。
cache是一種sram,在早期計算機系統中,一般一級和二級cache內建在處理器内部,三級cache內建在主機闆上,這樣做的主要原因是生産工藝的問題,處理器内部能夠內建的半導體數目有限,而三級cache又比較大,進而占用的半導體數量較多。以英特爾最新的haswell i7-5960x為例,一級cache有32k,二級有512k,但是三級卻有20m,在早期計算機系統中內建如此大的sram實在是很難做到。不過随着90nm、45nm、32nm以及22nm工藝的推出,處理器内部能夠容納更多的半導體,是以三級cache也慢慢內建到處理器内部了。
圖2-4是一個簡單的cache系統邏輯示意圖。
一級cache,一般分為資料cache和指令cache,資料cache用來存儲資料,而指令cache用于存放指令。這種cache速度最快,一般處理器隻需要3~5個指令周期就能通路到資料,是以成本高,容量小,一般都隻有幾十kb。在多核處理器内部,每個處理器核心都擁有僅屬于自己的一級cache。
二級cache,和一級cache分為資料cache和指令cache不同,資料和指令都無差别地存放在一起。速度相比一級cache慢一些,處理器大約需要十幾個處理器周期才能通路到資料,容量也相對來說大一些,一般有幾百kb到幾mb不等。在多核處理器内部,每個處理器核心都擁有僅屬于自己的二級cache。
三級cache,速度更慢,處理器需要幾十個處理器周期才能通路到資料,容量更大,一般都有幾mb到幾十個mb。在多核處理器内部,三級cache由所有的核心所共有。這樣的共享方式,其實也帶來一個問題,有的處理器可能會極大地占用三級cache,導緻其他處理器隻能占用極小的容量,進而導緻cache不命中,性能下降。是以,英特爾公司推出了intel? cat技術,確定有一個公平,或者說軟體可配置的算法來控制每個核心可以用到的cache大小。在此,本書就不再贅述。
對于各級cache的通路時間,在英特爾的處理器上一直都保持着非常穩定,一級cache通路是4個指令周期,二級cache是12個指令周期,三級cache則是26~31個指令周期。這裡所謂的穩定,是指在不同頻率、不同型号的英特爾處理器上,處理器通路這三級cache所花費的指令周期數是相同的。請參照[ref2-2]。
除了上述的cache種類之外,還包含一些其他類型,接下來的章節會接着介紹。
2.2.2 tlb cache
在早期計算機系統中,程式員都是直接通路實體位址進行程式設計,當程式出現錯誤時,整個系統都癱瘓掉;或者在多程序系統中,當一個程序出現問題,對屬于另外一個程序的資料或者指令區域進行寫操作,會導緻另外一個程序崩潰。是以,随着計算機技術的進步,虛拟位址和分段分頁技術被提出來用來保護脆弱的軟體系統。軟體使用虛拟位址通路記憶體,而處理器負責虛拟位址到實體位址的映射工作。為了完成映射工作,處理器采用多級頁表來進行多次查找最終找到真正的實體位址。當處理器發現頁表中找不到真正對應的實體位址時,就會發出一個異常,挂起尋址錯誤的程序,但是其他程序仍然可以正常工作。
頁表也存儲在記憶體中,處理器雖然可以利用三級cache系統來緩存頁表内容,但是基于兩點原因不能這樣做。一種原因下面的段落會講到,我們先講另外一個原因。處理器每當進行尋址操作都要進行一次映射工作,這使得處理器通路頁表的頻率非常得高,有可能一秒鐘需要通路幾萬次。是以,即使cache的命中率能夠達到99%以上,也就是說不命中率有1%,那麼不命中的機率每秒也有幾百次,這會導緻處理器在機關時間内通路記憶體(因為cache沒有命中,隻能通路記憶體)的次數增多,降低了系統的性能。
是以,tlb(translation look-aside buffer)cache應運而生,專門用于緩存記憶體中的頁表項。tlb一般都采用相連存儲器或者按内容通路存儲器(cam,content addressable memory)。相連存儲器使用虛拟位址進行搜尋,直接傳回對應的實體位址,相對于記憶體中的多級頁表需要多次通路才能得到最終的實體位址,tlb查找無疑大大減少了處理器的開銷,這也是上文提到的第二個原因。如果需要的位址在tlb cache中,相連存儲器迅速傳回結果,然後處理器用該實體位址通路記憶體,這樣的查找操作也稱為tlb命中;如果需要的位址不在tlb cache中,也就是不命中,處理器就需要到記憶體中通路多級頁表,才能最終得到實體位址。