加载中...
假共享是多核并发中的性能问题,指多个线程分别访问不同变量,但这些变量恰好位于同一条缓存行上,导致一个线程的写入使其他核心的缓存行失效,引发频繁的缓存一致性同步,从而显著拖慢性能。

| 中文名 | 假共享 |
| 外文名 | False Sharing |
| 涉及领域 | 多核并发 |
| 根源 | 缓存行共享 |
| 缓解手段 | 缓存行填充 |
假共享是多核处理器并发编程中的一种隐性性能陷阱。它发生在多个线程各自访问互不相关的变量时,由于这些变量恰好落在同一条缓存行内,处理器的缓存一致性协议会把整条缓存行视为共享单位,使得任一核心对其中一个变量的写入,都会导致其他核心持有的该缓存行副本失效。
现代处理器以缓存行为单位在内存与缓存之间传输数据,一条缓存行通常为六十四字节。当两个线程写入的变量分处不同核心却共享同一缓存行时,尽管它们逻辑上毫无关联,硬件仍必须来回同步这条缓存行,产生大量本可避免的一致性流量。这种因物理布局巧合而非真正数据共享引起的开销,便被称为假共享。
假共享常见于并发计数器数组、每线程独立累加的统计结构以及高性能队列的头尾指针等场景。典型的缓解手段是缓存行填充,即在热点变量之间插入占位字节,使它们分布到不同缓存行;也可通过将频繁写入的字段隔离对齐来避免。在高并发框架和无锁数据结构的实现中,对假共享的规避是关键的性能优化点。
问:假共享和真共享有什么区别?答:真共享是多个线程确实访问同一个变量;假共享则是线程访问不同变量,只因它们同处一条缓存行而被迫同步,逻辑上并无数据竞争。
问:如何检测假共享?答:可借助性能分析工具观察缓存失效和一致性流量的异常升高,或通过对比填充前后的性能差异来定位。它通常表现为多线程扩展性不佳。

| 中文名 | 假共享 |
| 外文名 | False Sharing |
| 涉及领域 | 多核并发 |
| 根源 | 缓存行共享 |
| 缓解手段 | 缓存行填充 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧