Read the fucking source code!
--By 鲁迅A picture is worth a thousand words.
--By 高尔基说明:
先来看一下经典的存储器层次结构图:
以ARMv8的CPU架构为例:
接下来让我们对cache一探究竟。
先看一下cache的内部结构图:
cache line
:cache按行来组织,它是访问cache的最小单位,通常为16、32、64或128字节,cache line
的大小通常在架构设计阶段确定;64-bit address
:CPU访问cache的地址编码,分成三部分:Tag
、Index
、Offset
;Index
:地址编码中的index域,用于索引cache line
;Offset
:地址编码中的offset域,cache line
中的偏移量,可按word
和byte
来寻址;Tag
:Tag
在cache中占用实际的物理空间,用于存储缓存地址的高位部分,通过与地址编码中的Tag
域进行比较来确定是否cache hit
;Way
:cache分成大小相同的子块,每个子块以相同的方式进行索引;Set
:所有Way
中相同的索引对应的cache line
组成的集合;直接映射的方式如下:
index域
相同的地址,都会映射到cache中的同一行上;0x00,0x40,0x80
三个地址会映射到cache的第一行,而同一时刻只能允许1行;cache thrashing
(颠簸)问题;组相连的映射方式如下:
全相连的映射方式如下:
index域
,全相连缓存相当是N路集中的所有缓存行,因此需要大量的比较器;Read allocation(RA)
当读操作cache miss
时默认进行分配cache line
;
Write allocation(WA)
当写操作cache miss
时,会触发一个burst读,通过读的方式来分配cache line
,然后再将数据写入cache;
Write-back(WB)
WB方式下,数据只写入cache,并标记为dirty,当cache line
被换出或者显式的clean操作才会更新到外部内存中,如下图:
Write-through(WT)
WT方式下,数据同时写入cache和外部内存,不会将cache line
标记为dirty,如下图:
先来看看cache中的重名(aliasing
)问题和同名(homonyms
)问题:
aliasing
:多个不同的虚拟地址可能映射到相同的物理地址;homonyms
:相同的虚拟地址映射到不同的物理地址;invalidate
操作;VIVT
(Virtually-Indexed Virtually-Tagged
)Tag域
和Index域
进行判断是否hit;flush
和invalidate
操作,导致性能下降;PIPT
(Physically-Indexed Physically-Tagged
)Tag域
和Index域
进行判断是否hit;VIPT
(Virtually-Indexed Physically-Tagged
)Index域
和物理地址的Tag域
进行判断是否cache hit;Tag域
(物理Tag唯一),能有效的避免同名问题;先来看问题的引入:
snooping protocol
)来维护cache的一致性;MESI协议的名字来源于cache line的四个状态:
Modified(M)
:cache line数据有效,cache line数据被修改,与内存中的数据不一致,修改的数据只存在本cache中;Exclusive(E)
:cache line数据有效,cache line数据和内存中一致,数据只存在本cache中;Shared(S)
:cache line数据有效,cache line数据和内存中一致,数据存在于多个cache中;Invalid(I)
:cache line数据无效;状态说明如下:
MESI协议在总线上的操作分为两大类:CPU请求和总线请求,如下图:
MESI协议中涉及到各个状态的转换:
当多个cpu访问同一个cache line中的不同数据时,根据MESI协议,容易造成cache的伪共享问题,解决方式是让多线程操作的数据处在不同的cache line中。
收工了。
《 ARM Cortex-A Series Programmer's Guide for ARMv8-A》
《ARMv8-A CPU Architecture Overview》
《奔跑吧Linux内核》
Lecture 8. Memory Hierarchy Design II
TEACHING THE CACHE MEMORY COHERENCE WITH THE MESI PROTOCOL SIMULATOR
Cache组织方式
如果对你有用的话,在看,分享,打赏三连吧,谢谢。