muduo库是一个高质量的网络事件驱动库,使用的是非阻塞I/O 和多线程服务模型,这个模型中每一个I/O线程只有一个Reactor实例,处理读写和时间定时,激活的事件由回调方式提供用户处理业务逻辑。一个线程最多只有一个EventLoop 事件循环,而事件循环不停的监视着这些文件描述符,因此可以将不同的socket放到不同的进程中,在进行读写时,也是线程安全的,因为只有自己线程的EventLoop在读取他们,大大的降低了编程的复杂性。
EventLoop 事件一直循环检测,I/O复用机制采用了select/poll/epoll等回调激活的事件。
muduo网络库模块组成
- Reactor (反应器)由三部分组成:EventLoop Poller Chanal
- EventLoop:即I/O线程中的事件循环,它能确保所有注册的事件都在Eventloop所在的对象执行,是线程安全的,允许其他线程往里面塞东西
- 是一个I/O 多路分发的封装,由EventLoop 组成,为Eventloop 提供poll()方法
- 每一个chanal 对象,自始至终只负责一个fd的I/O事件分发,但不拥有这个fd ,因此不会析构这个fd,chanal会把不同的IO事件调用不同的回调方法:Readcallback(),Writrcallback()
- TimerQueue,为EventLoop 提供了定时任务
- Eventfd: 这个是其他线程往EventLoop 中塞任务的核心
- Acceptor(监听器)和Connector(连接器)
- acceptor是TcpServer的主要组件,封装了服务端的监听部分,在非阻塞的网络编程中,accept的描述符可读,表示有新链接
- connector 是TcpClientd 的主要组件,connecttor 的套接字,若套接字可读可写,用getsockopt处理这个套接字上的错误,若返回为0 表示链接成功
- TcpConnection(封装了一个TCP 连接)
- Buffer:通过一个vector,和一个栈上的空间实现
- Socket:封装了一个套接字,管理这个套接字的生命周期
- TcpConnection 封装了一个tcp 连接,处理这个连接中的读写/错误,连接关闭等
- TcpServer:主要是accept,当有一个连接时,就new 一个Tcpconnection保存在ConnectonMaps(Tcpconnection共享指针的一张映射表),有数据通过MessageCallback()回调通过用户使用
- TcpClient:主要组件事connector,根Tcpserver 基本一样,但是只管理一个Tcpconnection
TcpServer 时序图:

AsyncLogging异步日志
AsyncLogging一个C++Stream风格的多线程安全非阻塞日志,是muduo库中的另一个部分组成,这个日志使用了双缓冲机制,这样新建的日志不必等待磁盘操作,也避免了每条新的日志都触发日志线程,而是将多条日志拼程一个大的buffer 和后端buffer交换,后端线程就实时将后端buffer写入本地文件. 相当于批处理,减少线程唤醒频率 ,大大降低开销。
muduo 库的模型
原文:https://www.cnblogs.com/lc-bk/p/12390693.html