muduo - 概要简述

news2024/9/21 4:23:53
  • 作者:陈硕

  • 编程语言: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方式分配到线程池中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MybatisPlus:多条件 or()的使用

default List<ErpProductDO> selectByOE(String oe1, String oe2){return selectList(new LambdaUpdateWrapper<ErpProductDO>().eq(ErpProductDO::getOe,oe1).or().eq(ErpProductDO::getOe,oe2)); } 对应SQL为&#xff1a;

《探索云原生与相关技术》

在当今的科技领域中&#xff0c;云原生&#xff08;Cloud Native&#xff09;已经成为了一个热门的话题。它代表着一种构建和运行应用程序的全新方式。 云原生的概念 云原生是一套技术体系和方法论&#xff0c;旨在充分利用云计算的优势来构建更具弹性、可扩展性和高效性的应…

LeetCode 2332.坐上公交的最晚时间 (双指针 + 贪心)

给你一个下标从 0 开始长度为 n 的整数数组 buses &#xff0c;其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一个下标从 0 开始长度为 m 的整数数组 passengers &#xff0c;其中 passengers[j] 表示第 j 位乘客的到达时间。所有公交车出发的时间互不相同&#xff0c;…

python 识别省市、区县并组建三级信息数据库

一、网址&#xff1a; 全国行政区划信息查询平台 二、分析并搭建框架 检查网页源码&#xff1a; 检查网页源码可以发现&#xff1a; 所有省级信息全部在javaScript下的json中&#xff0c;会在页面加载时加载json数据&#xff0c;填充到页面的option中。 1、第一步&#xff1a…

1、2、3、4四个数字能组成多少个互不相同且无重复数字的三位数

要求 请编写函数fun&#xff0c;其功能是:找出用1、2、3、4四个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff0c;然后把这些三位数按从小到大的顺序依次存入相应的数组xxx中&#xff0c;符合条件的个数由函数值返回 解题思路 本题要求求出一个三位数&…

c++基础入门三

文章目录 C基础入门(三)auto关键字auto简介使用细则一、可以和指针联合使用二、在一行定义多个变量 不能使用场景一、不能作为函数的参数二、不能用来声明数组 基于for的循环使用条件 指针空值nullptr C基础入门(三) 回顾上集&#xff0c;我们介绍了C的函数重载&#xff0c;引…

初识ZYNQ——FPGA学习笔记15

一、ZYNQ简介 ZYNQ&#xff1a;Zynq-7000 All Programmable SoC&#xff08;APSoC&#xff09;&#xff0c;赛灵思公司&#xff08;AMD Xilinx&#xff09;推出的新一代全可编程片上系统 PS&#xff1a;Processing System&#xff0c;处理系统 PL&#xff1a;Program Logic&…

C++ 类的默认成员函数- 拷贝构造函数

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称…

十四,在Spring Boot当中对应“ Tomcat 服务器的相关配置”和“服务器的切换”的详细说明

十四&#xff0c;在Spring Boot当中对应“ Tomcat 服务器的相关配置”和“服务器的切换”的详细说明 文章目录 十四&#xff0c;在Spring Boot当中对应“ Tomcat 服务器的相关配置”和“服务器的切换”的详细说明1. 基本介绍2. 准备工作&#xff1a;3. 内置 Tomcat 的配置3.1 第…

C++速通LeetCode中等第3题-盛最多水的容器

双指针法&#xff1a;两个指针分别指向左右边界&#xff0c;记录最大面积&#xff0c;由于面积由短板决定&#xff0c;两个指针中较短的短指针向内移动一格&#xff0c;再次记录最大面积&#xff0c; 直到两指针相遇&#xff0c;得出答案。 class Solution { public:int maxAr…

其他图嵌入方法(6)

前面写了图神经网络可以把节点或图映射到一个低维空间&#xff0c;我们将其称为图嵌入。然而&#xff0c;除了图神经网络还有许多的图嵌入方法。本节将介绍其他浅层图嵌入方法。早在图神经网络发明之前&#xff0c;图嵌入的概念就经常出现在流形学习和网络分析的研究中。相对于…

科技引领未来生活——“光影漫游者”展览馆应用—轻空间

随着科技的快速发展&#xff0c;展览馆作为展示文化、科技和艺术的场所&#xff0c;正逐渐从传统的静态展示向高科技互动体验转变。由轻空间打造的“光影漫游者”展览馆&#xff0c;凭借其前沿的气承式结构和智能化系统&#xff0c;将参观者带入了一个未来感十足、充满科技魅力…

海外服务器哪个速度最快且性能稳定

海外服务器的速度与性能稳定性受多种因素影响&#xff0c;包括地理位置、网络架构、基础设施质量以及用户网络路径等。在众多选择中&#xff0c;几个特定地区的服务器因其卓越表现而备受推崇。 首先&#xff0c;美国硅谷(加利福尼亚州)与纽约的服务器以其技术领先、网络连接稳定…

OceanBase 中 schema 的定义与应用

背景 经常在OceanBase 的问答社区 里看到一些关于 “schema 是什么” 的提问。 先纠正一些同学的误解&#xff0c; OceanBase 中的 Schema 并不简单的等同于 Database&#xff0c;本次分享将探讨 OceanBase 中的Schema是什么&#xff0c;及一些大家经常遇到的问题。 具体而…

2023 hnust 湖科大 毕业实习 报告+实习鉴定表

2023 hnust 湖科大 毕业实习 报告实习鉴定表 岗位 IT公司机房运维 实习报告 实习鉴定表 常见疑问 hnust 湖科大 毕业实习常见问题30问&#xff08;2021 年7月&#xff0c;V0.9&#xff09;-CSDN博客时间&#xff1a;大四开学第三四周毕业实习23年是企业&#xff08;黑马&am…

【H2O2|全栈】关于CSS(6)CSS基础(五)

目录 CSS基础知识 前言 准备工作 网页项目规范 创建项目 布局 补充一部分属性 outline border-radius 预告和回顾 后话 CSS基础知识 前言 本系列博客将分享层叠样式表&#xff08;CSS&#xff09;有关的知识点。 本期博客主要分享的是网页项目规范&#xff0c;ou…

算法训练——day16快乐数

202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为…

STM32快速复习(十二)FLASH闪存的读写

文章目录 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f;二、使用步骤1.标准库函数2.示例函数 总结 一、FLASH是什么&#xff1f;FLASH的结构&#xff1f; 1、FLASH简介 &#xff08;1&#xff09;STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&…

【无标题】Java_Se 数据变量与运算符

标识符、变量、常量、数据类型、运算符、基本数据类型的类型转换等。这些是编程中的“砖块”&#xff0c;是编程的基础。要想开始正式编程&#xff0c;还需要再学“控制语句”&#xff0c;控制语句就像“水泥”&#xff0c;可以把“砖块”粘到一起&#xff0c;最终形成“一座大…

react学习笔记一:react介绍

将view规划成一个个的组件&#xff0c;是一个响应式的声明式的设计。 虚拟dom&#xff0c;减少dom操作。vue的虚拟dom是在react的基础上拓展来的。 单向数据流&#xff1a;是一种数据流动的模式。数据流的方向是有上到下的&#xff0c;在react中主要是从父组件流向子组件。 …