当前位置: 首页 > article >正文

计算机组成与体系结构:缓存(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)里。

这样,下次再访问这些内容时就更快了。

 

相关文章:

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

目录 为什么需要 Cache&#xff1f; &#x1f9f1; Cache 的分层设计 &#x1f539; Level 1 Cache&#xff08;L1 Cache&#xff09;一级缓存 &#x1f539; Level 2 Cache&#xff08;L2 Cache&#xff09;二级缓存 &#x1f539; Level 3 Cache&#xff08;L3 Cache&am…...

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

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

开发 MCP Proxy(代理)也可以用 Solon AI MCP 哟!

MCP 有三种通讯方式&#xff1a; 通道说明备注stdio本地进程内通讯现有sse http远程 http 通讯现有streamable http远程 http 通讯&#xff08;MCP 官方刚通过决定&#xff0c;mcp-java-sdk 还没实现&#xff09; 也可以按两大类分&#xff1a; 本地进程间通讯远程通讯&…...

JetBrains GoLang IDE无限重置试用期,适用最新2025版

注意本文仅用于学习使用&#xff01;&#xff01;&#xff01; 本文在重置2024.3.5版本亲测有效&#xff0c;环境为window(mac下应该也一样奏效) 之前eval-reset插件只能在比较低的版本才能起作用。 总结起来就一句&#xff1a;卸载重装&#xff0c;额外要删掉旧安装文件和注册…...

python中socket(套接字)库详细解析

目录 1. 前言 2. socket 库基础 2.1 什么是 socket&#xff1f; 2.2 socket 的类型 3. 基于 TCP 的 socket 编程 3.1 TCP 服务器端代码示例 3.2 TCP 客户端代码示例 3.3 代码分析 4. 基于 UDP 的 socket 编程 4.1 UDP 服务器端代码示例 4.2 UDP 客户端代码示例 4.3…...

鸿蒙-状态管理V1和V2在ForEach循环渲染的表现

目录 前提遇到的问题换V2呗 状态管理V2已经出来好长时间了&#xff0c;移除GAP说明也有一段时间了&#xff0c;相信有一部分朋友已经开始着手从V1迁移到V2了&#xff0c;应该也踩了不少坑。 下面向大家分享一下我使用状态管理V1和Foreach时遇到的坑&#xff0c;以及状态管理V2在…...

深入了解递归、堆与栈:C#中的内存管理与函数调用

在编程中&#xff0c;理解如何有效地管理内存以及如何控制程序的执行流程是每个开发者必须掌握的基本概念。C#作为一种高级编程语言&#xff0c;其内存管理和函数调用机制包括递归、堆与栈。本文将详细讲解这三者的工作原理、用途以及它们在C#中的实现和应用。 1. 递归 (Recur…...

图论---Prim堆优化(稀疏图)

题目通常会提示数据范围&#xff1a; 若 V ≤ 500&#xff0c;两种方法均可&#xff08;朴素Prim更稳&#xff09;。 若 V ≤ 1e5&#xff0c;必须用优先队列Prim vector 存图。 #include <iostream> #include <vector> #include <queue> #include <…...

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…...

OpenHarmony Camera开发指导(四):相机会话管理(ArkTS)

概述 相机在使用预览、拍照、录像、获取元数据等功能前&#xff0c;都需要先创建相机会话。 相机会话Session的功能如下&#xff1a; 配置相机的输入流和输出流。 配置输入流即添加设备输入&#xff0c;通俗来讲即选择某一个摄像头进行拍照录像&#xff1b;配置输出流&#x…...

深入探索RAG(检索增强生成)模型的优化技巧

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4o-mini模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…...

Spring boot 中的IOC容器对Bean的管理

Spring Boot 中 IOC 容器对 Bean 的管理&#xff0c;涵盖从容器启动到 Bean 的生命周期管理的全流程。 步骤 1&#xff1a;理解 Spring Boot 的容器启动 Spring Boot 的 IOC 容器基于 ApplicationContext&#xff0c;在应用启动时自动初始化。 入口类&#xff1a;通过 SpringB…...

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…...

Spring Boot单元测试实战指南:从零到高效测试

在Spring Boot开发中&#xff0c;单元测试是保障代码质量的核心环节。本文将基于实际开发场景&#xff0c;手把手教你如何快速实现分层测试、模拟依赖、编写高效断言&#xff0c;并分享最佳实践&#xff01; 一、5分钟环境搭建 添加依赖 在pom.xml中引入spring-boot-starter-te…...

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…...

AWS 中国区 CloudFront SSL 证书到期更换实战指南

适用场景: AWS 中国区(宁夏区域 cn-northwest-1 或北京区域 cn-north-1)CloudFront 分配的 SSL 证书到期后无缝替换,域名主体为 domain.cn。 背景与痛点 当 CloudFront 使用的 SSL 证书即将到期时,需手动替换新证书以避免服务中断。由于 AWS 中国区 不支持 ACM 证书,必须…...

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

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

SPL 量化 获取数据

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

VMware与Docker:虚拟化技术的双轨演进与融合实践

一、虚拟化的本质与价值重构 虚拟化&#xff08;Virtualization&#xff09;是通过软件抽象层将物理资源转化为可动态分配的虚拟单元&#xff0c;其核心价值在于打破"一机一用"的刚性架构&#xff0c;实现三大突破性转变&#xff1a; 资源解耦&#xff1a;硬件资源…...

3. pandas笔记之:创建

以下是 Pandas 主要数据结构的创建方式整理&#xff0c;涵盖 Series 和 DataFrame 的常见创建方法&#xff1a; 一、Series 创建方式 从列表/数组创建 import pandas as pd import numpy as np# 基础列表 s1 pd.Series([1, 3, 5, np.nan, 6])# 指定索引 s2 pd.Series([10, …...

潞晨科技将暂停DeepSeek API服务,AI大模型技术红利普惠化与市场竞争白热化叠加,内卷恶果,开始显现!

潞晨科技宣布暂停DeepSeek API服务的事件,不仅暴露了AI大模型行业的技术与成本博弈,更折射出国内AI生态中中小企业的生存困境和行业内卷的深层矛盾。这一事件背后,既有企业个体商业模式的局限性,也揭示了整个行业在技术迭代、成本控制和市场策略上的系统性挑战。 一、潞晨科…...

某大型电解铝厂电解系统谐波治理装置改造沃伦森电气

电解铝行业谐波治理解决方案——无源滤波装置优化升级&#xff0c;保障稳定运行 在电解铝生产过程中&#xff0c;谐波污染问题严重影响电网电能质量&#xff0c;甚至可能导致滤波装置损坏&#xff0c;引发群爆事故。河南登封某大型电解铝厂通过无源滤波装置智能化改造&#xff…...

Rust 学习笔记:安装 Rust

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

精准落地设计,现代项目管理中的深度实践

在数字化转型浪潮席卷全球的当下&#xff0c;项目管理的复杂性呈指数级增长。无论是软件开发、大型工程建设&#xff0c;还是企业流程再造&#xff0c;都面临着设计理念与实际执行之间的鸿沟。《人月神话》第6章中关于确保体系结构师设计准确落地的论述&#xff0c;为破解这一难…...

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

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