《内存屏障(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提升了性能,但是可能又带来了其他的问题,示例如下:

- cpu收到失效消息后放入了Invalid Queue
 - 此时读取b==0成立了
 - a的数据还没来得及处理,在cpu1中还不是失效状态。
 
四、读屏障
在这个时候,我们就要保障,cpu1在读取a的数据之前,先把a的数据在Invalid Queue中处理掉,然后再进行读取,这就是我们所说的读屏障的作用。
五、总结
我们本篇文章从原理角度,跟你说明了:
- Store Buffer因为要等待Invalid Ack会有性能瓶颈
 - 通过引入Invalid Queue解决Invalid Ack带来的性能瓶颈
 - Invalid Queue带来的失效问题
 - 引入读屏障,解决失效问题
 
                










