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

一、前言

在学习 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

本小节就到这里,下一篇我会对着三个核心组件进行一个详细的剖析介绍,希望有需要的小伙伴可以持续关注哦~

相关推荐
无心水10 小时前
【分布式利器:RocketMQ】2、RocketMQ消息重复?3种幂等方案,彻底解决重复消费(附代码实操)
网络·数据库·rocketmq·java面试·消息幂等·重复消费·分布式利器
夏霞10 小时前
c# ASP.NET Core SignalR 客户端与服务端自动重连配置指南
开发语言·c#·asp.net
重启编程之路11 小时前
python 基础学习socket -TCP编程
网络·python·学习·tcp/ip
小张成长计划..11 小时前
【C++】2:cin和cout的介绍和使用,函数的缺省参数
c++
@老蝴11 小时前
Java EE - 常见的死锁和解决方法
java·开发语言·java-ee
Hqst_xiangxuajun11 小时前
服务器主板选用网络变压器及参数配置HX82409S
运维·服务器·网络
再卷也是菜11 小时前
C++篇(17)哈希拓展学习
c++·哈希
“愿你如星辰如月”11 小时前
Linux:进程间通信
linux·运维·服务器·c++·操作系统
老蒋新思维12 小时前
陈修超入局:解锁 AI 与 IP 融合的创新增长密码
网络·人工智能·网络协议·tcp/ip·企业管理·知识付费·创客匠人
xxtzaaa12 小时前
告别IP关联烦恼,多部手机如何实现不同IP防封号
网络·网络协议·tcp/ip