MESI问题

来源:2-1 案例环境初始化

YoooooooA

2018-03-22


老师,除了invaild状态的其他的三种都支持cpu的读请求,那么图中I状态上蓝线所指的不也支持cpu的本地的读请求吗?这个地方没想明白。。。😓

写回答

1回答

Jimin

2018-03-22

你好,这个图这样理解,比如当前处于M状态,他有一条 橙色 线,指向到S。橙色线代表的是remote read操作,因此总体就是 当前M状态时,如果发生remote read操作,会变成S状态。不知道这样解释你是否明白了?


顺便从整体上对这里做一下阐述:

在一个典型多核系统中,每个核心都会有自己的缓存,共享主存总线,每个相应的CPU会发出读写请求。

一个缓存除在Invalid状态外都可以满足cpu的读请求,一个invalid的缓存必须从主存中读取(变成S或者E状态)来满足该CPU的读请求。

一个写请求只有在该cpu缓存状态是M或者E状态时才能被执行

如果缓存处于S状态,必须先将其它缓存中该缓存行变成Invalid状态

可以随时将一个非M状态的缓存作废,或者变成Invalid状态,而一个M状态的缓存必须先被写回主存。

一个处于M状态的缓存必须时刻监听所有试图读该缓存相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S状态之前被延迟执行。

一个处于S状态的缓存也必须监听其它缓存使该缓存无效或者独享该缓存的请求,并将该缓存变成无效(Invalid)。

一个处于E状态的缓存也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S状态。

对于M和E状态而言总是精确的,他们在和真正状态是一致的。而S状态可能是非一致的,如果一个缓存将处于S状态的缓存作废了,而另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存的通知,同样由于缓存并没有保存该缓存行的copy的数量,因此即使有这种通知没有办法确定自己是否已经独享了该缓存行。

0
1
YoooooooA
也就是说cpu读取一个已经被invaild状态的缓存行时,是先去主存中请求最新的数据到缓存中,然后再从缓存中进行本地读取,且该缓存行的状态变为E或S根据的是其他的cpu缓存中是否也有该缓存行且不是invaild状态的,如果有就是S状态,如果没有也说明当前该cpu缓存独享,状态变为E。 老师,不知道这样去理解有没有错误的地方呢?
2018-03-22
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程