Disruptor 全解析(1):Ring Buffer 有什么特别?
原文地址:?http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html? ?作者是 Trisha Gee, LMAX 公司的一位美女工程师:)
要找到数组中当前序号指向的元素,你可以用一个 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/??), 我只是转载并进行了整理,特此感谢。