Skip to main content

Command Palette

Search for a command to run...

Muduo网络库的设计与实现[简易理解]

Updated
1 min read

什么是Reactor模式?

  • Reaactor模式是一种同步事件驱动的设计模式,用于处理一个或者是多个输入源(如socket)并发产生的事件,他通过事件多路复用机制监听I/O事件,并将事件分发给对应的处理器进行处理

  • 应用程序主动等待事件就绪(如可读、可写),然后由事件分发器通知相应的处理器进行I\O操作

什么是Procator模式?【前摄器模式】

  • Procator模式是一种异步事件驱动的设计模式,应用程序发起异步I\O操作后立即返回,有操作系统完成I\O操作,操作完成之后在通知应用程序处理结果。

  • 应用程序只负责发起I\O操作和请求接收完成通知,真正的I\O操作有操作系统异步完成。

Muduo Reactor中三大核心组件

4a581fac3dc313bed38797871a097ff6.png

Channel类:就是fd在Poll中的保姆

1.每一个fd分配一个Channel,Channel就来负责管理fd关心的事件、负责帮助fd注册新事件【这里,外部通过调用Channel的成员函数将fd关心的事件注册】、同时当事件发生时负责将事件翻译然后调用对应的回调函数进行处理 2.成员概览

成员类型作用
fd_int这个Channel对象照看的文件描述符
events_int文件描述符最开始关注的事件类型集合
revents_int事件监听器实际上监听到fd_关心的事件集合【类似于我们在使用基础的epoller时的输入事件集合,以及epoll_wait实际监听到的返回的事件集合的关系】,通过外部调用set_events可以更新这个revents_
EventLoop*表示这个fd_属于那个eventLoop_对象
callback_*多个callback函数,根据revents_接收到的事件类型来调用对应的回调函数进行处理

Poller\Epoller类:一个事件监听器

  • 这里的Epoller类的作用我认为与基本的Epoll没有什么区别 只是根据Muduo这个库的数据集情况进行一些调衡的的设计

EventLoop类

  • 每一个EventLoop对象都绑定一个线程,这个EventLoop对象每次循环的接收一批又一批的Client,循环处理他们的请求

Acceptor类

  • 这个类是用于监听的文件描述符的专门的一个类,他是封装了实现负载均衡分配的一个处理新的链接的函数【handleread】

Socket类

c486ecd073a5c32440595a89f0a6b2d3.png

  • 实现一个基本的soket流程函数的封装,同时里面设计了TCP之间通话的一些简单优化

Buffer类

6f4338e647dc363375207c36c627dc01.png

  • 这个类跟我之前看的Webserver项目的Buffer设计思想一致,就是支持动态的现在Buffer内部进行空间的调整,看是否能够容纳新数据,实在不行了在进行扩容,对于边读取边写入的场景十分友好。

  • 当写空间不够时,优先查看读指针之前的空间是否够这次的写入,如果够就将数据全部迁移。然后腾出后面的大部分的连续空间以供使用,如果实在不行了 在进行空间的扩容

TcpConnection类

  • 主要的工作就是在线程中处理已建立链接的客户端的通信任务,比如发送数据、写数据、读数据、关闭链接以及链接错误等状态。

More from this blog

Redis学习

1.什么是SSD HDD作为存储传统的数据库? SSD:固态硬盘---使用闪存芯片存储数据 无机械部件 特点:读写速度快(尤其是随机读写)、延迟低、抗震性好,但单位容量成本较高。 HDD:机械硬盘--传统机械硬盘 特点:容量大、成本低,但读写速度较慢(尤其是随机读写),延迟高。 2.什么是非易失性持久化 非易失性持久化 = 靠谱的硬件 (断电不丢数据的 SSD/PMEM) + 严谨的软件策略 (确

Mar 4, 20261 min read

分布式存储系统面试问题解析

共识算法剖析 raft共识算法 1.在你的 C++ 实现中,如果 Leader 发送 AppendEntries 给 Follower,但 Follower 的日志落后太多(比如中间缺了 100 条),Raft 论文建议是一个一个往前找(nextIndex--)。这种做法在高性能存储中显然是不可接受的,你会如何优化这个“回溯”过程? 在工程实现中,我会从两个维度优化日志冲突后的同步效率: 1. 快

Feb 9, 202613 min read

Unix环境编程:杂谈

动态加载 API 进程管理 什么是进程 进程的创建 进程的终止与遗言函数 进程资源回收 进程的映像更新 ps -o pid,ppid,pgrp,comm 这个linux命令是将当前终端上运行的进程打印出来 进程中使用环境变量 子进程环境变量改变 不会更改父进程的环境变量 进程间通信 有名管道不存储数据 其本身大小为 0 当一个进程写入数据进去时 如果没有进程读取数据那么该写进程就会堵塞在哪里 同理 如果读进程想要读取数据 但是却没有数据...

Jan 30, 20263 min read

Unix环境编程:第一章

1.1操作系统的介绍 1.2 计算机系统的分层 1.3 编译过程 ?上一个命令的运行结果 echo 就是输出上一个命令的运行结果 哎linux环境下文件中查找一个元素 即在命令模式下 输入/+你要查找的字符 即/printf 这样 然后找到之后 n表示查找下一条 shift+n表示上一条 file+文件名 查=查看文件是否可运行 1.4 多模块开发 变量的定义是为变量扩充作用域 而变量的声明需要为变量内存空间 gcc -c 文件 检验是否存在语法错误 nm 目标文...

Jan 30, 20261 min read

C++ Stl杂项

迭代器特性 输入流的容器特性 迭代器对算法的影响 仿函数和函数对象 分配器 对于平常的我们内存的使用,直接使用new delete 即可 使用分配器的话还需要记住自己当时申请了多少的内存 很不方便 哈希表深度探索 哈希容器 哈希表在扩充时,会先将自身大小乘以2 然后在选择自身2倍距离最近的一个质数 作为新的大小 哈希函数 以哈希表为底层支撑的适配器 红黑树 容器 list容器 forward_list 对于标准库,其本身提供一个sort排序函数,但某些容器也提供sort服务...

Jan 29, 20261 min read

xianyu-sheng

29 posts