并发编程框架Disruptor之高性能设计
发布日期:2021-06-30 12:27:43
浏览次数:2
分类:技术文章
本文共 1927 字,大约阅读时间需要 6 分钟。
架构 UML
1 单线程写
Disruptor的RingBuffer, 之所以可以做到完全无锁,也是因为"单线程写",这是所有"前提的前提",离了这个前提条件,没有任何技术可以做到完全无锁。Redis、Netty等等高性能技术框架的设计都是这个核心思想。
2 系统内存优化-内存屏障
要正确的实现无锁,还需要另外一个关键技术:内存屏障。对应到Java语言,就是valotile变量与happens before语义。
参阅:
系统内核:比如Linux的kfifo:smp_ wmb(),无论是底层的读写 都是使用了Linux的smp_ wmb https://github.com/opennetworklinux/linux-3.8.13/blob/master/kernel/kfifo.c
3 系统缓存优化-消除伪共享
缓存系统中是以缓存行(cache line) 为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。
当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。
核心:Sequence
可看成是一个AtomicLong用于标识进度。还有另外一个目的就是防止不同Sequence之间CPU缓存伪共享(Flase Sharing)的问题。
- 如下设计保证我们保存的 value 永远在一个缓存行中。(8 个long,正好 64 字节)。这也是一个空间换时间的案例。
4 算法优化-序号栅栏机制
我们在生产者进行投递Event的时候,总是会使用:
long sequence = ringBuffer.next();
Disruptor3.0中,序号栅栏SequenceBarrier和序号Sequence搭配使用。协调和管理消费者与生产者的工作节奏,避免了锁和CAS的使用。
- 消费者序号数值必须小于生产者序号数值
- 消费者序号数值必须小于其前置(依赖关系)消费者的序号数值
- 生产者序号数值不能大于消费者中最小的序号数值
- 以避免生产者速度过快,将还未来得及消费的消息覆盖
SingleProducerSequencerPad#next
/** * @see Sequencer#next(int) */ @Override public long next(int n) // 1 { if (n < 1) // 初始值:sequence = -1 { throw new IllegalArgumentException("n must be > 0"); } // 语义级别的 // nextValue为SingleProducerSequencer的变量 long nextValue = this.nextValue; long nextSequence = nextValue + n; // 用于判断当前序号是否绕过整个 ringbuffer 容器 long wrapPoint = nextSequence - bufferSize; // 用于缓存优化 long cachedGatingSequence = this.cachedValue; if (wrapPoint > cachedGatingSequence || cachedGatingSequence > nextValue) { long minSequence; while (wrapPoint > (minSequence = Util.getMinimumSequence(gatingSequences, nextValue))) { LockSupport.parkNanos(1L); // TODO: Use waitStrategy to spin? } this.cachedValue = minSequence; } this.nextValue = nextSequence; return nextSequence; }
参考
- https://zhuanlan.zhihu.com/p/21355046
转载地址:https://javaedge.blog.csdn.net/article/details/108935684 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月27日 06时32分29秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
开源计算机集群监控Ganglia应用视频
2019-05-01
Linux软件万花筒
2019-05-01
vSphere5安装配置视频教程
2019-05-01
《Linux企业应用案例精解》一书已由清华大学出版社出版
2019-05-01
安装配置FreeBSD9全过程体验
2019-05-01
全球开源软件发展趋势分析
2019-05-01
Linux系统安全加固(一)
2019-05-01
Linux常用的安全工具
2019-05-01
Iphone5S 体验(视频+截图)
2019-05-01
python 多进程之进程池的操作
2019-05-01
flask整理之 flask程序中的debug模式
2019-05-01
比特币,父母这一辈能接受吗?
2019-05-01
为什么要反对比特币,这不代表是空气币
2019-05-01
我们提出了DeFi项目如何成为聚合器,有两种路径
2019-05-01
SnapEx的新感觉,对新手很友好
2019-05-01
首个聚合器怎么产生的,并运用领域在什么
2019-05-01
区块链的优势和劣势的对比
2019-05-01
区块链技术应用,最先医疗行业
2019-05-01
新币上市旧币会降价吗
2019-05-01