当我的程序执行具有获取语义的加载操作/具有释放语义的存储操作或可能是完整栅栏时,它会使 CPU 的缓存无效。
我的问题是:缓存的哪一部分实际上失效了?只有保存我使用的获取/释放变量的缓存行?或者整个缓存都失效了? (L1 + L2 + L3 ..等等?)。当我使用获取/释放语义或使用全栅栏时,这个主题有什么不同吗?
当您在没有围栏或互斥体的情况下执行加载时,加载的值可能来自任何地方,即缓存、寄存器(通过编译器优化)或 RAM...但从您的问题来看,您已经知道这一点。
在大多数互斥体实现中,当您获取互斥体时,始终会显式(例如 mfence、barrier 等)或隐式(例如用于锁定 x86 上总线的锁定前缀)应用栅栏。这会导致路径上所有缓存的缓存行失效。
请注意,整个缓存并未失效,只是内存位置的相应缓存行失效。这还包括互斥体的行(通常作为内存中的值实现)。
当然,有一些特定于体系结构的细节,但这就是它的一般工作方式。
另请注意,这并不是使缓存失效的唯一原因,因为一个 CPU 上的某些操作可能需要使另一 CPU 上的缓存失效。在谷歌上搜索“缓存一致性协议”将为您提供有关此主题的大量信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)