首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Disruptor 全解析(一):Ring Buffer 有什么特别

2012-07-05 
Disruptor 全解析(1):Ring Buffer 有什么特别?原文地址:?http://mechanitis.blogspot.com/2011/06/dissect

Disruptor 全解析(1):Ring Buffer 有什么特别?

原文地址:?http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html? ?作者是 Trisha Gee, LMAX 公司的一位美女工程师:)


最近我们开源了?LMAX Disruptor?,它是我们的交易变得如此之快的关键。为什么我们要开源它?我们意识到对高性能编程的传统认知 ... 有点不对劲。我们找到了一个更好的,更快的线程间共享数据的方法,如果不把它分享给大家是自私的。并且,这也会使我们看起来很酷。
在这个?网站??你可以下载到一份解释什么是Disruptor,以及为什么它这么巧妙和快速的技术文档。我从它得到了一些写作帮助,我真正做的只是在上面加了一些标点和重组了一些我不明白的句子,这太容易了。
我发现把这些东西一次性解释清楚有些困难,所以我准备一小块一小块的解释它们,以适合我的?NADD??听众。
首先 - Ring Buffer。我对 Disruptor 的最初印象只有 Ring Buffer。后来我渐渐明白 Ring Buffer 数据结构是这个模式的中心,关键点是 Disruptor 如何控制访问它。
Ring Buffer 到底是什么?
正如名字所说那样 - 它是一个环 (圆形,首尾相接的),你把它当作一个缓存 (buffer),在一个上下文(线程)与另一个 (上下文) 之间传东西。Disruptor 全解析(一):Ring Buffer 有什么特别(好吧,我是用 Paint 画的。我试着画草图,希望我的强迫症没有掺和进来要求我画完美的圆和直线)。

所以基本上它就是有一个指针指向下一个可用元素的数组。Disruptor 全解析(一):Ring Buffer 有什么特别
如果你持续向 buffer 中填东西(应该也会从里面读),序号会一直增长,绕过这个环。Disruptor 全解析(一):Ring Buffer 有什么特别

要找到数组中当前序号指向的元素,你可以用一个 mod 运算。

?


我们实现的 Ring Buffer 与传统队列的区别是,我们不消耗 buffer 中的元素-它们留在那儿直到被覆盖写入。这是与 Wikipedia 上的版本相比我们不需要尾指针的原因。确定能否重叠是在数据结构外部来管理的(这是生产者和消费者行为的一部分-如果你等不及我写博客来说明它,你可以自己检出?Disruptor?项目??)。


它这么棒是因为...?

我们使用这种数据结构是因为它提供我们一些可靠消息传递的好特性。这就足够了,不过它还有一些其他的好特点。


首先,它比链表什么的要快,因为它是数组,而且有一个可预测的访问模式。这很不错,对 CPU cache 友好 (CPU-cache-friendly)-数据可以在硬件层面预加载,因此机器不需要经常回到主内存 RAM 去加载 Ring 的下一条数据。


第二点,它是一个数组,你可以对它提前预分配,使得数组元素永远保持有效。这意味着 GC 在这里几乎什么也不用做。另外,不像链表那样每个添加的元素都要创建对象-当这些对象不在链表里时它们都需要被清理掉。


缺少的部分
我没有提到如何避免环重叠,或者关于如何向 Ring Buffer 读、写的细节。你也会注意到我把它和链表那样的数据结构比较,我觉得没人会认为链表是实际问题的解决方案。

有趣的部分来自于拿 Disruptor 和队列之类的实现相比较。队列通常注意维护队列的头和尾,添加和消费元素之类的东西。所有东西我都没有在 Ring Buffer 中真正提到。这因为 Ring Buffer 本身并不负责这些事,我们把这些问题移到了数据结构的外部。

到这个?网站??阅读论文或是检出代码以获得更详细的信息。或者查看?Mike 和 Martin去年在 QCon San Francisco 的演讲?。或者再等我 5 分钟来想想后面剩下的东西。

?

?

本文翻译自原作者博客, 译者是博客园 ?﹎〾敏ō?(http://www.cnblogs.com/adaikiss/??), 我只是转载并进行了整理,特此感谢。

热点排行