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

Cache Line读取数据原理笔记

CPU 会读取“包含当前访问地址的那一整条 Cache Line”。
这条 Cache Line 是按固定大小、固定边界对齐划分的。


假设 Cache Line 大小是64 Byte

内存不是这样按你访问的位置临时划分:

访问地址 ↓ [ 当前地址 ][ 后面 63 Byte ]

而是早就按 64 Byte 对齐切好了:

0x1000 ~ 0x103F 第 1 条 Cache Line 0x1040 ~ 0x107F 第 2 条 Cache Line 0x1080 ~ 0x10BF 第 3 条 Cache Line

所以,如果 CPU 访问:

地址 0x1010

它会把整条:

0x1000 ~ 0x103F

加载进 Cache。

这时相对于0x1010来说,确实既包含:

前面的地址:0x1000 ~ 0x100F 后面的地址:0x1011 ~ 0x103F

所以答案是:

如果访问地址在一条 Cache Line 中间,那么会同时把它前面和后面的数据都读进来。


核心规则:按对齐边界读取

对于 64 Byte 的 Cache Line:

Cache Line 起始地址 = 访问地址 & ~(64 - 1)

也就是把地址的低 6 位清零。

因为:

64 = 2^6

所以地址最低 6 位表示在 Cache Line 内部的偏移


例如:

访问地址:0x101C Cache Line 大小:64 Byte

那么:

0x101C 所在的 Cache Line 起始地址 = 0x1000 结束地址 = 0x103F

所以读取范围是:

0x1000 ~ 0x103F

不是:

0x101C ~ 0x105B

地址如何分配到 Cache 里?

一个内存地址通常被拆成三部分:

Tag | Index | Offset

以 64 Byte Cache Line 为例:

Offset = 6 bit

因为一条 Cache Line 内有 64 个字节,需要 6 位来定位其中某个字节。

含义如下:

部分作用
Offset选择 Cache Line 内的具体字节
Index决定放到 Cache 的哪一组
Tag判断 Cache 中的数据是不是目标内存块

举个简单例子。

假设:

Cache Line 大小 = 64 Byte Cache 一共有 128 组

那么:

Offset = 6 bit Index = 7 bit Tag = 剩下的高位

地址结构大概是:

高位 低位 [ Tag ][ Index ][ Offset ]

访问一个地址时,CPU 会:

1. 用 Index 找到 Cache 中对应的一组 2. 在这一组里比较 Tag 3. 如果 Tag 匹配,说明 Cache Hit 4. 如果不匹配,说明 Cache Miss 5. 从内存中读取包含该地址的整条 Cache Line 6. 放入 Index 指定的那一组

如果那一组已经满了怎么办?

如果是组相联 Cache,比如 4 路组相联:

Set 5: Way 0: 一条 Cache Line Way 1: 一条 Cache Line Way 2: 一条 Cache Line Way 3: 一条 Cache Line

如果这 4 个位置都满了,又有新的 Cache Line 要放进来,CPU 就要替换掉其中一个。

常见替换策略有:

LRU / 近似 LRU / 随机 / 伪随机

简单理解就是:

把最近不常用的一条 Cache Line 挤出去。


特殊情况:一次访问跨越两条 Cache Line

如果访问的数据刚好跨了 Cache Line 边界,就可能读取两条 Cache Line。

比如 Cache Line 是:

0x1000 ~ 0x103F 0x1040 ~ 0x107F

如果 CPU 要读取 8 Byte 数据,起始地址是:

0x103C

那么它需要的数据范围是:

0x103C ~ 0x1043

这个范围跨过了边界,所以可能需要加载:

0x1000 ~ 0x103F 0x1040 ~ 0x107F

也就是两条 Cache Line。


还要区分 Cache Line 读取和预取

正常的 Cache Miss 读取的是:

包含当前地址的那一条 Cache Line

但是现代 CPU 还有硬件预取器

如果 CPU 发现你在连续访问:

arr[0],arr[1],arr[2],arr[3]...

它可能提前把后面的 Cache Line 也读进来:

当前 Cache Line 下一条 Cache Line 再下一条 Cache Line

这叫prefetch,预取

所以:

Cache Line 读取:读取当前地址所在的那一整条 Cache Line 硬件预取:可能额外读取后面甚至附近的 Cache Line

一句话总结:

CPU 按 Cache Line 读取时,不是从当前物理地址开始往后读,而是读取当前地址所在的“对齐 Cache Line 区间”。所以如果当前地址在这条线中间,那么它前面的地址和后面的地址都会一起被读入 Cache。

http://www.zskr.cn/news/1323277.html

相关文章:

  • 别再只读高低电平了!用STM32的ADC优化你的灰度传感器巡线方案
  • 告别混乱!手把手教你用Python整理RAF-DB人脸表情数据集(附完整代码)
  • Tina Linux音频开发全攻略:从ALSA驱动到GStreamer应用实战
  • 2026年京东客服外包公司排名前五专业深度测评权威发布! - 羊城派
  • Arm-2D深度解析:如何用Cortex-M55的Helium指令集榨干2D图形性能?
  • Linux端口暴露审计排查方法
  • ARM服务器上跑老项目?手把手教你给Ubuntu 22.04装上缺失的libssl1.1
  • 自制2纳秒快速边沿脉冲发生器:高速电路设计与PCB布局实战
  • 碧蓝航线自动化脚本终极指南:如何用Alas彻底解放你的游戏时间
  • 2026年GEO优化实测对比:内容策略与搜索权重表现 - 羊城派
  • m4s-converter完整教程:B站缓存视频永久保存终极指南
  • 别再手动转格式了!用Python脚本批量把SolidWorks图纸转成STEP/PDF(附完整代码)
  • 创业方向指南:2026年AI Agent领域的黄金赛道
  • 树莓派Zero 2 W转4B扩展板:集成RS485与4G的物联网边缘节点方案
  • 基于CW32F030的BLDC电机控制:从国产MCU到完整评估方案
  • 用迭代法求多项式的导数
  • 【亲测门店】绍兴新昌、嵊州吊车租赁,实践分享哪家最靠谱
  • Python数据分析:用Pandas和Matplotlib实现数据可视化
  • 落日雁:12年电商代运营老兵的数据透明度实验 - 羊城派
  • FPGA开发中复杂IP核的高效应用:以SRIO为例的官方例程驱动法
  • 【备考高项】模拟预测题(五)论文及写作思路详解
  • 6.C# —— 类与对象、数据类型、方法详解
  • MCP 爆火后,AI 岗位突然分成两类:会接工具的人,和会用向量引擎的人
  • 为什么你的Perplexity搜不到关键函数?深度逆向其索引构建流程(含Docker调试实录)
  • 如何在2026年继续玩Flash游戏?终极Flash浏览器解决方案指南
  • Visual C++运行库合集:解决Windows程序依赖的终极方案
  • 20260519紫题训练总结 - Link
  • IDEA里Git冲突别慌!手把手教你用Rebase和Merge搞定,附代码消失急救指南
  • 5个简单步骤:如何用MPC Video Renderer让你的普通显示器也能播放HDR电影
  • CQUPT 2025级 数据科学与大数据技术英才班 周测#08