本人蔘照《Linux多線程服務端編程》,以及模仿該書使用的muduo,寫了一個輕量的 Web 服務器。
源碼
Github。代碼中有比較詳細的註釋,可作爲看《Linux多線程服務端編程》得輔助材料。
已完成
- 完成基本的Tcp(被動連接)庫;
- 簡易的HTTP服務器,可訪問主頁HTML和網站favicon圖標。
技術
-
主從 reactor 模式:
- 主 reactor 負責監聽連接,當有新的連接,accept 到新的 socket 後,使用 Round Robin 方法選擇從 reactor,將 socket 派發給從 reactor;
- 從 reactor 負責管理時間描述符(timerfd用於定時任務)、事件描述符(eventfd 用於喚醒 IO 線程)和 派發過來的 socket 文件描述符。
- multiple reactors + thread pool (one loop per thread + threadpool);
- EventLoop:使用 Epoll 水平觸發的 IO 多路複用技術,非阻塞 IO;
-
線程池:
- 使用多線程能發揮多核的優勢;
- 線程池可以避免線程的頻繁地創建和銷燬的開銷。
- 簡單的日誌系統;
- 使用智能指針等 RAII 機制,來爲降低內存泄漏的可能性;
併發模型
併發模型爲 multiple reactors + thread pool (one loop per thread + threadpool); + 非阻塞 IO,新連接使用 Round Robin 策略派發。
壓測
壓測結果。