《muduo网络库》学习笔记——muduo学习总结

article/2025/11/6 18:54:29

muduo是基于非阻塞的IO和事件驱动的网络库(Reactor模式),其核心是一个事件循环EventLoop,用于响应计时器和IO事件。muduo采用基于对象(object-based)而非面向对象(object-oriented)的设计风格,其事件回调接口多以boost::function+boost::bind表达,用户在使用muduo的时候不需要继承其中的class,其总体结构是 one loop per thread+threadpool,描述如下:

其中,mainReactor和subReactor都是EventLoop,在mainReactor中接收连接,然后把建立后的连接分发到subReactor中。

muduo源代码的目录结构主要分为两大块:muduo/base 和muduo/net。在muduo/base中封装了和网络无关的基础类,例如日志、时间、队列、相互排斥量、条件变量、线程、线程池等。为后续网络库(muduo/net)的设计带来了极大便利。

在muduo/net中封装了和网络相关的操作,muduo是基于Reactor模式的设计的,结构如下:

UML关系介绍:

  • 聚合关系表示用带空心菱形和箭头的直线。聚合关系强调是“整体”包含“部分”,但是“部分”可以脱离“整体”而单独存在。
  • 组合关系表示用带实心菱形和箭头的直线。组合关系与聚合关系见得最大不同在于:这里的“部分”脱离了“整体”便不复存在。
  • 继承关系表示用带空心三角形和箭头的直线。由派生类指向基类。

核心类分析:

  1. EventLoop是整个模式的核心,它来管理全部事件。one loop per thread说明一个线程仅仅能有一个EventLoop。它封装了eventfd和timerfd,用来唤醒等待在poll上的线程;eventfd是在其它线程唤醒当前线程时使用的,把任务加入到EventLoop的任务队列后,假设不是EventLoop的owner线程,则要唤醒它来运行任务。timerfd用来实现定时。
  2. Poller是个虚基类,真正调用的时PollPoller或EPollPoller,用来实现IO的复用。事件都注册到Poller中,且Poller是EventLoop的成员,生命期由后者控制。
  3. Channel 是 selectable IO channel,负责注册与响应 IO 事件,它不拥有 file descriptor。它是 Acceptor、Connector、EventLoop、TimerQueue、TcpConnection 的成员,生命期由后者控制。它和fd是一一对应的关系。尽管Channel不拥有fd,fd须要响应哪些事件都保存在Channel中。且有相应的回调函数。
  4. Acceptor主要负责Tcp连接的建立。用在server。当建立连接后。它会把连接的控制权转交给TcpConnection。
  5. Connector是负责发起Tcp连接的一方,用在client。发起连接比接收连接要难。非阻塞发起连接更难,要处理各种错误,还要考虑连接失败后怎样处理。当连接成功后它会把控制权交给TcpConnection。
  6. TcpConnection是保存已经建立的连接。它的生命周期模式,因此采用shared_ptr来管理。它负责数据的发送和接收。负责socket fd的关闭。
  7. TcpServer是服务端,有Acceptor,用Map保存了当前已经连接的TcpConnection,一个TcpServer 对应一个TcpConnection 列表 和 一个 Acceptor。
  8. TcpClient是客户端,封装了Connector,一个TcpClient 对应一个TcpConnection 和一个 Connector
  9. TimerQueue 用 timerfd 实现定时,这有别于传统的设置 poll/epoll_wait 的等待时长的办法。为了简单起见,目前用链表来管理 Timer,如果有必要可改为优先队列,这样复杂度可从 O(n) 降为O(ln n) (某些操作甚至是 O(1))。它是 EventLoop 的成员,生命期由后者控制。
  10. EventLoopThreadPool 用于创建 IO 线程池,也就是说把 TcpConnection 分派到一组运行 EventLoop 的线程上。它是 TcpServer 的成员,生命期由后者控制。

技术要点:

  • muduo头文件使用前向声明(forward declaration),简化了头文件之间的依赖。(C++中的前向声明)
  • muduo采用基于对象(object-based)而非面向对象(object-oriented)的设计风格,其事件回调接口多以boost::function+boost::bind表达,采用绑定回调函数的手法,实现了事件和特定函数的绑定,更加易于理解和使用。
  • 对象生命周期的管理使用了shared_ptr。多线程中,对象的声明周期难以管理,一个线程难以推断对象是否已经析构。作者shared_ptr来管理对象声明周期。
  • 使用weak_ptr防止对象间相互引用。造成内存永久不释放。对于类内部的一些对象,使用scoped_ptr来管理。
  • 非阻塞网络库应用层为什么须要缓冲区,怎么设计缓冲区。发送过快,缓冲区增长太大怎么办。

 


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

相关文章

Ubuntu安装muduo库

1. 首先安装boost库; sudo apt-get update sudo apt-get install libboost-all-dev 2. 下载muduo库, https://github.com/chenshuo/muduo 3. 解压后进入解压目录,vim CMakeLists.txt,注释掉略过unit_test测试用例代码的编译&#…

linux muduo 编译安装,muduo记录

1.muduo编译安装 编译muduo遇见的报错可以在github上的issue上面查找。一般都能顺利解决,我遇到的就是没有安装boost-dev. centos7系统 执行: sudo yum install boost-dev 2.截取流程图 图片截取自《Linux多线程服务端编程:使用muduo C网络库》 3.源码摘录 摘录一个…

muduo源码分析之TcpServer模块

这次我们开始muduo源代码的实际编写,首先我们知道muduo是LT模式,Reactor模式,下图为Reactor模式的流程图[来源1] 然后我们来看下muduo的整体架构[来源1] 首先muduo有一个主反应堆mainReactor以及几个子反应堆subReactor,其中子反应…

muduo网络库学习(1)

muduo网络库学习(1) 文章目录 muduo网络库学习(1)前言一、muduo是什么?二、代码结构1.base库2.net库3.附属库 二、网络库结构总结 前言 本章节主要介绍muduo网络库的整体架构!一、muduo是什么?…

muduo

muduo 概述 muduo是基于Reactor模式的网络库,用于响应计时器和IO事件。 muduo采用基于对象而非面向对象的设计风格,其事件回调采用functionbind,用户在使用muduo的时候不需要继承其中的class 架构 Multiple Reactor Reactor模式&#xff1a…

muduo日志库原理以及源码分析

muduo日志库特点 日志批量写入批量唤醒写线程写日志用notifywait_timeout 方式触发日志的写入锁的粒度,双缓冲,双队列buffer默认 4M 缓冲区, buffers 是 buffer 队列, push 、 pop 时使用 move 语义 减少内存拷贝 muduo的这些特点…

muduo网络库与服务模型介绍

目录 一、muduo网络库简介 1、特点 2、代码结构 (1)公共接口 (2)内部实现 二、muduo线程模型 1、单线程Reactor 2、Reactor线程池 3、one loop per thread 4、one loop per thread 线程池 muduo是陈硕个人使用C开发的一…

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上能够运行。 当我在学习这段程序时,发现结果仍存在很大问题(不稳定、不准确)。我一行一行看时,发现不仅有少…