《内存屏障(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带来的失效问题
- 引入读屏障,解决失效问题