cache的读写机制
CPU读Cache时:
●如果cache hit,则CPU直接从Cache中读取数据即可。
●如果cache miss,有两种处理方式:
> Read through,即直接从内存中读取数据;
> Read allocate,把目标地址所在的 cache line 从内存加载到 Cache,然后 CPU 从这个 cache line 中取得需要的数据
CPU写Cache时:
●如果cache hit:
根据是write-back还是write-through来具体操作:
> write-back:将数据更新到cache,并不更新到内存(DRAM),待后续flush cache时存入内存;
> write-through:数据同时会更新到cache和内存;
●如果cache miss:
根据是write-allocate或是write-no-allocate:
> write-allocate:将要写入的位置从内存读到cache,然后按照上述write hit继续操作;
> write-no-allocate:不会将要写入的数据从内存读到cache,直接将数据写的到内存(DRAM)
1. 读 Cache 策略对比
| 策略 | Cache miss 时怎么做 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|---|
| Read allocate | 从内存加载目标地址所在的 cache line 到 Cache,再从 Cache 读 | 利用空间局部性;后续访问附近数据可能 hit;普通程序性能好 | 可能污染 Cache;占用内存带宽;一次性访问时不划算 | 普通数据读取、数组遍历、结构体访问 |
| Read no-allocate / Cache bypass | 直接从内存或下一级 Cache 读,不放入当前 Cache | 避免 Cache 污染;节省 Cache 空间;适合大块流式读 | 后续再访问同一数据仍然 miss;不能利用局部性 | 一次性读取、大块 streaming、DMA/I/O 数据 |
2. 写 hit 策略对比
| 策略 | Cache hit 时怎么做 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|---|
| Write-back | 只更新 Cache,并把 cache line 标记为 dirty,之后再写回内存 | 写性能高;减少内存写流量;适合频繁修改同一数据 | 内存中数据可能不是最新;一致性维护复杂;dirty line 替换时成本高 | 通用 CPU、高性能系统、频繁写数据 |
| Write-through | 同时更新 Cache 和内存,或至少更新到下一级存储 | 内存数据较新;实现简单;一致性更容易处理 | 写流量大;频繁写时性能较差;通常需要 write buffer | 简单处理器、嵌入式系统、I/O 相关区域 |
3. 写 miss 策略对比
| 策略 | Cache miss 时怎么做 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|---|
| Write-allocate | 先从内存加载目标地址所在的 cache line 到 Cache,再执行写操作 | 写完后继续读/写容易 hit;适合有局部性的数据;常与 write-back 搭配 | 写 miss 代价高;需要先读整条 cache line;可能污染 Cache | 普通变量写入、数组更新、写后还会访问的数据 |
| Write-no-allocate / Write-around | 不加载进 Cache,直接写到内存或下一级 Cache | 避免 Cache 污染;省去读入 cache line 的开销;适合一次性写 | 写完后再读/改仍然 miss;不能利用写局部性 | 大块流式写、一次性 buffer 写入、I/O 输出 |

浙公网安备 33010602011771号