[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

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

相关推荐
不知所云,2 分钟前
2.windows c/c++ 编译器安装, mingw和clang
c语言·c++·windows·mingw·clang·c编译器
前端程序猿i5 分钟前
前端判断数据类型的所有方式详解
开发语言·前端·javascript
爪哇部落算法小助手11 分钟前
爪哇周赛 Round 3
数据结构·c++·算法
m***667313 分钟前
Java实战:Spring Boot application.yml配置文件详解
java·网络·spring boot
@YDWLCloud17 分钟前
做独立站,用阿里云国际版还是 Cloudflare?答案出乎意料
服务器·网络·阿里云·云计算
二川bro19 分钟前
内存泄漏检测:Python内存管理深度解析
java·开发语言·python
k***817220 分钟前
PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案
开发语言·redis·php
十五年专注C++开发21 分钟前
Mimalloc:一款高性能、低开销和线程安全的C++内存分配器
c++·内存分配·mimalloc
Not Dr.Wang42223 分钟前
实验三:基于matlab的积分分离PID控制算法
开发语言·matlab
lly20240625 分钟前
Razor VB 循环:深度解析与实例教学
开发语言