caching - 如果使用具有直写策略的缓存,哪些 MESI 协议(protocol)状态是相关的?

标签 caching multiprocessing cpu-architecture cpu-cache mesi

我在阅读有关缓存一致性协议(protocol)的讲座的幻灯片时遇到了以下问题: 如果使用具有直写策略的缓存,哪些 MESI 状态是相关的?

也给出了答案:I(无效)S(Shared Unmodified)

我知道状态 M(修改后的独占) 不相关,因为具有直写策略的缓存无论如何都会将更改传播到主内存。

状态E(独家未修改)不相关,因为它仅在发生替换的独占读取未命中时发出(并与进一步的读取命中保持一致)。

有人可以解释给定的答案吗?

最佳答案

正如您所提到的,M 状态显然是无用的,因为您永远不会在缓存中保留修改后的数据。

至于独占状态:请记住,在某种意义上它比共享状态“更强”,因为在 WB 缓存中,它保证对该行的写入不需要首先获得所有权并使其他副本无效,并且相反,可以直接写入该行而不必离开本地缓存。换句话说,从 E 到 M 的转换很简单,而 S 到 M 更复杂,需要首先使所有其他复制无效。

另一方面,在 WT 缓存中,您已经可以保证没有其他人持有该行的修改版本,更重要的是 - 您没有在本地缓存中进行简单转换的好处(因为无论如何你都必须在外面写数据),所以真的不需要独占状态——拥有它你没有任何好处。事实上,您实际上可能会因此而失败,因为拥有 E 状态会迫使您向读取同一行的任何其他内核发送监听(E -> S 转换),

当然,在外面写东西时,你仍然需要使所有其他副本无效,但你不需要区分 E 和 S 来告诉你它们是否存在,通常有一个窥探过滤器或其他一些列表告诉您要窥探哪些内核。

关于caching - 如果使用具有直写策略的缓存,哪些 MESI 协议(protocol)状态是相关的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31761454/

相关文章:

tomcat - IE 11 忽略响应中的缓存控制 header

c# - 使用缓存机制进行节流有问题吗?

swift - 在 Swift 中将 Double 值类型转换为 Int64,位数为 13,但其运行的系统是 32 位系统,它会失败吗?

php - 如何使用 Laravel PHP 提高具有大量数据的动态 api 调用的性能

Python Nosetest 多处理在类/包级别启用和禁用

python - 在 multiprocessing.Pool 中设置每个进程的 niceness

python - 依赖于退出标志的清理 Python 多进程终止

x86 - 内存屏障的传递性/累积性属性是如何在微架构上实现的?

intel - 为什么 Intel Haswell XEON CPU 偶尔会错误计算 FFT 和 ART?

xcode - xcode sqlite3删除数据库错误