专栏名称: GoCN
最具规模和生命力的 Go 开发者社区
今天看啥  ›  专栏  ›  GoCN

以 Go 语言为例解释什么是伪共享以及如何解决

GoCN  · 公众号  ·  · 2024-07-05 14:38
    

文章预览

本文翻译自:What’s false sharing and how to solve it (using Golang as example) 译文 在解释 伪共享(false sharing) 之前,有必要简要介绍一下 CPU 架构中缓存是如何工作的。 CPU 缓存中的最小单位是 缓存行(cache line) (如今,CPU 中常见的缓存行大小为 64 字节)。因此,当 CPU 从内存读取一个变量时,它会同时读取该变量附近的所有变量。图 1 是一个简单的例子: 图 1 当 core1 从内存读取变量 a 时,它会同时将变量 b 读入缓存。(顺便说一句,我认为 CPU 从内存批量读取变量的主要原因是基于 空间局部性理论 :当 CPU 访问一个变量时,它可能很快就会读取旁边的变量。) 这种缓存架构存在一个问题:如果一个变量像图 2 那样存在于不同 CPU 核心的两个缓存行中: 图 2 当 core1 更新变量 a 时: 图 3 即使变量 b 没有被修改,它也会导致 core2 的缓存失效, ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览