计算机组成与体系结构:缓存(Cache)

news2025/4/25 11:00:52

目录

为什么需要 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.coloradmin.cn/o/2342363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化?

Flutter 在全新 Platform 和 UI 线程合并后&#xff0c;出现了什么大坑和变化&#xff1f; 在两个月前&#xff0c;我们就聊过 3.29 上《Platform 和 UI 线程合并》的具体原因和实现方式&#xff0c;而事实上 Platform 和 UI 线程合并&#xff0c;确实为后续原生语言和 Dart 的…

stm32之GPIO函数详解和上机实验

目录 1.LED和蜂鸣器1.1 LED1.2 蜂鸣器 2.实验2.1 库函数&#xff1a;RCC和GPIO2.1.1 RCC函数1. RCC_AHBPeriphClockCmd2. RCC_APB2PeriphClockCmd3. RCC_APB1PeriphClockCmd 2.1.2 GPIO函数1. GPIO_DeInit2. GPIO_AFIODeInit3. GPIO_Init4. GPIO_StructInit5. GPIO_ReadInputDa…

用 PyQt5 和 asyncio 打造接口并发测试 GUI 工具

接口并发测试是测试工程师日常工作中的重要一环&#xff0c;而一个直观的 GUI 工具能有效提升工作效率和体验。本篇文章将带你用 PyQt5 和 asyncio 从零实现一个美观且功能实用的接口并发测试工具。 我们将实现以下功能&#xff1a; 请求方法选择器 添加了一个下拉框 QComboBo…

Qt实战之将自定义插件(minGW)显示到Qt Creator列表的方法

Qt以其强大的跨平台特性和丰富的功能&#xff0c;成为众多开发者构建图形用户界面&#xff08;GUI&#xff09;应用程序的首选框架。而在Qt开发的过程中&#xff0c;自定义插件能够极大地拓展应用程序的功能边界&#xff0c;让开发者实现各种独特的、个性化的交互效果。想象一下…

【Vue】TypeScript与Vue3集成

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. 前言2. 环境准备与基础搭建2.1. 安装 Node.js 与 npm/yarn/pnpm2.2. 创建 Vue3 TypeScript 项目2.2.1. 使用 Vue CLI2.2.2. 使用 Vite&#xff08;推荐&#xff09;2.2.3. 目录结构简述 3. Vue3 TS 基础语法整…

Linux之七大难命令(The Seven Difficult Commands of Linux)

Linux之七大难命令 、背景 作为Linux的初学者&#xff0c;肯定要先掌握高频使用的指令&#xff0c;这样才能让Linux的学习在短时间内事半功倍。但是&#xff0c;有些指令虽然功能强大&#xff0c;但因参数多而让初学者们很害怕&#xff0c;今天介绍Linux中高频使用&#xff0…

5.3.1 MvvmLight以及CommunityToolkit.Mvvm介绍

MvvmLight、CommunityToolkit.Mvvm是开源包,他们为实现 MVVM(Model-View-ViewModel)模式提供了一系列实用的特性和工具,能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。 本文介绍如下: 一、使用(旧)的MvvmLight库 其特点如下,要继承的基类是ViewModelBase;且使用…

Dbeaver 执行 SQL 语句和执行 SQL 脚本的区别

执行 SQL 语句 执行 SQL 语句对应图标&#xff1a; 适用于执行单个 SQL 的情形&#xff0c;默认是在光标处或选中的文本上执行 SQL 查询。 实际上同时选择多个 SQL 并通过该方式去执行也可能成功&#xff0c;只是有失败的风险。因此不建议使用它来同时执行多个 SQL 语句。 情况…

《Python3网络爬虫开发实战(第二版)》配套案例 spa6

Scrape | Moviehttps://spa6.scrape.center/ 请求影片列表api时&#xff0c;不仅有分页参数&#xff0c;还多了一个token&#xff0c;通过重发请求发现token有时间限制&#xff0c;所以得逆向token的生成代码。 通过xhr断点定位到接口请求位置 刷新页面或者点翻页按钮&#x…

Python基础语法:字面量,注释,关键字,标识符,变量和引用,程序执行的3大流程

目录 字面量&#xff08;数据的类型&#xff09; 字面量的含义 常见字面量类型&#xff08;6种&#xff09; 输出各类字面量&#xff08;print语句&#xff09; 注释&#xff08;单行和多行注释&#xff09; 注释的作用 单行注释和多行注释 单行注释&#xff08;ctrl/&a…

SPL 量化 获取数据

下载数据 我们将股票数据分享在百度网盘上供下载&#xff0c;每工作日更新。 目前可供下载的数据有 A 股的日 K 线数据、股票代码列表和上市公司的基本面数据 下载链接&#xff1a; 百度网盘 下载数据的文件格式为 btx&#xff0c;是 SPL 的特有二进制格式。 btx 称为集文…

Rust 学习笔记:安装 Rust

Rust 学习笔记&#xff1a;安装 Rust Rust 学习笔记&#xff1a;安装 Rust在 Windows 上安装 Rust命令行创建 Rust 项目在 Mac/Linux 上安装 Rust一些命令升级卸载cargo -hrustc -h 安装 RustRoverrust-analyzer Rust 学习笔记&#xff1a;安装 Rust 在 Windows 上安装 Rust …

编译 C++ 报错“找不到 g++ 编译器”的终极解决方案(含 Windows/Linux/macOS)

前言 在使用终端编译 C 程序时&#xff0c;报错&#xff1a; 或类似提示&#xff0c;意味着你的系统尚未正确安装或配置 g 编译器。本篇将从零手把手教你在 Windows / Linux / macOS 下安装并配置 g&#xff0c;适用于新手或 C 入门阶段的你。 什么是 g&#xff1f; g 是 GN…

html单页业务介绍源码

源码介绍 html单页业务介绍源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行 效果预览 源码免费获取 html单页业务介绍源码

单体OJ项目

单体项目版本、微服务版还需我再钻研钻研。 项目介绍 在系统前台&#xff0c;管理员可以创建、管理题目;用户可以自由搜索题目、阅读题目、编写并提交代码。 在系统后端&#xff0c;能够根据管理员设定的题目测试用例在代码沙箱 中对代码进行编译、运行、判断输出是否正确。 其…

豆包桌面版 1.47.4 可做浏览器,免安装绿色版

自己动手升级更新办法&#xff1a; 下载新版本后安装&#xff0c;把 C:\Users\用户名\AppData\Local\Doubao\Application 文件夹的文件&#xff0c;拷贝替换 DoubaoPortable\App\Doubao 文件夹的文件&#xff0c;就升级成功了。 再把安装的豆包彻底卸载就可以。 桌面版比网页版…

【MySQL】索引失效问题详解

目录 1. 最左前缀原则 2. 条件左边有函数或运算 3. 隐式类型转换 4. LIKE 模糊查询以 % 开头 5、MySQL 优化器选择全表扫描 ⭐对 in 关键字特别说明⭐ &#xff08;1&#xff09;列表太大时&#xff0c;走全表扫描了 &#xff08;2&#xff09;隐式类型转换 &#xff…

优选算法第十讲:字符串

优选算法第十讲&#xff1a;字符串 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 2.最长回文子串 3.二进制求和 4.字符串相乘

【扣子Coze 智能体案例四】五行八卦占卜智能体

目录 一、意图识别 二、时间格式转换 三、八字转换 四、八字提取 五、八字提取2 六、数据汇总 七、统计五行占比 八、雷达图生成 九、表格生成 十、AI占卜 十一、结束节点 一、意图识别 用户输入的信息包含各种时间格式的年月日时 用户输入的信息包含天干地支八字…

5.学习笔记-SpringMVC(P61-P70)

SpringMVC-SSM整合-接口测试 (1)业务层接口使用junit接口做测试 (2)表现层用postman做接口测试 (3)事务处理— 1&#xff09;在SpringConfig.java&#xff0c;开启注解&#xff0c;是事务驱动 2&#xff09;配置事务管理器&#xff08;因为事务管理器是要配置数据源对象&…