muduo网络库的设计与实现
- muduo是基于Reactor模式的C++网络库;
Reactor的关键结构
- Reactor最核心的是事件分发机制, 即将IO multiplexing拿到IO事件分发给各个文件描述符(fd)的事件处理函数;
- 每个Channel对象自始至终只负责一个文件描述符(fd)的IO事件分发, 但它并不拥有这个fd, 也不会在析构的时候关闭这个fd;
TimerQueue定时器
- 用timerfd给EventLoop加上定时器功能(和处理IO事件相同的方式来处理定时), 这样的代码一致性更好;
TCP No Delay 和 TCP keepalive
- TCP No Delay 和 TCP keepalive都是常用的TCP选项, 前者的作用是禁用Nagle算法, 避免连续发包出现延迟, 这对编写低延迟网络服务很重要;
- TCP keepalive的作用是定期检查TCP连接是否还存在;
- 如果有应用层心跳的话, TCP keepalive不是必需的;
高水位回调和低水位回调
- muduo使用HighWaterMarkCallback和WriteComleteCallback;
- muduo库的event loop pool由EventLoopThreadPool类表示;
- muduo库的TcpClient具备TcpConnection断开之后重新连接的功能, 加上Connector具有反复尝试连接的功能, 因此客户端和服务器的启动顺序无关紧要;
epoll
- epoll是Linux独有的高效的IO multiplexing机制, 它与poll的不同是:
- poll每次返回整个文件描述符数组, 用户要遍历数组以找到那些文件描述符上有IO事件;
- 而epoll_wait返回的是活动fd的列表, 需要遍历的数组通常会小得多;
- 在并发连接数较大而活跃连接比例不高时, epoll比poll更高效;