《Muduo 多线程网络库解析》

Muduo是C++语言实现的网络库,和Anet的设计目标基本一致,各有千秋。希望通过阅读Muduo能找到一些不一样的灵感。

下面是本人最近分享muduo的ppt。性能对比图和类图是直接从muduo库的manual手册截过来的,其余的是用libreoffice上画出来。

概述:

1) muduo的抽象不错的:概括上来说EventLoop 封装了对事件的处理,这是client和server共有的逻辑,而且EventLoop和ThreadPool是解耦合的,为多线程IO模型奠定了基础;TcpServer 封装了Server端的逻辑和回调,比如acceptor。TcpClient封装了client的逻辑和回调,比如connector。

2)muduo仅仅提供了3个最基础的设施(事件处理,TimerQueue 和 functionQueue),并没有提供像anet的timeout的机制,也没有提供channelid。这些功能可以通过3个基础设在muduo的上层实现。ppt最后一页举了个处理idle链接的例子。把所有的链接组织成8个boost::circle_buffer。并处理两个事件:a)链接的建立,把conn的shared_ptr插入尾端;b)消息的到来,再一次把链接的shared_ptr再次插入尾端。同时,注册一个定时器:每一秒往boost::circle_buffer尾部插入一个trival的结构,目的是每隔一秒淘汰首部的shared_ptr;当所有的格子里的shared_ptr都淘汰之后,conn就被析构了。

3)性能体现在细节上。a)buffer的设计,muduo的buffer设计和anet如出一辙。b)read读取数据,在栈上开64k的空间,使用readv,把当前conn的inputBuffer_和栈上开的空间组织一起,使用gatherIO。然后把栈上读取到的数据copy到inputBuffer_。这样既一次read调用可以尽量多的读取数据,又不需要在inputBuffer预分配过多的空间。c)发送数据的时候,如果outputBuffer_上是空的,尽量直接发送出去,节省了outputBuffer_序列化的时间。这些实现都是基于muduo良好的基础设施。d)多个IO线程,缓解关键线程的压力。

4)多个IO处理线程。之前iSearch4的时候,1688的merger和searcher比例3:1,大部分是在收发数据,一个anet线程不能及时处理,因为IO线程并不是简单的read,write。它还要负责packet的解析,上层应用的回调,这些都给关键的IO的线程带来压力。所以,面对万兆网卡,或大吞吐量的应用,单个IO线程是吃力的。muduo的多IO线程的实现:1)中讲到了EventLoop 只是封装了处理事件的逻辑,和执行体线程是解耦合的。开启多IO线程时,开多个thread,每个thread绑定一个EventLoop。当一个链接建立之后,把这个链接路由给一个线程就可以了。

5)语言风格上。a)muduo大量使用了bind/function,这一对函数其实是在模仿‘闭包’的概念。把多线程并发做的事情,封装成一个个的闭包,‘线性化’到EventLoop线程的functionQueue,同步化处理。使得在99%不需要锁的地方,彻底无锁了。牺牲的仅仅是一点点的串形化。同时,有了闭包,就不必到处继承‘接口类’。是代码也简洁了一些。b)大量的使用了shared_ptr, weak_ptr管理资源,避免手工管理引用计数,像anet一样。shared_ptr,weak_ptr的性能也很客观,即使是频繁的构造析构(当然,设计上能避免就避免构造析构。


《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》《Muduo 多线程网络库解析》


















上一篇:spring mvc+mybatis+mysql项目


下一篇:3dsmax2012主栅格该怎么设置?