这里先不提那些编译器方面的优化。只看一下基于无锁环形队列的生产者消费者模型的工作流程。上一个图先:

当中,buffer是一个数组,用来模拟环形队列。

slowest_reader记录最慢的reader读取数据的位置,主要用来防止写者写得太快而覆盖掉还未被读的数据。max_read_cursor是眼下可以读取的最远的数据的位置。这个位置应该是>=全部读者的位置的(初始化时为0,小于全部读者的位置,所以初始化时读者是不能读取数据的)。write_cursor是当前最快的写者的写入的位置。

那么假设再来一个写者请求写入怎么办?非常好办,把write_cursor++,然后写入到这个位置就可以。所以,disruptor是支持多个写者同一时候写入数据的(仅仅是公布时要有严格的先后顺序)。reader_cursor数组用来记录每一个读者的位置。

那么,如今写者要写入数据,该怎么做呢?前面已经说过了,write_cursor++,然后写入到这个位置。

例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSm9zZXBoXzExMTg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

上图中,max_read_cursor也更新了,这个更新事实上是在写者公布他的写入后才有的。

如今。ring buffer中有数据了,读者能够读取数据了(标志是读者的cursor<=max_read_cursor)。读的时候就是把max_read_cursor作为最大的可读位置。

而这个最大可读位置可能比当前的某个读者的读取位置大了不止一个位置。

由于有可能写者写得比較快,全然能够写入非常多个位置而读者还在后面,那么这样的情况下读者就能够一下子取出非常多数据,而不是一个一个地去读取。

这也是disruptor的一个特点。

这里仅仅是讲了disruptor的基本流程。一些同步的细节并没有说。

读者在buffer中没有数据可读时该怎样等待这是一个和业务场景强相关的逻辑。能够轮询,也能够睡眠,这个后面再说。

disruptor流程的更多相关文章

  1. 架构师养成记--15.Disruptor并发框架

    一.概述 disruptor对于处理并发任务很擅长,曾有人测过,一个线程里1s内可以处理六百万个订单,性能相当感人. 这个框架的结构大概是:数据生产端 --> 缓存 --> 消费端 缓存中 ...

  2. Disruptor——一种可替代有界队列完成并发线程间数据交换的高性能解决方案

    本文翻译自LMAX关于Disruptor的论文,同时加上一些自己的理解和标注.Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调 ...

  3. 高性能队列——Disruptor

    背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级).基于Disruptor开发的系统单线程能 ...

  4. disruptor 高性能之道

    disruptor是一个高性能的线程间异步通信的框架,即在同一个JVM进程中的多线程间消息传递.应用disruptor知名项目有如下的一些:Storm, Camel, Log4j2,还有目前的美团点评 ...

  5. Disruptor 系列(二)使用场景

    Disruptor 系列(二)使用场景 今天用一个订单问题来加深对 Disruptor 的理解.当系统中有订单产生时,系统首先会记录订单信息.同时也会发送消息到其他系统处理相关业务,最后才是订单的处理 ...

  6. LMAX Disruptor 原理

    http://mechanitis.blogspot.com/search/label/disruptor http://ifeve.com/disruptor/, 并发框架Disruptor译文 h ...

  7. 一条数据的HBase之旅,简明HBase入门教程-Write全流程

    如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...

  8. Disruptor Ringbuffer

    系列译文: http://ifeve.com/disruptor/ 当有多个消费者时,(按Disruptor的设计)每个消费者各自控制自己的指针,依次读取每个Slot(也就是每个消费者都会读取到所有的 ...

  9. disruptor 高并发编程 简介demo

    原文地址:http://www.cnblogs.com/qiaoyihang/p/6479994.html disruptor适用于大规模低延迟的并发场景.可用于读写操作分离.数据缓存,速度匹配(因为 ...

随机推荐

  1. 华为s5700 添加与删除vlan

    新建vlan 删除vlan ① 检查该VLAN下是否存在成员接口,使用如下命令:display vlan all② 如存在成员接口,则进入该接口视图,删除该成员,否则可略过此步骤,例如:interfa ...

  2. PrintDocument组件打印

    运行效果: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  3. 简易视频播放器2 (基于Qt、opencv)

    因项目需要,需要实现一个对以保存的监测视频快速查看功能. 查询网上一些资料,初步简易的实现了一下. 实际效果图: 该程序基于Qt5.4,opencv248,开发环境为win8.1 结构为: video ...

  4. 关于Dropdownlist使用的心得体会

    2013-07-23关于Dropdownlist使用的心得体会: Dropdownlist使用最多的几个属性: 一.Dropdownlist.Items,负责包含所有选项的容器 DropDownLis ...

  5. 四、Nginx负载均衡upstream

    user www; worker_processes ; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/lo ...

  6. 从 Qt 的 delete 说开来

    原地址:http://blog.csdn.net/dbzhang800/article/details/6300025 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 ...

  7. OGR API Tutorial

    This document is intended to document using the OGR C++ classes to read and write data from a file. ...

  8. 枚举+搜索 hdu-4431-Mahjong

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4431 题目大意: 给一副牌,求出所有能糊的牌. 解题思路: 枚举每一张牌,看能不能糊. 因为一共只有 ...

  9. android保存文件到SD卡中

    想把文件保存到SD卡中,一定要知道SD卡的路径,有人说可以用File explore来查看,这种方法不太好,因为随着android版本的升级,SD卡的路径可能会发生改变.在1.6的时候SD的路径是/s ...

  10. vbox要手动mount才能挂载windows的共享文件夹(好用,不用安装samba了)

    mount -t vboxsf BaiduShare /mnt/bdshare/ 我按照这篇文章成功: http://www.wuji8.com/meta/448016166.html 其它参考: h ...