文章目录
引语
本文是 CPU Cache 相关知识的中篇,上篇中介绍 CPU Cache 的基础概念和三种映射方式,本文会介绍高速缓存不命中(即 Cache Miss )和 Cache Line 的替换策略,将会涉及到到上文相关知识。
上文:CPU Cache 知识详解之基础概念与映射方式(上)
Cache Miss(缓存未命中)
当查找的数据不在高速缓存中或在但是不可用(有效位为0)
主要有三种 Compulsory Miss(Cold Miss) 强制性未命中, Conflict Miss 冲突性未命中,Capacity Miss 容量性未命中
Compulsory Miss(Cold Miss)强制性未命中
即在程序刚刚启动的时候,数据都是不在缓存中的,所以第一次访问数据必定发生 Miss ,这是不可避免的,由于该 Miss 发生在程序第一次读取数据中,所以也叫 Cold Miss,冷缺失
Conflict Miss 冲突性未命中
该 Miss 是由于**不同的内存块映射到同一个 Cache Set **导致的
这里的映射方式我拿直接映射举例,如图所示主存中地址 0 和 4 都映射到了同一个 Cache Set 1 中,注意是同一个 Cache Set ,只是由于直接映射导致看起来像映射到 Cache Line 导致的,这种 Miss 发生在直接映射和组相联中,因为只有这两类映射方式才具有多个 Cache Set ,而全相联只有一个 Cache Set (当然要说全相联全都映射到该 Cache Set 所以也有 Conflict Miss,这也没问题,重点理解概念即可)
该 Miss 是可以避免并且也应该避免的,因为仍然有空闲的空间可以存放数据
Capacity Miss 容量性未命中
该 Miss 是由于程序运行所需的 Set 的数量要大于缓存的 Set 的数量,导致不能把所有数据都装入缓存中,同样我们以直接映射来举例
假设程序需要读入地址 0 到 5 的数据,缓存中只有 4 个 Cache Set ,所以必然会导致 Miss ,所以这种 Miss 也是不好避免的
其他的 Miss 种类
在查阅资料的过程中,笔者发现除以上几种 Miss 外还存在一些 Miss,由于涉及的资料较少,加之笔者的能力有限,这里不过多讲述(读者若有了解的评论中说明)
Coherence Miss
It is also known as Invalidation. These misses occur when other external processors, i.e., I/O updates memory.
由于只查询到这句解释,个人理解是由于其他的 IO 读主存中数据进行修改,导致缓存中数据不可用引发的 Miss
Communication Miss
笔者在某个视频中得知该名词,没有找到任何资料
行替换策略(算法)
出现 Miss 后,就需要在下一级的内存中读取数据,那么就有可能涉及 Cache Line 的替换,就涉及到了 CPU Cache 中的替换策略;由于替换策略不是我们可以随意更改的,并且这里介绍的算法都是一些十分通用的算法,在操作系统,Redis 等中都有应用,网上资料相对丰富,所以这部分不会详细介绍算法流程,读者了解到高速缓存存在哪些替换策略即可
首先由于直接映射中每个地址映射到缓存中的位置都是唯一的,所以从下一级的内存中读取内存块到缓存中的策略就是直接替换
而组相联和全相联中一个内存块被映射到哪个 Cache Line 是不确定的,所以才存在替换策略将缓存中的一些 Cache Line 替换出去
最不常使用(Least-Frequently-Used, LFU)
该策略会替换在过去某个时间窗口内引用次数最少的那一行。容易把新加入的块替换掉,且容易让前期频繁访问,后期较少访问的块长期驻留。
最近最少使用(LeastRecently-Used, LRU)
策略会替换最后一次访问时间最久远的那一行。有较高命中率。
随机替换
随机选择一个 Cache Line 替换出去。随机替换算法在硬件上容易实现,且速度也比前两种算法快。缺点则是降低了命中率和Cache工作效率。