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