目錄
為什么需要 Cache?
🧱 Cache 的分層設計
🔹 Level 1 Cache(L1 Cache)一級緩存
🔹 Level 2 Cache(L2 Cache)二級緩存
🔹 Level 3 Cache(L3 Cache)三級緩存
?Cache 的運行機制
🔄 CPU 核心數量與 Cache 的關系
🔎 Cache 相關術語(Cache-related Terms)
🧠 引用的局部性( Locality of Reference)
1?? 時間局部性(Temporal Locality)
2?? 空間局部性(Spatial Locality)
?
為什么需要 Cache?
想象你在玩一個 100GB 的大型 3D 開放世界游戲,比如《賽博朋克 2077》或《原神》。
這個游戲包含:
-
成千上萬張地圖貼圖;
-
數百個角色模型;
你可能會想:
我們不能把所有代碼都放在主存里嗎??
從第一性原理看,這個問題非常自然。我們來分析一下背后的限制:
💡 為什么不能把整個游戲都放進主存?
原因一:主存容量有限
-
游戲是按需加載的,因為大部分內容你“當前并不會用到”。
-
比如你現在在城市區域,森林那部分地圖用不到,加載了反而浪費空間。
原因二:主存速度不夠快
-
CPU 執行速度以納秒為單位,而主存(通常是 DRAM)訪問延遲達幾十甚至上百納秒。
-
如果 CPU 每執行一條指令就等幾十納秒,那執行效率會非常低。
這就引出了我們今天的主角:
Cache(緩存):一種高速小容量的臨時存儲區域,用于存放“最近正在用”或“即將用到”的數據,讓 CPU 不用一直等主存。
🧱 Cache 的分層設計
💡從第一性原理出發:
我們知道,Cache 的設計目標是解決 CPU 和主存(DRAM)之間巨大的速度差。
元件 | 速度(延遲) |
---|---|
CPU(寄存器) | <1 ns |
L1 Cache | 1–2 ns |
L2 Cache | ~5 ns |
L3 Cache | 10–20 ns |
主存 DRAM | 50–100 ns |
你可以看到,主存的訪問時間是 L1 Cache 的幾十倍。為了縮小這個“速度鴻溝”,我們引入了多級緩存(Multilevel Cache Architecture):
🔹 Level 1 Cache(L1 Cache)一級緩存
-
位置:直接嵌入在 CPU 核心內部,與執行單元關系最緊密。
-
速度:最快,通常只有 1–2 個 CPU 時鐘周期的延遲。
-
大小:非常小(一般為 16KB–64KB),分為:
-
L1I(指令緩存,Instruction Cache)
-
L1D(數據緩存,Data Cache)
-
為什么分為 I/D?
從第一性原理看:
CPU 在執行程序時,“取指”和“取數據”是兩條并行路徑,如果混在一起會互相干擾。
?
🔹 Level 2 Cache(L2 Cache)二級緩存
-
?位置:仍在 CPU 核心附近,但通常不嵌入執行單元。
-
大小:較大(128KB–1MB),統一存儲指令和數據。
-
速度:比 L1 慢,但比主存快,通常延遲在 5–15 個周期之間。
功能:
彌補 L1 空間不足的問題,把 L1 Cache Miss 的數據“接住”。
?
🔹 Level 3 Cache(L3 Cache)三級緩存
-
位置:多個核心之間共享的緩存,不再是每個核心私有。
-
大小:大(2MB–幾十 MB)
-
?速度:相對較慢,但比主存快得多。
設計目的:
為多個核心之間的數據共享提供“中轉站”。
層級結構圖示(邏輯上):?
CPU Core/ | \L1I L1D -> L2\______/↓L3 (共享)↓Main Memory
層級 | 中文名 | 主要作用 | 特點 | 與 CPU 距離 |
---|---|---|---|---|
L1 Cache | 一級緩存 | 執行級加速,緊貼指令和數據 | 最小(16~64KB),最快(1ns) | 嵌在每個 CPU 核內部 |
L2 Cache | 二級緩存 | 銜接 L1 和 L3,擴大命中率 | 中等大小(256KB~1MB),速度快 | 通常也是每核私有 |
L3 Cache | 三級緩存 | 跨核心共享、減少主存訪問 | 最大(2MB~64MB),最慢但仍比 RAM 快 | 多核之間共享 |
這套結構就像一個數據“梯子”:
-
越靠近 CPU,越快,但越小;
-
越遠,越大,但越慢。
?
🧠 從第一性原理講:
?
越靠近 CPU 的緩存必須越小越快,以匹配 CPU 的指令節奏;而越遠的緩存可以稍慢,但容量要大些,用于存放更多數據。
?Cache 的運行機制
我們以 CPU 執行一條指令為例,看看 Cache 是怎么參與工作的:
步驟一:CPU 需要一個數據(比如變量 x)
CPU 發出一個“內存讀取請求”:我要取地址 0x1000 的值。
?
步驟二:先查 L1 Cache(一級緩存)
-
L1 是最小但最快的緩存(通常在 1ns 內響應)
-
CPU 立即在 L1 中查找這個地址。
?如果找到了,就叫 Cache Hit(命中)
直接讀取數據,立即返回!
如果沒有找到,就叫 Cache Miss(未命中)
進入下一層:查 L2。
?
步驟三:L1 Miss → 查 L2 Cache(二級緩存)
-
L2 比 L1 稍遠、稍大、稍慢(通常 5–15ns)。
-
如果在 L2 找到了 → 把數據送回 L1(便于下次快速訪問)。
?
步驟四:L2 Miss → 查 L3 Cache(三級緩存)
-
L3 是多核共享的,容量最大,速度較慢(10–20ns 或更高)。
-
如果找到了 → 同樣送回 L2 → 再寫進 L1 → 最后給 CPU 用。
?
步驟五:L3 也 Miss → 去 Main Memory(主存)
-
如果三層都沒命中,說明這塊數據根本沒在 Cache 中。
-
系統需要從主存(DRAM)加載數據(延遲可能高達 100ns)。
這就是最典型的 “緩存訪問路徑”:
CPU → L1 → L2 → L3 → 主存
?
🔄 CPU 核心數量與 Cache 的關系
現代 CPU 通常不是單核,而是 多核結構(Multicore CPU)。
-
Dual-core(雙核):2 個處理核心
-
Quad-core(四核):4 個處理核心
-
Octa-core(八核):8 個處理核心
這些術語表示CPU 中的處理核心數量。?
那這些核心如何共享和配置 Cache 呢?我們來詳細說說:
每個核心都擁有 自己的私有緩存(Private Cache)
緩存層級 | 分配方式 | 理由 |
---|---|---|
L1 Cache | 每個核心獨立擁有 | 距離近、快速訪問、不干擾其他核心 |
L2 Cache | 大多數情況下也是私有 | 幫助每個核心緩存更多數據,防止競爭沖突 |
多個核心 共享 L3 Cache(Shared Cache)
L3 Cache 通常被設計為多核心共享的一層高速緩存。
原因:
-
可以減少重復緩存:比如多個線程訪問同一個數據,不需要每個核心都復制一份。
-
提供跨核心通信的中轉站。
結構示意(以四核為例):
[Core1]--L1--L2
[Core2]--L1--L2
[Core3]--L1--L2
[Core4]--L1--L2\ | /↘ L3 Cache ↙↓Main Memory
這和 Cache 有什么關系?
每個核心通常有自己獨立的 L1、L2 Cache,而多個核心之間會共享 L3 Cache,如下:
[Core1] --> L1/L2 --\
[Core2] --> L1/L2 ---|--> 共享 L3 Cache
[Core3] --> L1/L2 --/
為什么這樣設計?
從第一性原理看:
每個核心有自己的“工作空間”,但也要能互相通信,所以共享 L3 是折中的辦法。
這一套緩存層級 + 多核架構,最終的目標只有一個:
讓 CPU 每時每刻都能有“足夠快”的數據可用,最大化它的執行效率。
🔎 Cache 相關術語(Cache-related Terms)
🏷? 1. Cache Hit(緩存命中)
當 CPU 需要某個數據,而該數據已經在 Cache 中,就稱為命中(Hit)。
🏷? 2. Cache Miss(緩存未命中)
數據不在 Cache 中,CPU 需要從更下層(比如主存)去取。
Miss 會帶來延遲,也叫 Miss Penalty(未命中懲罰)。
🏷? 3. Tag Directory(標記目錄)
每條 Cache 數據都會帶一個“Tag”,用于記錄該數據來自內存的哪個位置。
Cache 查詢時會通過比對 Tag 來判斷是否命中。
🏷? 4. 其他術語(補充說明):
🏷? Page Fault(頁錯誤)
-
當程序要訪問的數據既不在 Cache,也不在主存,而是在磁盤(比如換頁文件中),就會發生 Page Fault。
-
此時操作系統需要從磁盤中調入數據,成本極高。
🏷?Page Hit(頁命中)
-
數據在內存頁中已經存在,無需調入磁盤。
📌 注意:Page Fault / Page Hit 是虛擬內存管理里的概念,而不是 Cache 的,但它們也體現了內存的層級思想。
?
🧠 引用的局部性( Locality of Reference)
為什么 Cache 能提高性能?核心原理是:
程序訪問數據時是有“規律”的,而不是隨機的。
引用的局部性是指程序在訪問內存時,有集中訪問某些區域”的傾向。
就是說:程序不會隨便亂跳著訪問內存,它有“偏好”:
要么訪問同一塊地方(空間局部性),要么短時間反復訪問同樣的內容(時間局部性)。
引用局部性分兩種:
1?? 時間局部性(Temporal Locality)
如果某個數據剛剛被訪問過,很快還會再次被訪問。
舉例:
-
一個變量
x
被頻繁使用; -
一個循環不斷用到數組第0項;
-
函數剛被調用,馬上又調用一次。
2?? 空間局部性(Spatial Locality)
如果訪問了某個地址,很可能會接著訪問它“附近”的地址。
舉例:
-
遍歷數組時會依次訪問相鄰的內存單元;
-
連續的結構體或局部變量通常排在棧上連續的空間。
?
計算機為了加快訪問速度,就利用這個“局部性原理”,把近期訪問的數據(和它附近的數據)放到更快的緩存(Cache)里。
這樣,下次再訪問這些內容時就更快了。
?