内核同步中的缓存效应、伪共享与无锁编程
1. 缓存效应与伪共享
现代处理器采用多级并行缓存内存,以显著提升内存操作速度。当软件请求读取某个地址的一个字节时,CPU 实际上会从该起始地址读取一整个缓存行(通常为 64 字节)的数据到各级 CPU 缓存(如 L1、L2 和 L3)中。后续访问连续内存中的元素时,会先在缓存中查找,若命中则能大幅提升速度。因为访问 CPU 缓存通常只需 1 到几个纳秒,而访问 RAM 则需要 50 到 100 纳秒。
软件开发人员会利用这些特性,采取以下做法:
- 将数据结构的重要成员放在一起(最好在同一个缓存行内),并置于结构顶部。
- 对结构成员进行填充,避免跨越缓存行。
然而,这也存在风险。例如,声明两个相邻的变量 u16 ax = 1, bx = 2; ,它们很可能在运行时占用同一个 CPU 缓存行。在多核系统中,若线程 T1 在 CPU 0 上操作变量 ax ,线程 T2 在另一个 CPU 核心上同时操作变量 bx ,当 T1 从主内存访问 ax 时,其 CPU 缓存会同时加载 ax 和 bx 的值;同理,T2 访问 bx 时,其 CPU 缓存也会加载两个变量的值。
若 T1 对 ax 执行 ax ++ 操作,同时 T2 对 bx 执行 bx ++ 操作,就会出现缓存一致性问题。处
内核同步中的缓存效应与无锁编程解析
超级会员免费看
订阅专栏 解锁全文
70

被折叠的 条评论
为什么被折叠?



