false-sharing的由来 为了提升处理速度,CPU引入了缓存的概念,我们先看一张CPU缓存的示意图: ? 那么我们还有没有什么正规的办法来解决false-sharing的问题呢?
需要注意的是“long padding[100]; // avoid cache false-sharing”这行,加上padding用来避免CPU cache的false-sharing问题。 argc, char **argv) { pthread_t p0, p1; long cpu0 = 4; long padding[100]; // avoid cache false-sharing
更多精彩内容 1 JVM系列之:Contend注解和false-sharing 2 一张PDF了解JDK11 GC调优秘籍-附PDF下载 3 JVM系列之:String,数组和集合类的内存占用大小
p3, p4, p5, p6; 参考文献 http://igoro.com/archive/gallery-of-processor-cache-effects/ http://ifeve.com/false-sharing
同时RTM还可以减少CPU cache line的false-sharing。
(22)JMHSample22FalseSharing 从名字可知本例是说false-sharing,即伪共享,关于伪共享这里就不再展开,后续会写一篇文章专门介绍伪共享。
然而shared_ptr使用并不是无开销的,另外会带来false-sharing问题。
read/write access variable unsigned long start; unsigned long end; // expand to 64 bytes to avoid false-sharing
因缓存使用不当而引起的性能下降的问题: 7 伪共享 伪共享(false-sharing),当两个线程同时各自修改两个相邻的变量,由于缓存是按缓存块来组织,当一个线程对一个缓存块执行写操作,须使其他线程含有对应数据的缓存块无效
示例6:缓存行的伪共享(false-sharing) 在多核机器上,缓存遇到了另一个问题——一致性。不同的处理器拥有完全或部分分离的缓存。
queue_index; u32 reg_state; struct xdp_mem_info mem; } ____cacheline_aligned; /* perf critical, avoid false-sharing queue_index; u32 reg_state; struct xdp_mem_info mem; } ____cacheline_aligned; /* perf critical, avoid false-sharing
2.5 伪共享(false-sharing) 当两个线程同时各自修改两个相邻的变量,由于缓存是按缓存行来整体组织的,当一个线程对缓存行中数据执行写操作时,必须通知其他线程该缓存行失效,导致另一个线程从缓存中读取其想修改的数据失败
queue_index; u32 reg_state; struct xdp_mem_info mem; } ____cacheline_aligned; /* perf critical, avoid false-sharing