当前位置: 首页 > news >正文

muduo - 概要简述

  • 作者:陈硕

  • 编程语言:C++

  • 架构模式:Reactor

  • 代码链接:GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C++11

  • 设计自述:https://www.cnblogs.com/Solstice/archive/2010/08/29/muduo_net_lib.html

    • 以下内容,主要援引于自述

设计目标

  • 线程安全,支持多线程

  • 只支持 Linux,不支持 Windows

  • IO multiplexing 使用 poll 和 epoll

  • 主要支持 x86-64,兼顾 IA32

  • 不支持 UDP,只支持 TCP

  • 不支持 IPv6,只支持 IPv4

  • 不考虑广域网应用,只考虑局域网

  • 只支持一种使用模式:non-blocking IO + one event loop per thread,不考虑阻塞 IO

  • API 简单易用,只暴露具体类和标准库里的类,不使用 non-trivial templates,也不使用虚函数

  • 只做 library,不做成 framework

  • 争取全部代码在 5000 行以内(不含测试)

  • 搭配 Google Protocol Buffers RPC

实现简述

Muduo是基于Reactor模式的网络库,其核心是个事件循环EventLoop,用于响应计时器和IO事件。Muduo采用基于对象(object based)而非面向对象(object oriented)的设计风格,其接口多以boost::function + boost::bind表达。

头文件关系

  • 白底:public
  • 黑底:private

接口细节

公开接口

  • Buffer仿 Netty ChannelBuffer 的 buffer class,数据的读写通过 buffer 进行

  • InetAddress封装 IPv4 地址 (end point),注意,muduo 目前不能解析域名,只认 IP

  • EventLoop反应器 Reactor,用户可以注册计时器回调

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

  • TcpConnection整个网络库的核心,封装TCP连接

  • TcpClient用于编写网络客户端,能发起连接,并且有重试功能

  • TcpServer用于编写网络服务器,接受客户的连接

  • 在这些类中,TcpConnection的生命期依靠 shared_ptr 控制(即用户和库共同控制)。Buffer的生命期由TcpConnection控制。其余类的生命期由用户控制。

  • HttpServer 和 Inspector,暴露出一个 http 界面,用于监控进程的状态,类似于 Java JMX。这么做的原因是,《程序员修炼之道》第 6 章第 34 条提到“对于更大、更复杂的服务器代码,提供其操作的内部试图的一种漂亮技术是使用内建的 Web 服务器”,Jeff Dean 也说“(每个 Google 的服务器进程)Export HTML-based status pages for easy diagnosis”。

内部实现

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

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

  • SocketsOps 封装各种 sockets 系统调用。

  • EventLoop封装事件循环,也是事件分派的中心。它用 eventfd(2) 来异步唤醒,这有别于传统的用一对 pipe(2) 的办法。它用 TimerQueue 作为计时器管理,用 Poller 作为 IO Multiplexing。

  • Poller是 PollPoller 和 EPollPoller 的基类,采用“电平触发”的语意。它是 EventLoop 的成员,生命期由后者控制。

  • PollPollerEPollPoller封装 poll(2) 和 epoll(4) 两种 IO Multiplexing 后端。Poll 的存在价值是便于调试,因为 poll(2) 调用是上下文无关的,用 strace 很容易知道库的行为是否正确。

  • Connector用于发起 TCP 连接,它是 TcpClient 的成员,生命期由后者控制。

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

  • TimerQueuetimerfd实现定时,这有别于传统的设置 poll/epoll_wait 的等待时长的办法。为了简单起见,目前用链表来管理 Timer,如果有必要可改为优先队列,这样复杂度可从 O(n) 降为 O(ln n) (某些操作甚至是 O(1))。它是EventLoop的成员,生命期由后者控制。

  • EventLoopThreadPool用于创建IO线程池,也就是说把 TcpConnection 分派到一组运行 EventLoop 的线程上。它是 TcpServer 的成员,生命期由后者控制。

线程模型

Muduo的线程模型符合one loop per thread + thread pool模型。

  • 每个线程最多有一个 EventLoop

  • 每个TcpConnection必须归某个EventLoop管理:所有IO操作,所有FDFile Descriptor读写

    • TcpConnection所在的线程由其所属的EventLoop决定

    • TcpConnectionEventLoop是线程安全的,可以跨线程调用

  • TcpServer直接支持多线程,它有两种模式:

    • 单线程,AcceptorTcpConnection用同一个线程做IO。

    • 多线程,AcceptorEventLoop在同一个线程,另外创建一个EventLoopThreadPool,新到的连接会按Round-Robin方式分配到线程池中。

相关文章:

muduo - 概要简述

作者:陈硕 编程语言:C 架构模式:Reactor 代码链接:GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C11 设计自述:https://www.cnblogs.com/Solstice/archive/2010/08…...

Selenium点击元素的方法

前言 点击方法在web自动化测试中经常用到,下面就来介绍一下selenium常用和不常用的点击方法; 1、常用方法 1.1、使用 click() 方法: 这是最简单和最常用的方法。通过选中要点击的元素,然后使用 click() 方法来触发点击事件。 示例代码: element = self.driver.find_e…...

kali里面搭建docker容器

注意事项:kali版本,镜像源 (1)权限为管理员: sudo su (2) 更新软件包列表并升级已安装的软件包 apt-get update apt-get upgrade 出错了,应该是更新源出问题了。 (3)更换镜像源&am…...

WebGL系列教程八(GLSL着色器基础语法)

目录 1 前言2 基本原则3 基本数据类型4 顶点着色器和片元着色器4.1 声明4.2 初始化项目4.3 赋值 5 结构体5.1 声明5.2 赋值 6 函数6.1 基本结构6.2 自定义函数6.3 常用内置函数 7 精度8 其他9 总结 1 前言 通过前七讲,我们已经见过了WebGL中的部分基础语法&#xff…...

go多线程

1、简单使用(这个执行完成,如果进程执行比较久,这里不会等待它们结束) package mainimport "time"func main() {go func() {println("Hello, World!")}()time.Sleep(1 * time.Second) }2、wg.Add(数量)使用&…...

【话题】如何看待IBM中国研发部裁员?

(一)背景 在全球化的大趋势下,跨国公司的业务布局一直处于动态调整之中。IBM 作为全球知名的 IT 企业,在中国市场已经运营多年,其在中国的研发中心曾经为公司的全球业务发展做出了重要贡献。近年来,全球经…...

【C/C++】涉及string类的经典OJ编程题

【C/C】涉及string类的经典OJ编程题 一. 把字符串转化成整数(atoi)解法一:(不用long)完整代码:解法二:(用long) 二.字符串相加代码实现(含注释)&a…...

淘系等电商平台API接口系列:商品详情数据解析,json数据返回参考

——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 在淘系(如淘宝、天猫)等电商平台中,商品详情数据…...

vue组件之间的数据共享

一、组件之间的关系 1.父子关系 2.兄弟关系 3.后代关系 二、父子组件之间的数据共享 1.父-->子共享数据 父组件通过v-bind属性绑定向子组件共享数据&#xff0c;子组件需要使用props接受数据。 <template><p>父组件</p><Son :msg"msg"…...

LangChain:构建强大的LLM应用的全方位框架

LangChain&#xff1a;构建强大的LLM应用的全方位框架 引言 在人工智能和大语言模型&#xff08;LLMs&#xff09;快速发展的今天&#xff0c;开发者们迫切需要一个强大而灵活的框架来简化LLM应用的开发过程。LangChain应运而生&#xff0c;它不仅提供了丰富的工具和组件&…...

自有平台自有品牌如何利用电商API接口做定价参考(多平台商品详情数据接口)

如今&#xff0c;多数自有商城自有品牌在为产品做定价时都会参考淘宝|天猫|京东等主流电商平台的商品价格以做参考&#xff0c;这一行为的好处主要有以下几点&#xff1a; 通过参考主流平台价格&#xff0c;用户更能了解目标市场中消费者对产品的接受度&#xff0c;从而制定出符…...

三万字长文Java面试题——基础篇(注:该篇博客将会一直维护 最新维护时间:2024年9月18日)

&#x1f9f8;本篇博客重在讲解Java基础的面试题&#xff0c;将会实时更新&#xff0c;欢迎大家添加作者文末联系方式交流 &#x1f4dc;JAVA面试题专栏&#xff1a;JAVA崭新面试题——2024版_dream_ready的博客-CSDN博客 &#x1f4dc;作者首页&#xff1a; dream_ready-CSDN博…...

数学建模——熵权+TOPSIS+肘部法则+系统聚类

文章目录 一、起因二、代码展示 一、起因 我本科的数学建模队长找上我&#xff0c;让我帮她写下matlab代码&#xff0c;当然用的模型还是曾经打比赛的模型&#xff0c;所以虽然代码量多&#xff0c;但是写的很快&#xff0c;也是正逢中秋&#xff0c;有点时间。 当然我也没想到…...

Java | Leetcode Java题解之第403题青蛙过河

题目&#xff1a; 题解&#xff1a; class Solution {public boolean canCross(int[] stones) {int n stones.length;boolean[][] dp new boolean[n][n];dp[0][0] true;for (int i 1; i < n; i) {if (stones[i] - stones[i - 1] > i) {return false;}}for (int i 1…...

828华为云征文|华为Flexus云服务器搭建OnlyOffice私有化在线办公套件

一、引言 在当今数字化办公的时代&#xff0c;在线办公套件的需求日益增长。华为Flexus云服务器凭借其强大的性能和稳定性&#xff0c;为搭建OnlyOffice私有化在线办公套件提供了理想的平台。在2024年9月14日这个充满探索精神的日子里&#xff0c;我们开启利用华为Flexus云服务…...

[Java]maven从入门到进阶

介绍 apache旗下的开源项目,用于管理和构建java项目的工具 官网: Welcome to The Apache Software Foundation! 1.依赖管理 通过简单的配置, 就可以方便的管理项目依赖的资源(jar包), 避免版本冲突问题 优势: 基于项目对象模型(POM),通过一小段描述信息来管理项目的构建 2…...

Leetcode面试经典150题-130.被围绕的区域

给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O 组成&#xff0c;捕获 所有 被围绕的区域&#xff1a; 连接&#xff1a;一个单元格与水平或垂直方向上相邻的单元格连接。区域&#xff1a;连接所有 O 的单元格来形成一个区域。围绕&#xff1a;如果您可以用 X 单…...

Ruffle 继续在开源软件中支持 Adobe Flash Player

大多数人已经无需考虑对早已寿终正寝的 Adobe Flash 的支持&#xff0c;但对于那些仍有一些 Adobe Flash/SWF 格式的旧资产&#xff0c;或想重温一些基于 Flash 的旧游戏/娱乐项目的人来说&#xff0c;开源 Ruffle 项目仍是 2024 年及以后处理 Flash 的主要竞争者之一。 Ruffl…...

【postgres】笔记

数据库相关笔记 1.分区表创建时间戳设置问题2.查询语句2.1查询数据库某表有多少行2.2 表中某列值类型是 1.分区表创建时间戳设置问题 今天早上发现postgres数据库表中总会隔4天丢失一天的数据&#xff0c;后来查了一下&#xff0c;发现是分区表创建的有问题。 如图所示 可以看…...

#if等命令的学习

预处理命令 #include&#xff08;文件包含命令&#xff09; #define&#xff08;宏定义命令&#xff09; #undef #if&#xff08;条件编译&#xff09; #ifdef #ifndef #elif #endif defined函数&#xff08;与if等结合使用&#xff09; 下面将解释上述各自的用法、使用…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...