Muduo网络库的设计与实现[简易理解]
什么是Reactor模式?
Reaactor模式是一种同步事件驱动的设计模式,用于处理一个或者是多个输入源(如socket)并发产生的事件,他通过事件多路复用机制监听I/O事件,并将事件分发给对应的处理器进行处理
应用程序主动等待事件就绪(如可读、可写),然后由事件分发器通知相应的处理器进行I\O操作
什么是Procator模式?【前摄器模式】
Procator模式是一种异步事件驱动的设计模式,应用程序发起异步I\O操作后立即返回,有操作系统完成I\O操作,操作完成之后在通知应用程序处理结果。
应用程序只负责发起I\O操作和请求接收完成通知,真正的I\O操作有操作系统异步完成。
Muduo Reactor中三大核心组件
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类
- 实现一个基本的soket流程函数的封装,同时里面设计了TCP之间通话的一些简单优化
Buffer类
这个类跟我之前看的Webserver项目的Buffer设计思想一致,就是支持动态的现在Buffer内部进行空间的调整,看是否能够容纳新数据,实在不行了在进行扩容,对于边读取边写入的场景十分友好。
当写空间不够时,优先查看读指针之前的空间是否够这次的写入,如果够就将数据全部迁移。然后腾出后面的大部分的连续空间以供使用,如果实在不行了 在进行空间的扩容
TcpConnection类
- 主要的工作就是在线程中处理已建立链接的客户端的通信任务,比如发送数据、写数据、读数据、关闭链接以及链接错误等状态。