muduo网络库与服务模型介绍

article/2025/11/6 19:12:56

目录

一、muduo网络库简介

1、特点

2·、代码结构

(1)公共接口

(2)内部实现

二、muduo线程模型

1、单线程Reactor

2、Reactor+线程池

3、one loop per thread

4、one loop per thread + 线程池


 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/net和muduo/net/poller,其中灰底表示用户不可见的内部类:

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

(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/examples/sudoku/server_basic.cc

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

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

2、Reactor+线程池

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

代码目录: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/examples/sudoku/server_multiloop.cc

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

4、one loop per thread + 线程池

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

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

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


http://chatgpt.dhexx.cn/article/EnFbsWXl.shtml

相关文章

muduo 架构解析

muduo是一个基于Reactor模式的C网络库。它采用非阻塞I/O模型,基于事件驱动和回调。我们不仅可以通过muduo来学习linux服务端多线程编程,还可以通过它来学习C11。     Reactor是网络编程的一般范式。我们这里从reactor模式为出发点,根据R…

muduo库介绍

muduo库是一个多线程服务器开发库 muduo 作者陈硕,现在在美国加州硅谷某互联网大公司工作,从事大规模分布式的可靠系统工程。这个库是作者多年工作的总结,可以说大家学通了这个库,找一份Linux服务器开发的工作是没问题的&#xf…

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

Muduo is a multithreaded C network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C网络库。 muduo网络库是C语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高…

遗传算法示例

遗传的概念: 遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。 遗传算法的特点: 对于搜索算法的共同特征有 首先组成一组候选解。依据某些使用性条件测算这些…

10分钟搞懂遗传算法

大自然有种神奇的力量,它能够将优良的基因保留下来,从而进化出更加强大、更加适合生存的基因。遗传算法便基于达尔文的进化论,模拟了自然选择,物竞天择、适者生存,通过N代的遗传、变异、交叉、复制,进化出问…

遗传算法简单实例

遗传算法的手工模拟计算示例 为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各 个主要执行步骤。 例:求下述二元函数的最大值: (1) 个体编码 遗传算法的运算对象是表示个体的符号串&#xff0…

遗传算法(基础知识)

遗传算法(基础知识) 遗传算法简称GA(Genetic Algorithms)模拟自然界生物遗传学(孟德尔)和生物进化论(达尔文)通过人工方式所构造的一类 并行随机搜索最优化方法,是对生物…

遗传算法概念、步骤、应用解析(案例直白--黄含驰)

遗传算法 ①  在几十亿年的演化过程中,自然界中的生物体已经 形成了一种优化自身结构的内在机制,它们能够不 断地从环境中学习,以适应不断变化的环境  对于大多数生物体,这个过程是通过自然选择和有性生殖来完成的。自然选择…

遗传算法超详细图解

遗传算法(Genetic Algorithm)顾名思义,是一种基于自然选择原理和自然遗传机制的启发式搜索算法。该算法通过模拟自然界中生物遗传进化的自然机制(选择、交叉和变异操作),将好的遗传基因(最优目标…

遗传算法及其应用

一、遗传算法的定义 遗传算法的基本思想是参考生物学中物种“物竞天择,适者生存”的思想。在计算机中,通过给定约束条件,使初始参数不断迭代,从而接近最优解。 遗传算法可描述为: Initialize population process-chr…

详解遗传算法(含MATLAB代码)

目录 一、遗传算法概述 二、遗传算法的特点和应用 三、遗传算法的基本流程及实现技术 3.1 遗传算法的基本流程 3.2 遗传算法的实现技术 1.编码 2.适应度函数 3.选择算子 4.交叉算子 5.变异算子 6.运行参数 四、遗传算法的基本原理 4.1 模式定理 4.2 积木块假设 …

遗传算法步骤

遗传算法是一种模拟生物自然进化的一种算法,通话对生物进化的模拟,实现对数值函数的模拟计算。它主要分为四个步骤:初始化、杂交、变异和选择。相关实现可参考https://github.com/ShaquallLee/evolutionary-programming/tree/master/aEP 1、…

遗传算法原理+程序案例详解

注明:这篇遗传算法程序我在网上看到多次,很多人在转载时,都称已经修改了错误的地方,程序在matlab上能够运行。 当我在学习这段程序时,发现结果仍存在很大问题(不稳定、不准确)。我一行一行看时,发现不仅有少…

遗传算法、遗传算法库函数ga和gamultiobj、遗传算法工具箱GOT实例介绍

目录 前言 适应度函数和目标函数的关系 1. 常规遗传算法 2.结合非线性规划fmincon函数的遗传算法 2.1 fmincon非线性规划函数使用 2.2 结合非线性规划fmincon函数的遗传算法使用及示例 2.2.1 编码 2.2.2 选择 2.2.3交叉 2.2.4变异 2.2.5非线性规划fmincon函数 2.2.…

遗传算法原理与应用详解

遗传算法 ( GA , Genetic Algorithm ) ,也称进化算法 。 遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出的一种启发式搜索算法。因此在介绍遗传算法前有必要简单的介绍生物进化知识。 一.进化论知识 作为遗传算法生物背景的介绍&#xff0…

遗传算法(一) 遗传算法的基本原理

遗传算法(一)遗传算法的基本原理 1.概述 遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗…

算法理解-遗传算法(Genetic Algorithm)(一个带计算过程的例子)

想要快速的了解一个算法,最好的方式便是拿个例子手动进行实现算一遍。这里借鉴了网络上的一个例子,求解如下的一个函数: f(x)x∗sin(10∗π∗x)2x∈[−1,2] f(x) = x*sin(10*\pi*x)+2 \\ x \in[-1, 2] 其函数图像为: 例子来源&a…

遗传算法及python实现

目录 一、遗传算法概念 二、遗传算法应用实例 基础概念: 1、种群和个体: 2、编码、解码与染色体: 3、适应度和选择: 4、 交叉、变异: 三、遗传算法python完整代码 “适者生存,不适者淘汰” …

遗传算法详解python代码实现以及实例分析

遗传算法 文章目录 遗传算法前言一、遗传算法是什么?二、实例讲解例题11.初始化种群2.优胜劣汰3.根据优胜劣汰的结果,交配生殖、变异5.生物遗传进化 例题21.初始化参数2.定义环境(定义目标函数)3.DNA解码(计算x&#x…

遗传算法实例解析

遗传算法实例及MATLAB程序解析 遗传算法Genetic Algorithms,GA)是一种基于自然选择原理和自然遗传机制的搜索(寻优)算法,它是模拟自然界中的生命进化机制,在人工系统中实现特定目标的优化。遗传算法的实质是…