高速缓存一致性协议MESI与内存屏障

Java57

CPU高速缓存机制的引入,主要是为了解决CPU越来越快的运行速度与相对较慢的主存访问速度的矛盾。CPU中的寄存器数量有限,在执行内存寻址指令时,经常需要从内存中读取指令所需的数据或是将寄存器中的数据写回内存。而CPU对内存的存取相对CPU自身的速度而言过于缓慢,在内存存取的过程中CPU只能等待,机器效率太低。

为此,设计者在CPU与内存之间引入了高速缓存。CPU中寄存器的存储容量小,访问速度极快;内存存储容量很大,但相对寄存器而言访问速度很慢。而高速缓存的存储大小和访问速度都介于二者之间,作为一个缓冲桥梁来填补寄存器与主存间访问速度过大的差异。

引入高速缓存后,CPU在需要访问主存中某一地址空间时,高速缓存会拦截所有对于内存的访问,并判断所需数据是否已经存在于高速缓存中。如果缓存命中,则直接将高速缓存中的数据交给CPU;如果缓存未命中,则进行常规的主存访问,获取数据交给CPU的同时也将数据存入高速缓存。 但由于高速缓存容量远小于内存,因此在高速缓存已满而又需要存入新的内存映射数据时,需要通过某种算法选出一个缓存单元调度出高速缓存,进行替换。

由于对内存中数据的访问具有局部性,使用高速缓存能够极大的提高CPU访问存储器的效率。

高速缓存与内存的一致性问题

高速缓存在命中时,意味着内存和高速缓存中拥有了同一份数据的两份拷贝。CPU在执行修改内存数据的指令时如果高速缓存命中,只会修改高速缓存中的数据,此时便出现了高速缓存与内存中数据不一致的问题。

这个不一致问题在早期单核CPU环境下似乎不是什么大问题,因为所有的内存操作都来自唯一的CPU。但即使是单核环境下,为了减轻CPU在I/O时的负载、提高I/O效率,先进的硬件设计都引入了DMA机制。DMA芯片在工作时会直接访问内存,如果高速缓存首先被CPU修改和内存不一致,就会出现DMA实际写回磁盘的内容和程序所需要写入的内容不一致的问题。

为了更好的理解多核CPU环境下工作的MESI协议,这里先简单介绍单核环境下 高速缓存被首先改写而导致cache与主存不一致问题的解决方案,简单来说有两种方法: 通写法回写法

通写法(Write Through):

即CPU在 对cache写入数据时,同时也直接写入主存,这样就能使得主存和cache中的数据始终保存一致。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长