Skip to content

Latest commit

 

History

History
72 lines (21 loc) · 1.83 KB

File metadata and controls

72 lines (21 loc) · 1.83 KB

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