Mudo C++網路庫第八章學習筆記
self發表於2018-10-24
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更高效;