21|伪共享:如何用伪共享打造高并发、高性能的系统?
康杨
你好,我是康杨,今天我们来聊伪共享的话题。
伪共享(False Sharing)是高并发系统需要重点关注和优化的点。在计算机科学中,伪共享是多线程环境里的一种性能损失现象,当多个线程访问并修改处于同一缓存行内的不同数据时,会导致这个缓存行不断地在各个线程对应的缓存中切换,从而大大降低了系统性能,这就是所谓的伪共享现象。
Cache Line 的由来
在详细介绍伪共享之前,我们先来了解伪共享产生的背景,也就是缓存机制。
在计算机中,缓存(Cache)用于协调速度差异较大的两种硬件之间数据传输速度的差异。例如,CPU 和主存之间就有 cache 进行协调,这种存在于硬件中的 Cache 常见的有 CPU Cache、GPU Cache 等;同时在软件中也有类似的存在,比如 Web Cache。
CPU Cache 是高速缓冲存储器,它位于计算机存储系统中,介于 CPU 和主存储器之间,用来提高 CPU 从主存储器读取或写入数据的速度。它并不使用主存那样的 DRAM 技术,而采用比较快速而且昂贵的 SRAM 技术。随着 CPU 速度的提高,主存和 CPU 之间的速度差异问题日益突出,需要通过 Cache 提高存储系统速度,来提升计算机系统性能。
那么,为什么要使用缓存技术呢?首先,高速缓存是一个小且速度快的存储设备,其命中率高且成本较低、性能优越。通过使用缓存,我们能实现更高效的数据访问和处理。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了多线程环境中的性能损失现象——伪共享,以及其原因和检测方法。文章指出伪共享会导致缓存行在不同线程的缓存中切换,降低系统性能。针对伪共享问题,提出了数据对齐、数据隔离和使用无锁数据结构等解决办法。文章还介绍了在Java 8中使用 `sun.misc.Contended` 注解和Disruptor框架中避免伪共享的方法。Disruptor通过填充数据项来确保每个数据项独立存在于不同的Cache Line中,提高了数据的并行访问效率。最后,文章提出了两个思考题:伪共享的产生原因以及如何避免伪共享来提升性能。整体而言,本文深入浅出地介绍了伪共享问题及解决方法,对于高性能程序设计具有重要的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》,新⼈⾸单¥59
《云时代的 JVM 原理与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(1)
- 最新
- 精选
- peter请教老师几个问题: Q1:伪共享不是功能问题,功能正常,但影响性能,是这样吗? Q2:Cache Line多大?是标准的吗?如果不是标准的,比如不同的CPU,其cache Line是不同的,那么,Disruptor这样的软件,需要适配不同的CPU吗? Q3:无锁数据结构为什么可以避开伪共享问题?2023-10-17归属地:北京16
收起评论