計算機組成與體系結構:緩存(Cache)

目錄

為什么需要 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 Cache1–2 ns
L2 Cache~5 ns
L3 Cache10–20 ns
主存 DRAM50–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)里。

這樣,下次再訪問這些內容時就更快了。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902509.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902509.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902509.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTTP測試智能化升級:動態變量管理實戰與效能躍遷

在Web應用、API接口測試等領域&#xff0c;測試場景的動態性和復雜性對測試數據的靈活管理提出了極高要求。傳統的靜態測試數據難以滿足多用戶并發、參數化請求及響應內容驗證等需求。例如&#xff0c;在電商系統性能測試中&#xff0c;若無法動態生成用戶ID、訂單號或實時提取…

tomcat 的安裝與啟動

文章目錄 tomcat 服務器安裝啟動本地Tomcat服務器 tomcat 服務器安裝 https://tomcat.apache.org/下載 Tomcat 10.0.X 啟動本地Tomcat服務器 進入 Tomcat 的 bin

TCP三次握手與四次揮手面試回答版本

面試官&#xff1a;說一下TCP三次握手的過程 參考面試回答&#xff1a; 在第一次握手的時候、客戶端會隨機生成初始化序號、放到TCP報文頭部的序號字段中、同時把SYN標志設置為1 這樣就表示SYN報文&#xff08;這里是請求報文&#xff09;。客戶端將報文放入 TCP 報文首部的序…

AIGC產品如何平衡用戶體驗與內容安全?

當ChatGPT能寫詩、Sora會拍電影、AI主播24小時帶貨時&#xff0c;一場關于“AI說什么”的隱形戰爭&#xff0c;正在算法與監管的夾縫中悄然爆發。 從DeepSeek的沖擊到多模態技術的祛魅&#xff0c;AIGC正在重塑內容創作的邊界。但同時&#xff0c;諸多質疑也正在發聲&#xff…

安卓垂直進度條

package 你的包名;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; import android.view.MotionEvent; import android…

hackmyvm-airbind

收集信息 arp-scan -l nmap -sS -v 192.168.195.162 訪問掃描到的ip&#xff0c;直接跳轉到登錄頁面&#xff0c;利用admin/admin弱口令登錄 在settings.php中找到一處文件上傳&#xff0c;上傳一句話木馬&#xff0c;上傳成功 反彈shell 上傳php-reverse-shell.php 抓包&am…

【Rust 精進之路之第14篇-結構體 Struct】定義、實例化與方法:封裝數據與行為

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025-04-20 引言:超越元組,給數據賦予意義 在之前的學習中,我們了解了 Rust 的基本數據類型(標量)以及兩種基礎的復合類型:元組 (Tuple) 和數組 (Array)。元組允許我們將不同類型的值組合…

jenkins尾隨命令

在訪問jenkins的網址后面可以追加命令&#xff0c;比如訪問地址是 http://10.20.0.124:8080/&#xff0c;常用的有以下幾種方式&#xff1a; 1.關閉Jenkins 只要瀏覽器輸入http://10.20.0.124:8080/exit即可退出&#xff0c;或者http://localhost:8080/exit 2.重啟Jenkins …

相機模型--CMOS和CCD的區別

1--CMOS和CCD的工作原理 CCD&#xff08;Charge Coupled Device&#xff0c;電荷耦合器件&#xff09;&#xff1a; 1. 圖像通過光電效應在感光單元中轉化為電荷&#xff1b; 2. 每個像素上的電荷被依次“耦合”并傳輸到芯片的角落&#xff0c;通過一個或幾個模擬輸出放大器輸…

二叉樹理論基礎

二叉樹種類 滿二叉樹&#xff1a;每個非葉子節點都有且只有兩個子節點。 和完全二叉樹&#xff1a;除了最底層外&#xff0c;其他各層都是滿的&#xff1b;最底層的節點都集中在左側。 二叉搜索樹&#xff1a;對于任意節點 u&#xff0c;左子樹上所有節 點的值都小于 u.val…

使用ZYNQ芯片和LVGL框架實現用戶高刷新UI設計系列教程(第九講)

這一期講解GUI_guider中的容器控件的使用以及相關函數&#xff0c;容器本質上是具有布局和自動調整大小功能的基本對象 &#xff0c;通常用來裝載其他子控件。 打開上一期的項目&#xff0c;在工具欄中選中容器控件拖拽到界面中&#xff0c;具體如圖所示&#xff1a; 容器默認…

qt QGroupButton 實現兩個QPushButton的互斥

import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QButtonGroup, QVBoxLayoutclass ExampleApp(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 創建兩個 QPushButtonself.button1 QPushButton("按鈕1&quo…

工業物聯網的可視化編程革新:Node-RED與邊緣計算的深度融合-縱橫智控

在工業物聯網的演進歷程中&#xff0c;可視化編程工具正成為打破技術壁壘的核心力量。Node-RED作為開源的可視化編程平臺&#xff0c;通過其獨特的拖拽式邏輯構建能力&#xff0c;為設備連接、數據處理與業務邏輯設計提供了全新范式。本文將深入解析Node-RED的技術優勢&#xf…

Uniapp:view容器(容器布局)

目錄 一、基本概述二、屬性說明三、常用布局3.1 橫向布局3.2 縱向布局3.3 更多布局3.3.1 縱向布局-自動寬度3.3.2 縱向布局-固定寬度3.3.3 橫向布局-自動寬度3.3.4 橫向布局-居中3.3.5 橫向布局-居右3.3.6 橫向布局-平均分布3.3.7 橫向布局-兩端對齊3.3.8 橫向布局-自動填充3.3…

(最新)華為 2026 屆校招實習-硬件技術工程師-硬件通用/單板開發—機試題—(共14套)(每套四十題)

&#xff08;最新&#xff09;華為 2026 屆校招實習-硬件技術工程師-硬件通用/單板開發—機試題—&#xff08;共14套&#xff09;&#xff08;每套四十題&#xff09; 本套題目為硬件通用題目&#xff0c;適合多個崗位方向&#xff0c;如下 **崗位——硬件技術工程師 崗位意向…

AWS Lambda 架構深入探究

AWS Lambda 是現代云架構中最受歡迎的服務之一,因其能夠在完全托管的無服務器環境中運行代碼而廣受認可。然而,盡管 Lambda 廣受歡迎,許多開發者和架構師對它的底層運作機制卻知之甚少,常常將其視為“編寫能夠在云端神奇運行的代碼”的簡單方法。 本文將探討 AWS Lambda 背…

Android audio系統五 AudioPolicy 策略配置詳解

引用&#xff1a;Android 音頻策略配置文件解析流程 audio_policy_configuration.xml 是 Android 音頻系統的核心配置文件&#xff0c;它定義了音頻硬件接口、設備路由和基本策略。下面我將詳細介紹這個文件的結構、關鍵配置項和實際應用。audio_policy_configuration.xml 是 …

4.21日學習--引用

引用本質&#xff1a;引用的本質在 c 內部實現是一個指針常量。 代碼中 int& ref a; 可以理解為 int* const ref &a;&#xff08;指針常量&#xff09;。 指針常量&#xff1a;指針指向不可變&#xff08;綁定 a 后&#xff0c;不能再指向其他變量&#xff09;&…

2.1 數據處理

1. 數據獲取方法 掌握公開數據集的使用、數據質量評估指標、了解常見的網絡爬蟲技術 &#x1f9e9; 一、公開數據集的使用 ? 常見平臺&#xff08;一定要熟&#xff09; 平臺簡介示例數據集Hugging Face Datasets專注 NLP、CV 領域的大模型訓練數據集庫IMDB、SQuAD、Common …

Qt QWidget和QML實現窗口拖動源碼分享

一、QWidget實現窗口拖動 .hpp QPoint pressedPoint; bool leftBtnPressed false;.cpp bool PetWidget::eventFilter(QObject *obj, QEvent *event) {if(obj this){if(event->type() QEvent::MouseButtonPress){QMouseEvent* e static_cast<QMouseEvent *>(event)…