世界上最快的捷径,就是脚踏实地

每日一个知识点:性能杀手伪共享

每日一个知识点系列的目的是针对某一个知识点进行概括性总结,可在一分钟内完成知识点的阅读理解,此处不涉及详细的原理性解读,只作为一种抛砖引玉。真正的理解一定是你自我研究探索所收获的知识,加入组织带你一起进步成长。

共享变量

如果看过我前面文章的都知道,主内存中的共享变量会存储在CPU高速缓存= 》缓存条目=》缓存行中。

这里面有个点,就是缓存行才是存储数据的,但因为局部性原理,缓存行内的数据有可能不止有我们需要的共享变量比如X,在它的相邻的内存地址上有可能还有一个Y变量(就像数组中两个元素一样)。

伪共享

假设此时CPU1和CPU2 中相同缓存条目的缓存行内都存储了X和Y两个变量副本。如果CPU1中某个线程更新了共享变量X,此时CPU1会发出一个Invalidate消息到总线(MESI),使CPU2中包含了X的缓存条目被无效化。

此时CPU2的一个线程访问Y的时候,在高速缓存中发现缓存条目状态是无效话了,此时就属于缓存未命中,就需要从主内存从新加载数据。这种缓存共享的问题就叫做伪共享。

伪共享会导致缓存未命中,从而会降低处理器读、写操作的效率。

赞(1)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

世界上最快的捷径,就是脚踏实地

微信公众号:架构技术专栏