首页 > 其他 > 详细

muduo 库的模型

时间:2020-03-01 17:40:47      阅读:71      评论:0      收藏:0      [点我收藏+]

muduo库是一个高质量的网络事件驱动库,使用的是非阻塞I/O 和多线程服务模型,这个模型中每一个I/O线程只有一个Reactor实例,处理读写和时间定时,激活的事件由回调方式提供用户处理业务逻辑。一个线程最多只有一个EventLoop 事件循环,而事件循环不停的监视着这些文件描述符,因此可以将不同的socket放到不同的进程中,在进行读写时,也是线程安全的,因为只有自己线程的EventLoop在读取他们,大大的降低了编程的复杂性。

EventLoop 事件一直循环检测,I/O复用机制采用了select/poll/epoll等回调激活的事件。

 

muduo网络库模块组成

  • Reactor  (反应器)由三部分组成:EventLoop Poller Chanal
  1. EventLoop:即I/O线程中的事件循环,它能确保所有注册的事件都在Eventloop所在的对象执行,是线程安全的,允许其他线程往里面塞东西
  2. 是一个I/O 多路分发的封装,由EventLoop 组成,为Eventloop 提供poll()方法
  3. 每一个chanal 对象,自始至终只负责一个fd的I/O事件分发,但不拥有这个fd ,因此不会析构这个fd,chanal会把不同的IO事件调用不同的回调方法:Readcallback(),Writrcallback()
  • TimerQueue (定时器)Eventfd
  1. TimerQueue,为EventLoop 提供了定时任务
  2. Eventfd: 这个是其他线程往EventLoop 中塞任务的核心
  • Acceptor(监听器)和Connector(连接器) 
  1. acceptor是TcpServer的主要组件,封装了服务端的监听部分,在非阻塞的网络编程中,accept的描述符可读,表示有新链接
  2. connector 是TcpClientd 的主要组件,connecttor 的套接字,若套接字可读可写,用getsockopt处理这个套接字上的错误,若返回为0 表示链接成功
  • TcpConnection(封装了一个TCP 连接)
  1.  Buffer:通过一个vector,和一个栈上的空间实现
  2. Socket:封装了一个套接字,管理这个套接字的生命周期
  3. TcpConnection  封装了一个tcp 连接,处理这个连接中的读写/错误,连接关闭等
  • TcpServer 和TcpClient
  1. TcpServer:主要是accept,当有一个连接时,就new 一个Tcpconnection保存在ConnectonMaps(Tcpconnection共享指针的一张映射表),有数据通过MessageCallback()回调通过用户使用
  2. TcpClient:主要组件事connector,根Tcpserver 基本一样,但是只管理一个Tcpconnection

TcpServer 时序图:

 

技术分享图片

 

AsyncLogging异步日志

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

 

muduo 库的模型

原文:https://www.cnblogs.com/lc-bk/p/12390693.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!