1 Star 0 Fork 54

chenzhenguo / Java-Interview-Advanced

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
87.md 1.64 KB
一键复制 编辑 原始数据 按行查看 历史
leelovejava 提交于 2020-04-13 11:03 . 第三季 网络安全

87、内存屏障在硬件层面的实现原理以及如何解决各种问题

可见性问题:

Store屏障 + Load屏障

如果加了Store屏障之后,就会强制性要求你对一个写操作必须阻塞等待到其他的处理器返回invalidate ack之后,对数据加锁,然后修改数据到高速缓存中,必须在写数据之后,强制执行flush操作

他的效果,要求一个写操作必须刷到高速缓存(或者主内存),不能停留在写缓冲里

如果加了Load屏障之后,在从高速缓存中读取数据的时候,如果发现无效队列里有一个invalidate消息,此时会立马强制根据那个invalidate消息把自己本地高速缓存的数据,设置为I(过期),然后就可以强制从其他处理器的高速缓存中加载最新的值了

这就是refresh操作

为了解决有序性问题

内存屏障,Acquire屏障,Release屏障,但是都是由基础的StoreStore屏障,StoreLoad屏障,可以避免指令重排序的效果

StoreStore屏障,会强制让写数据的操作全部按照顺序写入写缓冲器里,他不会让你第一个写到写缓冲器里去,第二个写直接修改高速缓存了

resource = loadResource();

StoreStore屏障

loaded = true;

StoreLoad屏障,他会强制先将写缓冲器里的数据写入高速缓存中,接着读数据的时候强制清空无效队列,对里面的validate消息全部过期掉高速缓存中的条目,然后强制从主内存里重新加载数据

a = 1; // 强制要求必须直接写入高速缓存,不能停留在写缓冲器里,清空写缓冲器里的这条数据

int b = c;

Java
1
https://gitee.com/chenzhenguo/Java-Interview-Advanced.git
git@gitee.com:chenzhenguo/Java-Interview-Advanced.git
chenzhenguo
Java-Interview-Advanced
Java-Interview-Advanced
master

搜索帮助