Disruptor无锁队列浅析

来源:互联网 发布:mac os 10.11 cdr迅雷 编辑:程序博客网 时间:2024/06/15 15:29

    近期在看操作系统相关资料的时候,阅读到“信号量与PV操作”,主要分三块:互斥控制,同步控制,生产者与消费者问题。因为我日常与服务器及消息队列打交道较多,对生产者与消费者问题比较感兴趣,正好之前曾经研究过“Disruptor无锁队列”的实现原理,正好再结合PV操作重新回顾下:

    注:PV操作中P为荷兰文passeren的缩写,意思是通过。V为荷兰文vrijgeven的缩写,意思是释放。


    首先解释下Disruptor到底是什么。Disruptor是提供了一种线程之间数据高速交换方式,其首先用在LMAX架构中,LMAX是金融交易所平台,消息吞吐量十分巨大。可以充分证明这种消息队列实现的高效和稳定。


    正常情况下,譬如两个线程同时要访问并修改一个消息队列,需要通过PV操作处理缓冲区的互斥控制和消息接受和分发的同步控制。比如互斥控制,形象点比喻就是,有两个小朋友,同时都想玩一个玩具,需要有一个中间人判断先给谁后给谁,比如说老师。多个线程访问一个数据,多了一个判定过程,当访问频繁时,整体性能将急剧降低。


    Disruptor是如何解决问题的呢?Disruptor根本不用锁,取而代之是确保操作线程是安全的。还是上面的例子,不再需要老师去裁判玩具归属,一个孩子玩的时候可用用一种机制保证其他孩子肯定不会抢这个玩具。


    具体实现方式是,在需要确保线程安全的时候,不再使用锁,改用CAS(Compare And Swap/Set)操作。CAS的功能简单来描述就是,当发现想改变的值已经改变,则操作失败。类比孩子玩具的例子,当一个孩子想玩时候,发行玩具在别人手上,不用去问老师了,不再尝试去拿玩具。


    CAS操作的资源会比锁资源少多了,显而易见,不需要再通过锁方式,控制多个线程访问。类比孩子玩具的例子,不再需要老师的参与了,玩玩具的孩子也不用停下来解释。


    Disruptor具体的实现是基于CAS操作的RingBuffer环形队列,如下图所示,RingBuffer中分离了读指针和写指针,从而使生产者和消费者互不干扰,两者可以完全并发执行,从而使性能达到数倍于传统基于互斥锁方式实现的消息队列模型。


    Disruptor实现现已经开源(Apache-2.0 license),可以git clone https://github.com/LMAX-Exchange/disruptor。具体源码实现,篇幅有限,打算后面专门做一个系列来分析学习。

原创粉丝点击