当前位置: 首页 > 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.jsqmd.com/news/847558/

相关文章:

  • 2026年网店客服外包服务合规测评:综合响应能力排名 - 羊城派
  • 非常全面!全网最全 Kali Linux 安装步骤详解,新手照着操作零出错
  • 学习c语言第17天 循环语句while和getchar的应用
  • 【亲测门店】绍兴新昌、嵊州吊车租赁,实践分享哪家最靠谱
  • 3D打印聚乙烯醇/海藻酸钠(PVA/SA_打印水凝胶的应用
  • 告别混乱!手把手教你用Python整理RAF-DB人脸表情数据集(附完整代码)
  • Tina Linux音频开发全攻略:从ALSA驱动到GStreamer应用实战
  • 音乐格式转换困局:如何让网易云NCM文件在其他设备自由播放?
  • Prefill vs Decode 核心对比!!
  • 2026年京东客服外包公司排名前五专业深度测评权威发布! - 羊城派
  • GB28181实战:手把手教你用C#/Python调用设备信息查询接口(附完整代码)
  • 【医疗AI搜索权威报告】:Perplexity医院查询准确率仅68.3%——基于全国127家三甲医院POC实测
  • 被论文格式逼到崩溃?Paperxie 智能排版,一键搞定 4000 + 高校格式规范
  • Linux端口暴露审计排查方法
  • pyttsx3 完整使用说明:让Python开口说话
  • 号易一级代理注册方法公布:填写官方邀请码88000注册开通一级代理 - 流量卡代理招商
  • 自制2纳秒快速边沿脉冲发生器:高速电路设计与PCB布局实战
  • 2026年大流量店铺客服外包公司排名前五权威测评! - 羊城派
  • ARM服务器上跑老项目?手把手教你给Ubuntu 22.04装上缺失的libssl1.1
  • 2026年GEO优化实测对比:内容策略与搜索权重表现 - 羊城派
  • 别再只用videojs-contrib-hls了!2024年Vue3+Video.js播放m3u8的新姿势(附完整代码)
  • 2026最新复盘:多类目代运营服务商竞品差异化分析 - 羊城派
  • Ansible自动化管理Crontab:告别手动运维,实现定时任务即代码
  • 5MB超轻量中文字体:WenQuanYi Micro Hei 完整安装与优化指南
  • m4s-converter完整教程:B站缓存视频永久保存终极指南
  • 从功能到情感:如何将电路设计转化为有温度的创意表达
  • AI Agent 项目学习笔记(四):多轮对话与 ChatMemory 机制
  • 别再手动转格式了!用Python脚本批量把SolidWorks图纸转成STEP/PDF(附完整代码)
  • 2026年GEO优化合规测评:内容策略与排名表现 - 羊城派
  • 安装claude code+deepseek+vscode-windows