1、在L2或L3命中,就往上逐级复制填满到 L1,CPU 永远只吃 L1 的数据。(缓存全不命中 → 读物理内存 → 整行拉回 → 依次存入 L3、L2、L1 → CPU 从 L1 取数)
* L1 = 手边办公桌
* L2 = 隔壁书柜
* L3 = 公司大仓库
* 内存 = 城市图书馆
2、L1 / L2 / L3 的区别: 速度与容量的矛盾
L1(每核私有)
* 极小:64KB 左右
* 极快:1~2 个时钟周期
* 就在运算单元隔壁 缺点:做不大,做大就变慢、功耗爆炸
L2(每核私有)
* 中等:512KB~1MB
* 速度中等:十几周期
* 比 L1 慢,但比 L3 快 做折中:比 L1 大,比 L3 快
L3(所有核共享)
* 巨大:几十 MB
* 最慢:几十周期
* 所有核心共用,用来:
给各核做数据共享
缓存更大范围内存,减少往内存跑的次数
3、为什么不能只做一个「又大又快」的缓存?
物理上做不出来:
缓存越大,走线越长,延迟必然变大
越大越耗电、发热暴涨
全大缓存成本天价
4、缓存的数据类似一个带基地址的数组
缓存最小单位不是字节,是缓存行 Cache Line
ARM/Intel 现在标准都是:64 Byte 一行
每一条缓存行存两样东西:1. Tag:物理地址高位 2. Data:64 字节真实数据
CPU 缓存底层就是数组逻辑,根本不是哈希 Map、不是字典。