2 Star 65 Fork 54

柳诗妍 / Java-Interview-Advanced

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

86、硬件层面的MESI协议为何会引发有序性和可见性的问题?

MESI协议在硬件层面的原理其实大家都已经了解的很清晰了,对不对

可见性和有序性的问题

可见性:写缓冲器和无效队列导致的,写数据不一定立马写入自己的高速缓存(或者主内存),是因为可能写入了写缓冲器;读数据不一定立马从别人的高速缓存(或者主内存)刷新最新的值过来,invalidate消息在无效队列里面

有序性:

(1)StoreLoad重排序

int a = 0;

int c = 1;

线程1:

a = 1;

int b = c;

这个很简单吧,第一个是Store,第二个是Load。但是可能处理器对store操作先写入了写缓冲器,此时这个写操作相当于没执行,然后就执行了第二行代码,第二行代码的b是局部变量,那这个操作等于是读取a的值,是load操作

这就导致好像第二行代码的load先执行了,第一行代码的store后执行

第一个store操作写到写缓冲器里去了,导致其他的线程是读不到的,看不到的,好像是第一个写操作没执行一样;第二个load操作成功的执行了

StoreLoad重排,Store先执行,Load后执行;Load先执行,Store后执行

(2)StoreStore重排序

resource = loadResource();

loaded = true;

两个写操作,但是可能第一个写操作写入了写缓冲器,然后第二个写操作是直接修改的高速缓存,这个时候不就导致了两个写操作顺序颠倒了?

诸如此类的重排序,都可能会因为MESI的机制发生

可见性问题也是一样的,写入写缓冲器之后,没刷入高速缓存,导致别人读不到;读数据的时候,可能invalidate消息在无效队列里,导致没法立马感知到过期的缓存,立马加载最新的数据

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

搜索帮助