学习了下马士兵老师的公开课,特此做下笔记,以供交流学习。
缓存一致性协议和 java 的 volatile 实现无任何关系
MESI 只是 CPU 层级的保证一致性的一种方式,最简单粗暴保证 CPU 一致性的其实就是直接锁总线,因为总线只有一条!
而 JVM 的 hotspot 就是直接锁总线,确保了 volatile 作用.
所以二者毫无关系!!!
因为因特尔的用的比较多,所以网上文章写的都是
1 英特尔的 MESI 协议
保证 cpu 间数据一致性。
cache line的概念 缓存行对齐 伪共享
a. cache是以cache line为单位与内存映射的,cache只要命中了就是命中64字节,对应内存中连续的64个地址,这64个地址刚好对应了地址的低6位。所以这6位被划为一个段。
b. cache分为了64组,要有hash方式确定内存中的地址在哪个cache组,可以用36位地址中的高30位模64得到组索引,模64和和取高30位中的低6位得到的结果是相同的。所以这6位就是另一个段。
c. 因为内存大小远远大于cache,内存和cache的映射必然是多对一(即多个内存映射到一块cache),这样必然会产生冲突,36位地址的高24位就是用来解决冲突问题的,所以这24位就是一个段
2 CPU 的乱序执行
mesi只是个协议,cpu可能基于性能考虑只实现了“最终一致性”,而没有实现“强一致性”。lock指令是告诉cpu执行这段代码时你要给我放弃性能保证强一致性。您可以搜索关键词Store Buffer和Invalid Queue一看便知