[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)

news/2024/5/21 5:34:43

一、前言

在学习 C++ 服务端的过程中,必不可少的一项就是熟悉一个网络库,包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等,其中 muduo 是由陈硕大佬个人开发的 TCP 网络库,最近跟着课程正在深度剖析其内在,并跟着老师用c++11重构了Muduo库中核心的Multi-Reactor架构(Muduo库还有很多需要学习的内容,比如rpc、HTTP等通信协议,poll的使用等还没有进行学习,之后有机会会一一补上),所以在此写一个[muduo网络库]系列的一些梳理笔记,剖析一下大佬精妙的代码设计思想,希望能够理清自己的思路,也希望能够帮助到大家。
最后,本人为初学者,还在不断的摸索过程中,这个系列的内容可能存在大量不足,希望路过的各位大佬们,看到问题能够提出来,我一定虚心接受并且及时作出更正。希望大家能够持续关注这个系列,这也督促我能够一直写下去。
这一节先来介绍muduo网络库的模型。

二、muduo 模型

Muduo库是基于Reactor模式实现的TCP网络编程库。其中的重要组件是由**Event(事件)、Reactor(反应堆)、Demultiplex(事件分发器)和Evanthandler(事件处理器)**四部分构成的,其相互关系如下图所示:在这里插入图片描述

  • 首先,将事件Event注册到反应堆Reactor上,即将应用程序感兴趣的事件注册到反应堆上,请求反应堆帮助监听,若事件发生,反应堆调用应用程序预制的回调(handler),一个event对应一个handler;
  • 反应堆Reactor相当于是一个事件以及事件处理的集合,通过相应的方法在事件分发器Demultiplex里做一个相应的调整(add/mod/del event),然后启动事件循环(epoll_wait),服务器处于阻塞状态等待新用户的连接,或者已连接用户的读写事件
  • 如果epoll_wait监听到有新事件产生,分发器返回事件给反应堆,反应堆调用相应的事件处理器eventhandler;
  • eventhandler中读取用户的请求,解码,处理,打包,发送。

在muduo库的Reactor模型上:

  • Poller和EPollPoller就是Demultiplex
  • Channel封装了Event,里面存在fd,events,revents,以及相应的回调函数callbacks,其中有两种channel,acceptorChannel以及connectionChannel分别对应listenfd以及connfd
  • EventLoop就是Reactor

这也就看出muduo库的三个核心组件是:Channel类、Poller/EpollPoller类以及EventLoop类这三个组件之间的关系如下图所示:
在这里插入图片描述
代码地址:https://github.com/Cheeron955/mymuduo/tree/master
本小节就到这里,下一篇我会对着三个核心组件进行一个详细的剖析介绍,希望有需要的小伙伴可以持续关注哦~


http://www.mrgr.cn/p/87814343

相关文章

任天堂Switch全部记录

NS SWTICH大气层制作新的SD卡,解决部分大气层及固件问题。 原先的SD卡(128G)快全部放满游戏了,需要新的内存卡用于存放新的游戏。 有几张闲置的内存卡,可是容量最大只有64G, 无法通过直接全部复制+粘贴的办法,来启用新的小内存卡,涉及制作新的NS Switch SD卡有什么用 s…

用一个查询从销售订单直通供应商账单-NetSuite

朗读全文Your browser does not support the audio element. 有什么用 用一个查询从销售订单直通供应商账单 NetSuite: 从SO销售订单,到PO采购订单,到Bill供应商账单 下面文章的分享仅作为演示在SuiteQL Query Too中的展示,现实情况下的应用可以非常灵活(由于范围广泛…

ArrayList in C#

https://dotnettutorials.net/lesson/arraylist-collection-csharp/ c#中的数组列表是什么?c#中的ArrayList是一个非泛型集合类,它的工作方式类似于数组,但提供了动态调整大小、从集合中间添加和删除元素等功能。c#中的ArrayList可以用来添加未知数据,也就是说,当我们不知…

【JavaEE 初阶(四)】多线程进阶

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多线程知识 目录 1.前言2.常见的锁策略2.1悲观锁vs乐观锁2.2轻量级锁vs重量级锁2.3自旋锁vs挂起锁2.4读写…

bzoj4399: 魔法少女LJJ

先上头图:诈骗题认真读题 c<=7 只需要考虑前七个操作 一.动态开点即可 二.线段树合并 三.四.对于这两个操作,可以先统计出有多少个数小于/大于x,然后删除所有小于/大于x的数,并在x位置加上这些数 五.下放标记查询即可 六.每个数最大为1e9,直接乘肯定会炸,所以可以用do…

unity基础(一)

内容概要&#xff1a; 生命周期函数vector3 位置 方向 缩放旋转等信息Vector3欧拉角和Quaternion四元素unity脚本执行顺序设置 一 生命周期函数 方法说明Awake最早调用,所以一般可以再此实现单例模式OnEnable组件激活后调用,在Awake后会调用一次Start在Update之前调用一次&a…

信息安全技术-分析题【太原理工大学】

没有历年题或明确说明大题会考什么&#xff0c;以下为个人猜测 简答题和选择判断占60&#xff0c;认真看题库和总结&#xff0c;能过d(^_^o) 好像说是加解密这类题会给公式让你直接套&#xff0c;但还是看一下基本原理&#xff0c;要不到时候蒙圈 1.加密算法步骤 图 1 是一个采…

基于Springboot+Vue的Java项目-车辆管理系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

企业数据保护,从严防内部信息泄露开始

在当今的数字化时代,数据已成为企业最宝贵的资产之一。然而,随之而来的是数据安全威胁,尤其是内部信息泄露,这不仅会导致企业面临巨大的经济损失,还可能损害企业的品牌形象和客户信任。因此,从严防内部信息泄露开始,成为企业数据保护策略中的重要一环。确立内部数据分类…

实验四--代码审查

一、实验题目 :代码审查 二、实验目的 1、熟悉编码风格,利用开发环境所提供的平台工具对代码进行自动格式审查; 2、根据代码规范制定代码走查表,并按所制定的审查规范互审代码。 三、实验内容 1、IDEA环境和PyCharm环境二选一; IDEA环境 (1)预先准备在IDEA环境下实现对输…

回溯法、全排列、子集等

回溯法 感想&#xff1a;回溯算法本质是一个循环&#xff0c;有点像while循环 一些回溯法&#xff08;递归&#xff09;的经典应用 1.全排列 2.子集 其实上面两个点&#xff0c;也是对应着高中数学里面的“排列”与“组合” 1.全排列问题 给定一个集合S{a,b,c}&#xff0…

选择排序桌面检查

码云代码:https://gitee.com/yibo886/codes/0ihau3t9pj6bkfqzxcmnl93 博客园: 一、实验题目 :代码审查 二、实验目的 1、熟悉编码风格,利用开发环境所提供的平台工具对代码进行自动格式审查; 2、根据代码规范制定代码走查表,并按所制定的审查规范互审代码。 三、实验内容…

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突&#xff0c;需要修改tomcat的端口

更深层次理解传输层两协议【UDP | TCP】【UDP 缓冲区 | TCP 8种策略 | 三次握手四次挥手】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 再谈端口号 端口号的返回…

docker的一些命令 以及dockerFile语法

文件夹重新命名mv node-v14.18.1-linux-x64 node-v14.18.1 dokcer 命令 将linux的文件复制到docker容器里面 docker cp /usr/local/node-v14.18.1/ 8ec26052dfad:/usr/local/node-v14.18.1 将docker容器里面的文件复制到linux docker container cp ng…

代码审计-PHP模型开发篇动态调试反序列化变量覆盖TP框架原生POP链

知识点 1、PHP审计-动态调试-变量覆盖 2、PHP审计-动态调试-原生反序列化 3、PHP审计-动态调试-框架反序列化PHP常见漏洞关键字 SQL注入&#xff1a; select insert update delete mysql_query mysqli等 文件上传&#xff1a; $_FILES&#xff0c;type"file"&…

实验四:代码审查

一、实验题目 :代码审查 二、实验目的 1、熟悉编码风格,利用开发环境所提供的平台工具对代码进行自动格式审查; 2、根据代码规范制定代码走查表,并按所制定的审查规范互审代码。 三、实验内容 1、IDEA环境和PyCharm环境二选一; IDEA环境 (1)预先准备在IDEA环境下实现对输…

代码审查

一、实验题目 :代码审查 二、实验目的熟悉编码风格,利用开发环境所提供的平台工具对代码进行自动格式审查;根据代码规范制定代码走查表,并按所制定的审查规范互审代码。三、实验内容 PyCharm环境预先准备在PyCharm环境下实现对输入的n个整数进行排序的代码;利用Code Inspe…

炒美股怎么开户?

近年来&#xff0c;随着国内投资者对境外投资需求的不断增长&#xff0c;炒美股逐渐成为许多投资者的选择。然而&#xff0c;随着监管政策的不断完善&#xff0c;传统的互联网券商开户方式已经不再适用。那么&#xff0c;对于想要入场美股市场的投资者来说&#xff0c;该如何开…

实验四—代码审查

一、实验题目 :代码审查 二、实验目的 1、熟悉编码风格,利用开发环境所提供的平台工具对代码进行自动格式审查; 2、根据代码规范制定代码走查表,并按所制定的审查规范互审代码。 三、实验内容 1、IDEA环境和PyCharm环境二选一; IDEA环境 (1)预先准备在IDEA环境下实现对输…