《Muduo 多线程网络库解析》

简介: Muduo是C++语言实现的网络库,和Anet的设计目标基本一致,各有千秋。希望通过阅读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的性能也很客观,即使是频繁的构造析构(当然,设计上能避免就避免构造析构。


image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png


















相关文章
|
1月前
|
算法 Linux 开发者
CMake深入解析:打造高效动态链接库路径设置
CMake深入解析:打造高效动态链接库路径设置
45 0
|
1月前
|
算法 数据处理 开发者
FFmpeg库的使用与深度解析:解码音频流流程
FFmpeg库的使用与深度解析:解码音频流流程
36 0
|
1月前
|
XML 前端开发 数据格式
请描述如何使用`BeautifulSoup`或其他类似的库来解析 HTML 或 XML 数据。
【2月更文挑战第22天】【2月更文挑战第67篇】请描述如何使用`BeautifulSoup`或其他类似的库来解析 HTML 或 XML 数据。
|
3月前
|
设计模式 Go
依赖注入实用指南:深入解析inject库
依赖注入实用指南:深入解析inject库
52 0
|
1月前
|
Java 调度 Python
深入解析 Python asyncio 库:如何使用线程池实现高效异步编程
深入解析 Python asyncio 库:如何使用线程池实现高效异步编程
59 0
|
2月前
|
存储 数据可视化 数据挖掘
Python在数据分析中的利器:Pandas库全面解析
【2月更文挑战第7天】 众所周知,Python作为一种简洁、易学且功能强大的编程语言,被广泛运用于数据科学和人工智能领域。而Pandas库作为Python中最受欢迎的数据处理库之一,在数据分析中扮演着举足轻重的角色。本文将全面解析Pandas库的基本功能、高级应用以及实际案例,带您深入了解这个在数据分析领域的利器。
52 1
|
1月前
|
缓存 算法 C语言
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
46 0
|
30天前
|
算法 IDE Linux
【CMake 小知识】CMake中的库目标命名和查找策略解析
【CMake 小知识】CMake中的库目标命名和查找策略解析
99 1
|
1月前
|
安全 网络性能优化 Android开发
深入解析:选择最佳C++ MQTT库的综合指南
深入解析:选择最佳C++ MQTT库的综合指南
87 0
|
1月前
|
存储 并行计算 算法
【C++ 函数式编程】深入解析 C++ 函数式编程<functional> 库
【C++ 函数式编程】深入解析 C++ 函数式编程<functional> 库
136 0

推荐镜像

更多