缓存行一致性和伪共享问题详解

首先,再解决之个问题之前,我们要弄清楚cpu多级缓存架构。
在这里插入图片描述
如图所示,内存与CPU之间存在三级缓存L1,L2,L3,三级缓存的目的就是为了解决寄存器和内存速度不匹配的问题。三级缓存是经过工业实践得出的结果。
计算机读取数据是按照局部性原理按块读取,读取内存中的数据,就是按照缓存行为单位,一般为64KB。
从图中我们可以看出多个核心的cpu每个核有相同的缓存数据。
举个例子,当我们第一个CPU中核1的x重新被写入了一个值,而核2中的值还是修改之前的值,当我们再去读数据就可能出现数据不一致的问题。
为了解决数据一直性问题 就引入了各种协议,在这里就给大家介绍比较常见的Intel的MESI协议,CPU中每个缓存行使用额外的两位(bit)来表示四种状态
MESI代表四种状态分别时Modified、Exclusive、Shared、Invalid
Modified状态表示:当前数据与主存中数据不一致,及被修改过而且该数据仅存于该CPU的缓存中,在某个时刻会写到主存中。
Exclusive(独享)状态表示:当前数据与主存中数据一致,但该缓存行只在当前CPU中,当被其他CPU读取该内存数据时变成共享状态(shared)
Shared(共享)状态:当前数据与主存数据一致,并且多个缓存行中缓存的数据也一致。
Invalid(无效)状态:在共享状态下,有一个CPU修改了在该CPU中的缓存行,其他CPU中的该缓存行作废成为Invalid状态。
当有读请求时,不是Invalid状态的缓存行都可以进行读操作,Invalid状态的缓存行必须从主存中读取数据变成S或者E状态来满足读请求。
当有写请求时,不允许不同的CPU同时修改同一个缓存行,只有在M或E状态下才会被执行。在S状态下会先将其他CPU中缓存行改为Invalid状态。


那什么是伪共享问题呢?


简单的说就是原本不相关的操作的数据,被加载的同一个缓存行中。当修改了其中一个操作的数据,导致当前缓存行失效。而另外操作的数据并没有进行更新所以不需要重新同步数据。但是由于伪共享导致缓存行失效。大大降低了缓存的性能。
解决缓存行的一个问题就是缓存行填充,将每一份数据占满一个缓存行,是一种空间换时间的做法
JDK8中,加上@Contended注解并加上JVM -XX:-RestrictContended

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值