首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
Disruptor 为什么这么快?
时间:
2016-08-19 13:16:54
阅读:
124
评论:
0
收藏:
0
[点我收藏+]
标签:
为什么Disruptor不使用队列来实现RingBuffer
队列有两个指针,一个指向队头,一个指向队尾。如果有超过一个生产者想要往队列里放东西,尾指针就将成为一个冲突点,因为有多个线程要更新它。如果有多个消费者,那么头指针就会产生竞争,因为元素被消费之后,需要更新指针,所以不仅有读操作还有写操作了。所以队列通常是单生产者单消费者。
队列(缓冲区)的目的就是为生产者和消费者提供一个地方存放要交互的数据,缓冲它们之间传递的消息。这意味着缓冲区通常是满的(生产快于消费)或是空的(消费快于生产)。生产者和消费者协调一致的情况非常少见。
队列需要保存一个关于大小的变量,这三个变量常常在一个
cache line
里面
这就是我们所说的“分离竞争点问题”或者队列的
“合并竞争点问题”
。通过将所有的东西都赋予私有的序列号,并且只允许一个消费者写Entry对象中的变量来消除竞争,Disruptor 唯一需要处理访问冲突的地方,是多个生产者写入 Ring Buffer 的场景。
Cache Line
:cache line解释起来其实很简单,就是CPU在做缓存的时候有个最小缓存单元,在同一个单元内的数据被同时被加载到缓存中,充分利用 cache line可以大大降低数据读写的延迟,错误利用cache line也会导致缓存不同替换,反复失效。
根据CPU的缓存机制,如果你访问一个long数组,当数组中的一个值被加载到缓存中,它会额外加载另外7个。因此你能非常快地遍历这个数组。
总结
Disruptor 为什么这么快?
两个核心思想:
计算机计算的速度远远大于 IO 的速度,宁可增加一些处理代码加大计算压力,也要尽可能多的使用缓存而非内存。
锁是阻碍并发效率的元凶,尽可能的避免竞争,通过合理的分配策略+内存屏障机制,实现真正的并发处理。
Disruptor相对于传统方式的优点:
缓存行填充
更多并发编程和分布式应用的内容欢迎关注我的博客
LOFTER:
http://www.lofter.com/
博客园:
http://www.cnblogs.com/geason/
LOFTER移动端体验较好,博客园PC端体验较好。
Disruptor 为什么这么快?
标签:
原文地址:http://www.cnblogs.com/geason/p/5787168.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!