程序員都要懂的~計(jì)算機(jī)的存儲(chǔ)器架構(gòu)
大家都知道內(nèi)存和硬盤(pán)都屬于計(jì)算機(jī)的存儲(chǔ)設(shè)備,斷電后內(nèi)存的數(shù)據(jù)是會(huì)丟失的,而硬盤(pán)則不會(huì),因?yàn)橛脖P(pán)是持久化存儲(chǔ)設(shè)備,同時(shí)也是一個(gè) I/O 設(shè)備。
其實(shí) CPU 內(nèi)部也有存儲(chǔ)數(shù)據(jù)的組件,比如寄存器、CPU L1/L2/L3 Cache 也都是屬于存儲(chǔ)設(shè)備,只不過(guò)它們能存儲(chǔ)的數(shù)據(jù)非常小,但是它們因?yàn)榭拷?CPU 核心,所以訪問(wèn)速度都非常快,快過(guò)硬盤(pán)好幾個(gè)數(shù)量級(jí)別。
問(wèn)題來(lái)了,那機(jī)械硬盤(pán)、固態(tài)硬盤(pán)、內(nèi)存這三個(gè)存儲(chǔ)器,到底和 CPU L1 Cache 相比速度差多少倍呢?
在回答這個(gè)問(wèn)題之前,我們先來(lái)看看「存儲(chǔ)器的層次結(jié)構(gòu)」,好讓我們對(duì)存儲(chǔ)器設(shè)備有一個(gè)整體的認(rèn)識(shí)。
存儲(chǔ)器的層次結(jié)構(gòu)
我們想象中一個(gè)場(chǎng)景,程序汪小劉同學(xué)準(zhǔn)備轉(zhuǎn)行了,在準(zhǔn)備法考,為了營(yíng)造氣氛,就去附近自習(xí)室學(xué)習(xí)。那么,在看書(shū)的時(shí)候,我們的大腦會(huì)思考問(wèn)題,也會(huì)記憶考點(diǎn),另外我們通常也會(huì)把常用的書(shū)放在自己的桌子上,當(dāng)我們要找一本不常用的書(shū),則會(huì)回家去拿或者去附近的圖書(shū)館找一找。
就是這么一個(gè)場(chǎng)景,已經(jīng)把計(jì)算機(jī)的存儲(chǔ)結(jié)構(gòu)基本都涵蓋了。
我們可以把 CPU 比喻成我們的大腦,大腦正在思考的東西,就好比 CPU 中的寄存器,處理速度是最快的,但是能存儲(chǔ)的數(shù)據(jù)也是最少的 。
我們大腦中的記憶,就好比 CPU Cache,中文稱(chēng)為 CPU 高速緩存,處理速度相比寄存器慢了一點(diǎn),但是能存儲(chǔ)的數(shù)據(jù)也稍微多了一些。
CPU Cache 通常會(huì)分為 L1、L2、L3 三層,L1 是距離 CPU 最近的,因此它比 L2、L3 的讀寫(xiě)速度都快、存儲(chǔ)空間都小。我們大腦中短期記憶,就好比 L1 Cache,而長(zhǎng)期記憶就好比 L2/L3 Cache。
寄存器和 CPU Cache 都是在 CPU 內(nèi)部,跟 CPU 挨著很近,因此它們的讀寫(xiě)速度都相當(dāng)?shù)目欤悄艽鎯?chǔ)的數(shù)據(jù)很少,畢竟 CPU 就這么丁點(diǎn)大。
再來(lái)看看 CPU 外部的存儲(chǔ)器。
當(dāng)我們大腦記憶中沒(méi)有資料的時(shí)候,可以從書(shū)桌拿書(shū)來(lái)閱讀,那我們桌子上的書(shū),就好比內(nèi)存,我們雖然可以一伸手就可以拿到,但讀寫(xiě)速度肯定遠(yuǎn)慢于寄存器,
那圖書(shū)館里資料或者在家里的書(shū),就好比硬盤(pán),能存儲(chǔ)的數(shù)據(jù)非常大,但是讀寫(xiě)速度相比內(nèi)存差好幾個(gè)數(shù)量級(jí),更別說(shuō)跟寄存器的差距了。
對(duì)于存儲(chǔ)器,它的速度越快、能耗會(huì)越高、而且材料的成本也是越貴的,以至于速度快的存儲(chǔ)器的容量都比較小。
存儲(chǔ)器通常可以分為這么幾個(gè)級(jí)別:
- 寄存器;
- CPU Cache;
- L1-Cache;
- L2-Cache;
- L3-Cahce;
- 內(nèi)存;
- SSD/HDD 硬盤(pán)
寄存器
最靠近 CPU 的控制單元和邏輯計(jì)算單元的存儲(chǔ)器,就是寄存器了,它使用的材料速度也是最快的,因此價(jià)格也是最貴的,那么數(shù)量不能很多。
寄存器的數(shù)量通常在幾十到幾百之間,每個(gè)寄存器可以用來(lái)存儲(chǔ)一定的字節(jié)(byte)的數(shù)據(jù)。比如:
- 32 位 CPU 中大多數(shù)寄存器可以存儲(chǔ) 4 個(gè)字節(jié);
- 64 位 CPU 中大多數(shù)寄存器可以存儲(chǔ) 8 個(gè)字節(jié)。
寄存器的訪問(wèn)速度非常快,一般要求在半個(gè) CPU 時(shí)鐘周期內(nèi)完成讀寫(xiě),CPU 時(shí)鐘周期跟 CPU 主頻息息相關(guān),
舉個(gè)例子,主頻為3.0GHZ的CPU,一個(gè)時(shí)鐘周期大約是0.3納秒,內(nèi)存訪問(wèn)大約需要120納秒,固態(tài)硬盤(pán)訪問(wèn)大約需要50-150微秒,機(jī)械硬盤(pán)訪問(wèn)大約需要1-10毫秒,最后網(wǎng)絡(luò)訪問(wèn)最慢,得幾十毫秒左右。 這個(gè)大家可能對(duì)時(shí)間不怎么敏感,那如果我們把一個(gè)時(shí)鐘周期如果按1秒算的話,內(nèi)存訪問(wèn)大約就是6分鐘 ,固態(tài)硬盤(pán)大約是2-6天 ,傳統(tǒng)硬盤(pán)大約是1-12個(gè)月,網(wǎng)絡(luò)訪問(wèn)就得幾年了!
CPU Cache
CPU Cache 用的是一種叫 SRAM(Static Random-Access Memory,靜態(tài)隨機(jī)存儲(chǔ)器) 的芯片。
SRAM 之所以叫「靜態(tài)」存儲(chǔ)器,是因?yàn)橹灰须姡瑪?shù)據(jù)就可以保持存在,而一旦斷電,數(shù)據(jù)就會(huì)丟失了。
CPU 的高速緩存,通常可以分為 L1、L2、L3 這樣的三層高速緩存,也稱(chēng)為一級(jí)緩存、二級(jí)緩存、三級(jí)緩存。
部件 | CPU訪問(wèn)所需時(shí)間 | 介紹 |
L1 高速緩存 | 2~4 個(gè)時(shí)鐘周期 | L1 高速緩存訪問(wèn)速度幾乎和寄存器一樣快,大小在幾十 KB 到幾百 KB 不等。 每個(gè) CPU 核心都有一塊屬于自己的 L1 高速緩存,指令和數(shù)據(jù)在 L1 是分開(kāi)存放的,所以 L1 高速緩存通常分成指令緩存和數(shù)據(jù)緩存。 |
L2 高速緩存 | 10~20 個(gè)時(shí)鐘周期 | L2 高速緩存同樣每個(gè) CPU 核心都有,但是 L2 高速緩存位置比 L1 高速緩存距離 CPU 核心 更遠(yuǎn),它大小比 L1 高速緩存更大,CPU 型號(hào)不同大小也就不同,通常大小在幾百 KB 到幾 MB 不等,訪問(wèn)速度則更慢 |
L3 高速緩存 | 20~60個(gè)時(shí)鐘周期 | L3 高速緩存通常是多個(gè) CPU 核心共用的,位置比 L2 高速緩存距離 CPU 核心 更遠(yuǎn),大小也會(huì)更大些,通常大小在幾 MB 到幾十 MB 不等,具體值根據(jù) CPU 型號(hào)而定 |
內(nèi)存
內(nèi)存用的芯片和 CPU Cache 有所不同,它使用的是一種叫作 DRAM (Dynamic Random Access Memory,動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器) 的芯片。
相比 SRAM,DRAM 的密度更高,功耗更低,有更大的容量,而且造價(jià)比 SRAM 芯片便宜很多。
DRAM 存儲(chǔ)一個(gè) bit 數(shù)據(jù),只需要一個(gè)晶體管和一個(gè)電容就能存儲(chǔ),但是因?yàn)閿?shù)據(jù)會(huì)被存儲(chǔ)在電容里,電容會(huì)不斷漏電,所以需要「定時(shí)刷新」電容,才能保證數(shù)據(jù)不會(huì)被丟失,這就是 DRAM 之所以被稱(chēng)為「動(dòng)態(tài)」存儲(chǔ)器的原因,只有不斷刷新,數(shù)據(jù)才能被存儲(chǔ)起來(lái)。
DRAM 的數(shù)據(jù)訪問(wèn)電路和刷新電路都比 SRAM 更復(fù)雜,所以訪問(wèn)的速度會(huì)更慢,內(nèi)存速度大概在 200~300 個(gè) 時(shí)鐘周期之間。
SSD/HDD 硬盤(pán)
SSD(Solid-state disk) 就是我們常說(shuō)的固體硬盤(pán),結(jié)構(gòu)和內(nèi)存類(lèi)似,但是它相比內(nèi)存的優(yōu)點(diǎn)是斷電后數(shù)據(jù)還是存在的,而內(nèi)存、寄存器、高速緩存斷電后數(shù)據(jù)都會(huì)丟失。內(nèi)存的讀寫(xiě)速度比 SSD 大概快 10~1000 倍。
當(dāng)然,還有一款傳統(tǒng)的硬盤(pán),也就是機(jī)械硬盤(pán)(Hard Disk Drive, HDD),它是通過(guò)物理讀寫(xiě)的方式來(lái)訪問(wèn)數(shù)據(jù)的,因此它訪問(wèn)速度是非常慢的,它的速度比內(nèi)存慢 10W 倍左右。
由于 SSD 的價(jià)格快接近機(jī)械硬盤(pán)了,因此機(jī)械硬盤(pán)已經(jīng)逐漸被 SSD 替代了。
存儲(chǔ)器的層次關(guān)系
現(xiàn)代的一臺(tái)計(jì)算機(jī),都用上了 CPU Cahce、內(nèi)存、到 SSD 或 HDD 硬盤(pán)這些存儲(chǔ)器設(shè)備了。存儲(chǔ)空間越大的存儲(chǔ)器設(shè)備,其訪問(wèn)速度越慢,所需成本也相對(duì)越少。
CPU 并不會(huì)直接和每一種存儲(chǔ)器設(shè)備直接打交道,而是每一種存儲(chǔ)器設(shè)備只和它相鄰的存儲(chǔ)器設(shè)備打交道。比如,CPU Cache 的數(shù)據(jù)是從內(nèi)存加載過(guò)來(lái)的,寫(xiě)回?cái)?shù)據(jù)的時(shí)候也只寫(xiě)回到內(nèi)存,CPU Cache 不會(huì)直接把數(shù)據(jù)寫(xiě)到硬盤(pán),也不會(huì)直接從硬盤(pán)加載數(shù)據(jù),而是先加載到內(nèi)存,再?gòu)膬?nèi)存加載到 CPU Cache 中。
所以,存儲(chǔ)層次結(jié)構(gòu)也形成了緩存的體系。
價(jià)格和性能的權(quán)衡
前面我們知道了,速度越快的存儲(chǔ)器,造價(jià)成本往往也越高,那我們就以實(shí)際的數(shù)據(jù)來(lái)看看,不同層級(jí)的存儲(chǔ)器之間的性能和價(jià)格差異。
下面這張表格是不同層級(jí)的存儲(chǔ)器之間的成本對(duì)比圖:
你可以看到 L1 Cache 的訪問(wèn)延時(shí)是 1 納秒,而內(nèi)存已經(jīng)是 100 納秒了,相比 L1 Cache 速度慢了 100 倍。另外,機(jī)械硬盤(pán)的訪問(wèn)延時(shí)更是高達(dá) 10 毫秒,相比 L1 Cache 速度慢了 10000000 倍,差了好幾個(gè)數(shù)量級(jí)別。
在價(jià)格上,每生成 MB 大小的 L1 Cache 相比內(nèi)存貴了 466 倍,相比機(jī)械硬盤(pán)那更是貴了 175000 倍。在某東逛了下各個(gè)存儲(chǔ)器設(shè)備的零售價(jià),8G 內(nèi)存 + 1T 機(jī)械硬盤(pán) + 256G 固態(tài)硬盤(pán)的總價(jià)格,都不及一塊 Intle i5-10400 的 CPU 的價(jià)格,這款 CPU 的高速緩存的總大小也就十多 MB。
總結(jié)
機(jī)械硬盤(pán)、固態(tài)硬盤(pán)、內(nèi)存這三個(gè)存儲(chǔ)器,到底和 CPU L1 Cache 相比速度差多少倍呢?
CPU L1 Cache 隨機(jī)訪問(wèn)延時(shí)是 1 納秒,內(nèi)存則是 100 納秒,所以 CPU L1 Cache 比內(nèi)存快 100 倍左右。
SSD 隨機(jī)訪問(wèn)延時(shí)是 150 微秒,所以 CPU L1 Cache 比 SSD 快 150000 倍左右。
最慢的機(jī)械硬盤(pán)隨機(jī)訪問(wèn)延時(shí)已經(jīng)高達(dá) 10 毫秒,我們來(lái)看看機(jī)械硬盤(pán)到底有多「龜速」:
- SSD 比機(jī)械硬盤(pán)快 70 倍左右;
- 內(nèi)存比機(jī)械硬盤(pán)快 100000 倍左右;
- CPU L1 Cache 比機(jī)械硬盤(pán)快 10000000 倍左右;
我們把上述的時(shí)間比例差異放大后,就能非常直觀感受到它們的性能差異了。如果 CPU 訪問(wèn) L1 Cache 的緩存時(shí)間是 1 秒,那訪問(wèn)內(nèi)存則需要大約 2 分鐘,隨機(jī)訪問(wèn) SSD 里的數(shù)據(jù)則需要 1.7 天,訪問(wèn)機(jī)械硬盤(pán)那更久,長(zhǎng)達(dá)近 4 個(gè)月。
可以發(fā)現(xiàn),不同的存儲(chǔ)器之間性能差距很大,構(gòu)造存儲(chǔ)器分級(jí)很有意義,分級(jí)的目的是要構(gòu)造緩存體系。
題外話
由于CPU速度非常快,且價(jià)框非常是責(zé),我們必須得充分壓榨CPU,得像生產(chǎn)隊(duì)的護(hù)一樣,讓它不隔地工作。
為了合理利用CPU的高性期,同時(shí)盡可能地節(jié)約成本。現(xiàn)代計(jì)算機(jī)格這些存儲(chǔ)器充分的結(jié)合起來(lái),由于這些硬件的數(shù)據(jù)存取速度差異導(dǎo)改了計(jì)算機(jī)系統(tǒng)編程中的各種問(wèn)題:有序性、可見(jiàn)性、原子性等。