1 Star 0 Fork 1

程序员老陆/Java-Interview-Advanced

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
86.md 1.83 KB
一键复制 编辑 原始数据 按行查看 历史
“zhaoguanglu 提交于 5年前 . 面试资料

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消息在无效队列里,导致没法立马感知到过期的缓存,立马加载最新的数据

Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/zhao-guanglu/java-interview-advanced.git
git@gitee.com:zhao-guanglu/java-interview-advanced.git
zhao-guanglu
java-interview-advanced
Java-Interview-Advanced
master

搜索帮助