​​《内存屏障(Memory Barrier)(一)什么是写屏障?》​​《内存屏障(Memory Barrier)(二)什么是读屏障?》
《内存屏障(Memory Barrier)(三)volatile关键字是怎么实现的?》

目录

  • ​​一、Store Buffer的性能瓶颈​​
  • ​​二、Invalid Queue​​
  • ​​三、缓存失效​​
  • ​​四、读屏障​​
  • ​​五、总结​​


我们知道了写屏障的由来,下面我们说下读屏障

一、Store Buffer的性能瓶颈

我们在写屏障那篇文章中说了Store Buffer,但是如果Store Buffer满了,说明是在等待Invalidate Acknowledge,导致不能及时刷新到cache。

而cpu返回Invalidate Ack需要这样一个流程




cpu

invalid
cache line

返回Invalidate Ack


但是如果一个cpu非常忙,可能要等比较久才返回Invalidate Ack,此时为了提升性能就引入了Invalid Queue

二、Invalid Queue

Invalid Queue的作用就是:




先将Invalid消息放入
Invalid Queue

返回Invalid Ack

后续进行Invalid消息处理
并失效缓存行


三、缓存失效

加入了Invalid Queue提升了性能,但是可能又带来了其他的问题,示例如下:

内存屏障(Memory Barrier)(二)什么是读屏障?_内存屏障

  1. cpu收到失效消息后放入了Invalid Queue
  2. 此时读取b==0成立了
  3. a的数据还没来得及处理,在cpu1中还不是失效状态。

四、读屏障

在这个时候,我们就要保障,cpu1在读取a的数据之前,先把a的数据在Invalid Queue中处理掉,然后再进行读取,这就是我们所说的读屏障的作用

五、总结

我们本篇文章从原理角度,跟你说明了:

  • Store Buffer因为要等待Invalid Ack会有性能瓶颈
  • 通过引入Invalid Queue解决Invalid Ack带来的性能瓶颈
  • Invalid Queue带来的失效问题
  • 引入读屏障,解决失效问题