这是图解系列之CPU cache基本原理
关注阅读更多图解
对内存管理还不太清楚的可以先看看我之前关于MMU的文章。
早期的CPU没有Cache,随着CPU频率的提高,主内存跟不上CPU的频率,CPU需要等待主存,所以 Cache 的出现了,它是解决CPU和内存之间的频率不匹配的问题。
缓存级别越小,越接近CPU,意味着速度越快,容量越小。
下面是一种典型的Cache分布图,每个CPU核独享L1和L2 Cache,一个CPU封装内的核共享L3 Cache。
当CPU读写内存时,首先获取L1 Cache中的数据,如果没有,则再去L2 Cache中找,依次类推,如果Cache中不存在,就去主内存中找,路径越长,时间越长。
Cache的组织结构
Cache的组织形式是:把Cache划分成多个Set,每个Set中有多路Cacheline。
Cacheline中包含valid、tag和data,valid和tag会在查找Cacheline时用到,data是真正缓存的内存数据。
1 直接映射,每个Set只有一个Cacheline。
2 组相联,多个Set,每个Set有多个Cacheline。
3 全相联,只有一个Set,所有Cacheline都在这个Set中。
其中组相联中有一个Way的概念,用来表示一个Set中Cacheline的数量。
例如一个Set中有4个Cacheline的话,就叫4路组相联( 4-way set associative)。
Cache的查找方式
CPU发出虚拟地址后,会在Cache中查找该地址对应的内存数据。
地址被分成了3段:
offset是表示该内存数据在Cacheline中data中的offset。
index是用来定位Set的。
tag是和Cacheline中的tag做匹配的。
这里:
offset的位数和一条Cacheline内数据长度对应。
index的位数和set的数量对应。
首先根据index来查找到对应的Set。
然后根据tag去和Set中每条Cacheline做比较。
最后根据offset在Cacheline的data中找到对应的数据。
Cache控制器查找Cacheline时,可以根据物理地址,也可以根据虚拟地址,也可以物理和虚拟地址相结合的查找。
1. VIVT,index和tag都取自虚拟地址。
CPU发出虚拟地址后,Cache控制器直接把虚拟地址分三段,去匹配Cacheline。如果 cache miss,则通过MMU进行虚实转换load内存到Cacheline,此时cache hit。
2. PIPT,index和tag都取自物理地址。
CPU发出虚拟地址后,经过MMU转换为物理地址。Cache控制器把物理地址分三段,去匹配Cacheline。如果 cache miss,则load内存到Cacheline,此时cache hit。
3. VIPT,index取自虚拟地址,tag取自物理地址。
CPU发出虚拟地址后,Cache控制器在虚拟地址中取index,通过MMU进行虚实转换后取tag,然后去匹配Cacheline,如果cache miss则load内存到Cacheline,此时cache hit。
4. PIVT,index取自物理地址,tag取自虚拟地址。
这是图解系列之CPU cache基本原理
关于一致性以及别名和歧义
将在后面的文章中介绍
关注阅读更多图解
重要的事:Cloud3今后会陆续出些图解系列的文章,这系列文章中如果发现有错误,可以在留言中指出。对于指出的逻辑错误,Cloud3会给予红包感谢。当然错别字就算了,你会把我搞破产的。