内存模型是怎么解决缓存一致性问题的?
本系列呢,主要将我理解的Java基础内容,以比较白话的方式,解释出来,希望能帮助大家快速的理解一些概念。
正文开始,解决缓存一致性问题,通常来说有以下两种方案:
-
通过总线加 LOCK锁的方式(早期)
-
通过缓存一致性协议(Cache Coherence Protocal)
一、缓存一致性协议
最出名的就是 Intel的 MESI协议,MESI协议保证了每个缓存中使用的共享变狼的副本是一致的。
核心思想是,当CPU写数据时,如果发现锁操作的变量时共享变量, 会发出信号通知其他CPU将该变量的缓存行置为无效状态。 因此当其他CPU读取变量时,发现缓存中的该变量缓存是无效的,那么将会从内存中重新读取。
在MESI协议中,每个缓存可能有4各状态:
-
M(Modified)
-
E(Exclusive)
-
S(Shared)
-
I(Invalid)
MESI协议可以保证缓存的一致性,但是无法保证实时性。
二、内存模型
-
缓存一致性(Cache Coherence): 解决是多个副本之间的数据的一致性问题。
-
内存一致性(Memory Consistency), 保证的是多线程访问内存时可以读到的什么值。
内存一致性,来解决并发编程中的原子性、有序性和一致性问题,包括(并发编程中的原子性、有序性和可见性)。而缓存一致性说的就是并发模型中的可见性。
实现内存一致性模型的时候可能会用到缓存一致性模型。