专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

Muduo网络库介绍(muduo的使用方法详解)

来源:小易整编  作者:小易  发布时间:2023-02-07 07:20
摘要:Muduo网络库介绍,muduo的使用方法详解,muduo是陈硕个人使用C++开发的一款网络库,代码写的很有学习价值,总结的内容来自书籍《Linux多线程服务器端编程》,也是由陈硕编写,可以配合github代码一起使用。muduogithu...

Muduo网络库介绍,muduo的使用方法详解,muduo是陈硕个人使用C++开发的一款网络库,代码写的很有学习价值,总结的内容来自书籍《Linux 多线程服务器端编程》,也是由陈硕编写,可以配合github代码一起使用。

muduo github网址:https://github点com/chenshuo/muduo

一、muduo网络库简介

1、特点

(1)线程安全,原生支持多核多线程;

(2)不跨平台,只支持Linux;

(3)只要支持x86-64,兼顾IA32,也可以运行在ARM上;

(4)不支持UDP,只支持TCP

(5)不支持IPv6,只支持IPv4;

(6)支持的使用模式:非阻塞IO+one event loop per thread,不支持阻塞IO。

2·、代码结构

muduo 是基于Reactor模式的网络库,核心是事件循环EventLoop,用于响应计时器和IO事件,muduo采用基于对象的设计风格,事件的回调接口多boost::function+boost::bind表达。muduo源码的目录结构为:

Muduo网络库介绍(muduo的使用方法详解)

muduo网络库的核心位于muduo/net和muduo/net/poller,其中灰底表示用户不可见的内部类:

Muduo网络库介绍(muduo的使用方法详解)

其中主要的公共接口和内部实现如下:

Muduo网络库介绍(muduo的使用方法详解)

(1)公共接口

1.Buffer:是TcpConnection的成员,仿照了Netty ChannelBuffer的buffer class,数据的读写通过buffer进行,用户代码不需要调用read/write,只需要处理收到的数据和准备好要发送的数据;

2.EventLoop事件循环:每个线程只能有一个EventLoop实体,负责IO和定时器事件的分派,使用eventfd()来异步唤醒,用TimerQueue作为计时器管理,使用Poller作为IO多路复用;

3.EventLoopThread:启动一个线程,在其中运行EventLoop::loop();

4.TcpConnection:网络库的核心,封装一次TCP连接,但不能发起连接;

5.TcpClient:用于编写网络客户端,能发起连接,并且有重试的功能;

6.TcpServer:用于编写网络服务端,接受客户端的连接。

(2)内部实现

1.Channel负责注册与响应IO事件,注意它不拥有file descriptor。它是Acceptor、Connector、EventLoop、TimerQueue、TcpConnection的成员,生命期由后者控制;

2.Socket是一个RAII handle,封装一个file descriptor,并在析构时关闭fd。它是Acceptor、TcpConnection的成员,生命期由后者控制。EventLoop、TimerQueue也拥有fd,但是不封装为Socket class;

3.SocketsOps 封装各种 Sockets 系统调用;

4.Poller是PollPoller和EPollPoller的基类。它是EventLoop的成员,生命期由后者控制;

5.PollPoller和 EPollPoller封装poll()和epoll()两种 IO multiplexing后端。poll 的存在价值是便于调试,因为 poll()调用是上下文无关的,用strace很容易知道库的行为是否正确;

6.Connector用于发起 TCP连接,它是Tcpclient的成员,生命期由后者控制;

7.Acceptor 用于接受TCP连接,它是TcpServer的成员,生命期由后者控制;

8.TimerQueue用timerfd实现定时,这有别于传统的设置poll/epoll_wait的等待时长的办法。TimerQueue 用std::map来管理Timer,常用操作的复杂度是O(log N),N为定时器数目。它是EventLoop的成员,生命期由后者控制;

9.EventLoopThreadPool用于创建IO线程池,用于把TcpConnection分派到某个EventLoop线程上。它是TcpServer的成员,生命期由后者控制。

二、muduo线程模型

muduo的线程模型符合one loop per thread+thread pool模型,每个线程最多只有一个EventLoop,一个文件描述符只能由一个线程读写, TcpConnection所在的线程由其所属的EventLoop决定,TcpServer支持多线程,有两种模式:

1,单线程,accept与TcpConnection用同一个线程做IO;

2, 多线程,accept与EventLoop在同一个线程,另外创建一个EventLoopThreadPool,新到的连接会以轮询调度的方式分配到线程池中。

每种服务模型都有对应的例子。

1、单线程Reactor

计算和IO在同一个线程,没有事件的时候,线程等待在select/poll/epoll等函数上,事件到达后由网络库处理IO,再把消息通知客户端代码,网络库负责读写Socket,用户代码负责解码、计算、编码。事件顺序处理,无法保证优先级。这种模式适用于IO密集的应用,不太适合CPU密集的应用;

Muduo网络库介绍(muduo的使用方法详解)

实际项目应用中,这种模型应该并不常用。

代码目录:muduo/examples/sudoku/server_basic.cc

Server_basic.cc是一个并发服务器,可以同时服务多个客户端连接,但是是单线程的。

其中最关键的是onMessage()函数,主要用来从缓冲区读取数据,并调用processRequest()去处理请求,其中全部的IO和计算任务都在同一个线程中进行。

2、Reactor+线程池

主线程负责IO,工作线程负责计算,使用固定大小的线程池,全部的IO工作都在一个Reactor线程完成,而计算任务交给线程池,这种模式适用于计算任务彼此独立,而且IO压力不大的场景,有乱序返回的可能,客户端要根据id来匹配响应。

Muduo网络库介绍(muduo的使用方法详解)

代码目录:muduo/examples/sudoku/server_threadpool.cc

与方案1的区别是多了ThreadPool对象,线程池大小由numThreads_指定,然后processRequest()中计算的部分由ThreadPool去执行。这种方案有乱序返回的可能,所以要根据id来匹配响应。

3、one loop per thread

一个main Reactor负责accept连接,然后把连接挂在某个sub Reactor(muduo采用轮询方式选择sub Reactor)中,该连接的所有操作都在那个sub Reactor所处的线程中完成。优点是能保证请求的顺序性,程序的总体处理能力不会随着连接增加而下降,适应性强,所以是muduo的默认多线程模型。

Muduo网络库介绍(muduo的使用方法详解)

代码目录:muduo/examples/sudoku/server_multiloop.cc

这种模式下只需要设置server_.setThreadNum(numThreads_)即可。TcpServer在这种模式下用自己的EventLoop接受新连接,然后用event loop pool里的EventLoop去执行IO;

4、one loop per thread + 线程池

既有多个Reactor来处理IO,也使用线程池来处理计算,这种模式适合既有突发IO,又有突发计算的应用。

Muduo网络库介绍(muduo的使用方法详解)

如何确定使用多少个EventLoop呢?

根据ZeroMQ手册的建议,按照每千兆比特每秒的吞吐量配一个event loop的比例来设置event loop的数目(即muduo::TcpServer::setThreadNum()的数量),所以在编写运行于千兆以太网上的网络程序时,用一个event loop就足以应付网络IO。如果TCP连接有优先级之分,那使用一个event loop不太合适,最好是把高优先级的连接用单独的event loop来处理。


本文地址:网络知识频道 https://www.hkm168.com/jiqiao/903048.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


网络知识
小编:小易整编
相关文章相关阅读
  • 有没有录制电脑屏幕的方法

    有没有录制电脑屏幕的方法

    电脑屏幕有录制的方法吗有两个方法一是用win10电脑自带的录屏软件来录,打游戏的时候按一下【win+g】就行了二是用其他的录制软件来录制,比如“迅捷屏幕录像工具”,操作方法如下:1、首先在电脑上将这个工具下载下来。下载完成后打开工具,主页...

  • win7硬件加速设置方法

    win7硬件加速设置方法

    有很多网民在玩一些游戏或运行一些大软件,下载大文件,可能会觉得系统运行不够无忧无虑,这次可以尝试加速硬件。下面的小边将为您介绍如何设置win7的硬件加速方法。1.右击桌面空白处,然后点击右键菜单中的屏幕分辨率选项。2.进入电脑屏幕分辨率设置...

  • 迅雷下载速度慢怎么办-迅雷下载速度慢解决方法

    迅雷下载速度慢怎么办-迅雷下载速度慢解决方法

    迅雷下载速度慢怎么办?迅雷是目前国内用户使用最多的高速下载工具,其速度和效率都是同类下载工具的顶点,但是很多用户在使用的时候却发现迅雷的下载速度很慢,这其实是因为多个不同的问题导致的,那么我们该如何解决呢?下面就由小编为大家带来迅雷下载速度...

  • java中tostring方法的作用是什么

    java中tostring方法的作用是什么

    java中tostring方法的作用是会返回一个【以文本方式表示】此对象的字符串,结果是一个简明但易于读懂的信息表达式。java中tostring方法的作用是toString方法会返回一个“以文本方式表示”此对象的字符串。结果是一个简明但易...

  • 电脑运行内存怎么扩大 秒懂:电脑内存扩大内存的方法

    电脑运行内存怎么扩大 秒懂:电脑内存扩大内存的方法

    电脑运行内存怎么扩大?这是许多电脑用户常常遇到的问题。想要提升电脑运行速度和性能,扩大内存是一个有效的方法。但是,如何扩大内存呢?在本文中,php小编西瓜将为你介绍一些简单又实用的方法,让你秒懂如何扩大电脑内存,提升电脑的运行效率。无论你是...

  • 修复 Windows 11 中 Sxstrace.exe 运行时错误的 5 种方法

    修复 Windows 11 中 Sxstrace.exe 运行时错误的 5 种方法

    windows用户有时会发现启动程序很困难,在这种情况下可能会收到一条错误消息,要求使用命令行sxstrace.exe工具了解更多详细信息。sxstrace.exe由Microsoft于2006年11月首次为Windo...

  • CSS颜色设置方法:HEX、RGB、HSL的简单对比

    CSS颜色设置方法:HEX、RGB、HSL的简单对比

    css中,颜色值有多种表示方法,例如颜色名、十六进制颜色、rgb()、hex()、hsl()等等。那你知道hex、rgb和hsl之间有什么区别吗?下面本篇文章就来给大家简单对比一下hex、rgb、hsl,看看它们区别。不知道你是否了解HE...

  • 如何解决 Windows 7 远程桌面出现黑屏的问题:11 种方法

    如何解决 Windows 7 远程桌面出现黑屏的问题:11 种方法

    远程桌面连接(rdc)是专业版和企业版windows上的一项有用功能,允许用户远程连接到另一台计算机,而无需其他软件。但是windows11远程桌面上的黑屏可能会毁掉这一切。黑屏问题是用户遇到的最常见问题之一。你想知道为什么屏...

  • 周排行
  • 月排行
  • 年排行

精彩推荐