缓存一致性协议是Java内存模型中的一种协议,具体如图所示:
缓存一致性协议(MESI)详解

缓存一致性协议分为四种状态:
  1. Modified(修改):数据有效,数据被修改了,和内存中数据不一致,数据只存在于本Cache中。
  2. Exclusive(独享):数据有效,数据和内存中的数据一致,数据只存在于本Cache中。
  3. Shared(共享):数据有效,数据和内存中的数据一致,数据存在多个Cache中。
  4. Invalid(无效):数据无效,一旦数据被标记为无效,那效果就等同于它从来没被加载到缓存中。
缓存一致性协议工作流程/原理:
  1. CPU a从缓存中读取了缓存行a,其他CPU都没有读,这时这条缓存行的状态为Exclusive(独享)状态。
  2. 这时CPU b也从缓存中读取了缓存行a,这时这条缓存行的状态为Shared(共享)状态。
  3. 当CPU a修改了缓存行a,并从回写到缓存中,这时这条缓存行的状态为Modified(修改)状态,然后会回写到主存中去。
  4. 每个CPU读取完缓存行之后都在内存中监听已读缓存行的状态,这时CPU b就会监听的缓存行a已被修改,此时,CPU b就会把他设置为Invalid(无效)状态,无效状态的数据会被丢弃,如果想继续操作的话,还需要到主存中重新获取。
  5. 最后,这条缓存行a在CPU a中的状态又会改为Exclusive(独享)状态。

关于Java的内存模型可以看这篇文章:https://blog.csdn.net/xianyun1992/article/details/107723694

如果N个CPU同一时间要去修改同一份缓存行会怎样?

这里会有一个裁决机制,系统自动裁决。

什么是缓存行?

最小存储单元,根据CPU品牌不同,有可能是32字节、64字节或者128字节。

相关文章: