先想象中一個場景,大學期末準備考試了,你前去圖書館臨時抱佛腳。那麼,在看書的時候,我們的大腦會思考問題,也會記憶知識點,另外我們通常也會把常用的書放在自己的桌子上,當我們要找一本不常用的書,則會去圖書館的書架找。就是這麼一個小小的場景,已經把計算機的存儲結構基本都涵蓋了。
我們可以把 CPU 比喻成我們的大腦,大腦正在思考的東西,就好比 CPU 中的寄存器,處理速度是最快的,但是能存儲的資料也是最少的,畢竟我們也不能一下同時思考太多的事情,除非你練過。大腦中的記憶,就好比 CPU Cache,中文稱為 CPU 高速緩存,處理速度相比寄存器慢了一點,但是能存儲的資料也稍微多了一些。CPU Cache 通常會分為 L1、L2、L3 三層,其中 L1 Cache 通常分成「資料緩存」和「指令緩存」,L1 是距離 CPU 最近的,是以它比 L2、L3 的讀寫速度都快、存儲空間都小。我們大腦中短期記憶,就好比 L1 Cache,而長期記憶就好比 L2/L3 Cache。
說明:寄存器和 CPU Cache 都是在 CPU 内部,跟 CPU 挨着很近,是以它們的讀寫速度都相當的快,但是能存儲的資料很少。
當我們大腦記憶中沒有資料的時候,可以從書桌或書架上拿書來閱讀,那我們桌子上的書,就好比記憶體,我們雖然可以一伸手就可以拿到,但讀寫速度肯定遠慢于寄存器,那圖書館書架上的書,就好比硬碟,能存儲的資料非常大,但是讀寫速度相比記憶體差好幾個數量級,更别說跟寄存器的差距了。
從圖書館書架取書,把書放到桌子上,再閱讀書,我們大腦就會記憶知識點,然後再經過大腦思考,這一系列過程相當于,資料從硬碟加載到記憶體,再從記憶體加載到 CPU 的寄存器和 Cache 中,然後再通過 CPU 進行處理和計算。
對于存儲器,它的速度越快、能耗會越高、而且材料的成本也是越貴的,以至于速度快的存儲器的容量都比較小。
CPU 裡的寄存器和 Cache,是整個計算機存儲器中價格最貴的,雖然存儲空間很小,但是讀寫速度是極快的,而相對比較便宜的記憶體和硬碟,速度肯定比不上 CPU 内部的存儲器,但是能彌補存儲空間的不足。
1、寄存器
最靠近 CPU 的控制單元和邏輯計算單元的存儲器,就是寄存器了,它使用的材料速度也是最快的,是以價格也是最貴的,那麼數量不能很多。
存儲器的數量通常在幾十到幾百之間,每個寄存器可以用來存儲一定的位元組(byte)的資料。比如:
- 32 位 CPU 中大多數寄存器可以存儲
個位元組;4
- 64 位 CPU 中大多數寄存器可以存儲
個位元組。8
寄存器的通路速度非常快,一般要求在半個 CPU 時鐘周期内完成讀寫,CPU 時鐘周期跟 CPU 主頻息息相關,比如 2 GHz 主頻的 CPU,那麼它的時鐘周期就是 1/2G,也就是 0.5ns(納秒)。
CPU 處理一條指令的時候,除了讀寫寄存器,還需要解碼指令、控制指令執行和計算。如果寄存器的速度太慢,則會拉長指令的處理周期,進而給使用者的感覺,就是電腦「很慢」。
2、CPU Cache
CPU Cache 用的是一種叫 SRAM(Static Random-Access Memory,靜态随機存儲器) 的晶片。
SRAM 之是以叫「靜态」存儲器,是因為隻要有電,資料就可以保持存在,而一旦斷電,資料就會丢失了。
在 SRAM 裡面,一個 bit 的資料,通常需要 6 個半導體,是以 SRAM 的存儲密度不高,同樣的實體空間下,能存儲的資料是有限的,不過也因為 SRAM 的電路簡單,是以通路速度非常快。
CPU 的高速緩存,通常可以分為 L1、L2、L3 這樣的三層高速緩存,也稱為一級緩存、二級緩存、三級緩存。
L1 高速緩存
L1 高速緩存的通路速度幾乎和寄存器一樣快,通常隻需要
2~4
個時鐘周期,而大小在幾十 KB 到幾百 KB 不等。
每個 CPU 核心都有一塊屬于自己的 L1 高速緩存,指令和資料在 L1 是分開存放的,是以 L1 高速緩存通常分成指令緩存和資料緩存。
在 Linux 系統,我們可以通過這條指令,檢視 CPU 裡的 L1 Cache 「資料」緩存的容量大小:
$ cat /sys/devices/system/cpu/cpu0/cache/index0/size
32K
而檢視 L1 Cache 「指令」緩存的容量大小,則是:
$ cat /sys/devices/system/cpu/cpu0/cache/index1/size
32K
L2 高速緩存
L2 高速緩存同樣每個 CPU 核心都有,但是 L2 高速緩存位置比 L1 高速緩存距離 CPU 核心 更遠,它大小比 L1 高速緩存更大,CPU 型号不同大小也就不同,通常大小在幾百 KB 到幾 MB 不等,通路速度則更慢,速度在
10~20
個時鐘周期。
在 Linux 系統,我們可以通過這條指令,檢視 CPU 裡的 L2 Cache 的容量大小:
$ cat /sys/devices/system/cpu/cpu0/cache/index2/size
256K
L3 高速緩存
L3 高速緩存通常是多個 CPU 核心共用的,位置比 L2 高速緩存距離 CPU 核心 更遠,大小也會更大些,通常大小在幾 MB 到幾十 MB 不等,具體值根據 CPU 型号而定。
通路速度相對也比較慢一些,通路速度在
20~60
個時鐘周期。
在 Linux 系統,我們可以通過這條指令,檢視 CPU 裡的 L3 Cache 的容量大小:
$ cat /sys/devices/system/cpu/cpu0/cache/index3/size
3072K
3、記憶體
記憶體用的晶片和 CPU Cache 有所不同,它使用的是一種叫作 DRAM (Dynamic Random Access Memory,動态随機存取存儲器) 的晶片。
相比 SRAM,DRAM 的密度更高,功耗更低,有更大的容量,而且造價比 SRAM 晶片便宜很多。
DRAM 存儲一個 bit 資料,隻需要一個半導體和一個電容就能存儲,但是因為資料會被存儲在電容裡,電容會不斷漏電,是以需要「定時重新整理」電容,才能保證資料不會被丢失,這就是 DRAM 之是以被稱為「動态」存儲器的原因,隻有不斷重新整理,資料才能被存儲起來。
DRAM 的資料通路電路和重新整理電路都比 SRAM 更複雜,是以通路的速度會更慢,記憶體速度大概在
200~300
個 時鐘周期之間。