本文簡單介紹了計(jì)算機(jī)性能瓶頸產(chǎn)生的原因,緩存及其發(fā)展歷史,最后講解了緩存彌補(bǔ)CPU和內(nèi)存性能差異的原理,后面我們會繼續(xù)更詳細(xì)深入地介紹Cache的組織結(jié)構(gòu)、緩存一致性,以及如何利用緩存提升我們代碼的性能等。
- 計(jì)算機(jī)性能的瓶頸
- 緩存及其發(fā)展歷史
- 緩存如何彌補(bǔ)CPU與內(nèi)存的性能差異?
- 尾語
大家好,我是呼嚕嚕,今天我們來介紹計(jì)算機(jī)的儲存器之一,CPU高速緩沖存儲器也叫高速緩存,CPU Cache
緩存這個專業(yè)術(shù)語,在計(jì)算機(jī)世界中是經(jīng)常使用到的。它并不是CPU所獨(dú)有的,比如cdn緩存網(wǎng)站信息,瀏覽器緩存網(wǎng)頁的圖像視頻等,但本文講述的是狹義Cache,主要指的是CPU Cache,本文將其簡稱為"緩存"或者"Cache"
計(jì)算機(jī)性能的瓶頸
在馮諾依曼架構(gòu)下,計(jì)算機(jī)存儲器是分層次的,存儲器的層次結(jié)構(gòu)如下圖所示,是一個金字塔形狀的東西。從上到下依次是寄存器、緩存、主存(內(nèi)存)、硬盤等等
圖片
離CPU越近的存儲器,訪問速度越來越快,容量越來越小,每字節(jié)的成本也越來越昂貴
比如一個主頻為3.0GHZ的CPU,寄存器的速度最快,可以在1個時鐘周期內(nèi)訪問,一個時鐘周期(CPU中基本時間單位)大約是0.3納秒,內(nèi)存訪問大約需要120納秒,固態(tài)硬盤訪問大約需要50-150微秒,機(jī)械硬盤訪問大約需要1-10毫秒,最后網(wǎng)絡(luò)訪問最慢,得幾十毫秒左右。
這個大家可能對時間不怎么直觀,那如果我們把一個時鐘周期如果按1秒算的話,那寄存器訪問大約是1s,內(nèi)存訪問大約就是6分鐘 ,固態(tài)硬盤大約是2-6天 ,傳統(tǒng)硬盤大約是1-12個月,網(wǎng)絡(luò)訪問就得幾年了!我們可以發(fā)現(xiàn)CPU的速度和內(nèi)存等存儲器的速度,完全不是一個量級上的。
電子計(jì)算機(jī)剛出來的時候,其實(shí)CPU是沒有緩存Cache的,那個時候的CPU主頻很低,甚至沒有內(nèi)存高,CPU都是直接讀寫內(nèi)存的
隨著時代的發(fā)展,技術(shù)的革新,從1980年代開始,差距開始迅速擴(kuò)大,CPU的速度遠(yuǎn)遠(yuǎn)超過內(nèi)存的速度,在馮諾依曼架構(gòu)下,CPU訪問內(nèi)存的速度也就成了計(jì)算機(jī)性能的瓶頸!!!
圖片
DRAM為內(nèi)存顆粒,也叫動態(tài)隨機(jī)存取存儲器, 圖片來源于:How L1 and L2 CPU Caches Work, and Why They're an Essential Part of Modern Chips
為了彌補(bǔ)CPU與內(nèi)存兩者之間的性能差異,也就是要加快CPU訪問內(nèi)存的速度,就引入了緩存CPU Cache,緩存的速度僅次于寄存器,充當(dāng)了CPU與內(nèi)存之間的中間角色
緩存及其發(fā)展歷史
緩存CPU Cache用的是 SRAM(Static Random-Access Memory)的芯片,也叫靜態(tài)隨機(jī)存儲器。其只要有電,數(shù)據(jù)就可以保持存在,而一旦斷電,數(shù)據(jù)就會丟失。
CPU Cache 如今通常分為大小不等的3級緩存,分別是 L1 Cache、L2 Cache 和 L3 Cache
我們可以發(fā)現(xiàn)越靠近 CPU 核心的緩存,其訪問速度越快,其大小越來越小,其制造成本也越昂貴,常見的Cache典型分布圖如下:
圖片
回顧C(jī)ache發(fā)展歷史,我們可以發(fā)現(xiàn)Cache其實(shí)一開始并不是在CPU的內(nèi)部,我們這里以Intel系列為例
在80286之前,那個時候是沒有緩存Cache的,那個時候的CPU主頻很低,甚至沒有內(nèi)存高,CPU都是直接讀寫內(nèi)存的
圖片
從80386開始,這個CPU速度和內(nèi)存速度不匹配問題已經(jīng)開始展露,并且差距開始迅速擴(kuò)大,慢速度的內(nèi)存成為了計(jì)算機(jī)的瓶頸,無法充分發(fā)揮CPU的性能,為解決這個問題,Intel主板支持外部Cache,來配合80386運(yùn)行
圖片
80486將L1 Cache(大小8KB)放到CPU內(nèi)部,同時支持外接Cache,即L2 Cache(大小從128KB到256KB),但是不分指令和數(shù)據(jù)Cache
圖片
雖然L1 Cache大小只有8KB,但其實(shí)對那時候CPU來說夠用了,我們來看一副緩存命中率與L1、L2大小的關(guān)系圖:
圖片
圖片來源于:How L1 and L2 CPU Caches Work, and Why They're an Essential Part of Modern Chips
從上圖我們可以發(fā)現(xiàn),增大L1 cache對于CPU來說好處不太明顯,緩存命中率并沒有顯著提升,成本還會更昂高,所以性價比不高。
而隨著 L2 cache 大小的增加,緩存總命中率會急劇上升,因此容量更大、速度較慢、更便宜的L2成為了更好的選擇
等到Pentium-1/80586,也就是我們熟悉的奔騰系列,由于Pentium采用了雙路執(zhí)行的超標(biāo)量結(jié)構(gòu),有2條并行整數(shù)流水線,需要對數(shù)據(jù)和指令進(jìn)行雙重的訪問,為了使得這些訪問互不干涉,于是L1 Cache被一分為二,分為指令Cache和數(shù)據(jù)Cache(大小都是8K),此時的L2 Cache還是在主板上,再后來Intel推出了Pentium Pro/80686,為了進(jìn)一步提高性能L2 Cache被正式放到CPU內(nèi)部
圖片
后來CPU多核時代來臨,Intel的Pentium D、Pentium EE系列,CPU內(nèi)部每個核心都有自己的L1、L2 Cache,但他們并不共享,只能依靠總線來傳遞同步緩存數(shù)據(jù)。最后Core Duo酷睿系列的出現(xiàn),L2 Cache變成多核共享模式,采用Intel的“Smart cache”共享緩存技術(shù),到此為止,就確定了現(xiàn)代緩存的基本模式
圖片
如今CPU Cache 通常分為大小不等的3級緩存,分別是 L1 Cache、L2 Cache 和 L3 Cache,L3 高速緩存為多個 CPU 核心共用的,而L2則被每個核心單獨(dú)占據(jù),另外現(xiàn)在有的CPU已經(jīng)有了L4 Cache,未來可能會更多
緩存如何彌補(bǔ)CPU與內(nèi)存的性能差異?
我們可以思考一個問題:緩存是如何彌補(bǔ)CPU與內(nèi)存兩者之間的性能差異?
緩存主要是利用局部性原理,來提升計(jì)算機(jī)的整體性能。因?yàn)榫彺娴男阅軆H次于寄存器,而CPU與內(nèi)存兩者之間的產(chǎn)生的分歧,主要是二者存取速度數(shù)量級的差距,那盡可能多地讓CPU去存取緩存,同時減少CPU直接訪問主存的次數(shù),這樣計(jì)算機(jī)的性能就自然而然地得到巨大的提升
所謂局部性原理,主要分為空間局部性與時間局部性:
- 時間局部性:被引用過一次的存儲器位置在未來會被多次引用(通常在循環(huán)中)。
- 空間局部性:如果一個存儲器的位置被引用,那么將來他附近的位置也會被引用
緩存這里,會去把CPU最近訪問主存(內(nèi)存)中的指令和數(shù)據(jù),臨時儲存著,因?yàn)楦鶕?jù)局部性原理,這些指令和數(shù)據(jù)在較短的時間間隔內(nèi)很可能會被以后多次使用到,其次是當(dāng)從主存中取回這些數(shù)據(jù)時,會同時取回與其位置相鄰的主存單元的存放的數(shù)據(jù) 臨時儲存到緩存中,因?yàn)樵撝噶詈蛿?shù)據(jù)附近的內(nèi)存區(qū)域,在較短的時間間隔內(nèi)也可能會被多次訪問。
那以后CPU去訪問這些指令和數(shù)據(jù)時,首先去命中L1 Cache,如果命中會直接從對應(yīng)的緩存中取數(shù)據(jù),而不必每次去訪問主存,如果沒命中,會再去L2 Cache中找,依次類推,如果L3 Cache中不存在,就去內(nèi)存中找。
尾語
本文簡單介紹了計(jì)算機(jī)性能瓶頸產(chǎn)生的原因,緩存及其發(fā)展歷史,最后講解了緩存彌補(bǔ)CPU和內(nèi)存性能差異的原理,后面我們會繼續(xù)更詳細(xì)深入地介紹Cache的組織結(jié)構(gòu)、緩存一致性,以及如何利用緩存提升我們代碼的性能等
參考資料:
https://www.extremetech.com/extreme/188776-how-l1-and-l2-cpu-caches-work-and-why-theyre-an-essential-part-of-modern-chips
http://www.cpu-zone.com/80486.htm
本文轉(zhuǎn)載自微信公眾號「 小牛呼嚕嚕」,作者「小牛呼嚕嚕」,可以通過以下二維碼關(guān)注。