TinyWeb–C++構建高效能Web伺服器

李振虎發表於2019-05-11

C++構建高效能Web伺服器——Step 0:前言

一、想法:

  • 一直想用C++做個專案,因為比較喜歡網路通訊這部分,又讓事情變得更有些挑戰性,我最終選擇實現一個高效能的Web伺服器。
  • 在巨集觀上我希望TinyWeb能夠這樣:

    • 配置簡單
    • 擴充套件容易
    • 效能高效
    • 功能強大
  • 並希望在開發的過程中能夠掌握以下知識:

    • Unix環境程式設計的技能
    • Unix網路程式設計的技能
    • 鞏固C++11知識
    • 掌握構建大型C++專案的技能
    • 掌握多程式、多執行緒同步、通訊機制
    • 實現高效能可複用Memory-pool
    • 掌握基本的資料結構(紅黑樹、連結串列、Hash)
    • 能夠把通用的網路部分作為單獨的網路庫、為以後網路開發提升效率
  • TinyWeb 目前的功能是:

    • 基本的Web服務,只能提供靜態網頁服務。
    • 單程式+Reactor+非阻塞方式執行
    • 只能用於Linux系統,不專注跨平臺
    • 基本的Web服務配置
  • TinyWeb 目前的發展計劃:

    • 使用程式池的方式提高併發性
    • 強有力的支援多種版本Http協議
    • 負載均衡功能
    • 代理功能

二、設計思想

1. 網路中最麻煩的是如何處理阻塞的事件:

如果IO事件沒有發生,系統阻塞的等待IO事件發生,那麼CPU就被
浪費了,為實現高併發,不能讓程式阻塞,CPU等待IO事件.
藉助Linux高效的Epoll機制,

至於為何使用Epoll,而不使用Select或Poll,點這裡看看吧.

2.為了提高併發性:到底是選擇多程式還是多執行緒模式

多程式與多執行緒各有優缺點,並且大部分是互補的,具體就不再贅述了,
詳情請戳這裡
我選擇多程式的原因是:

  1. 安全性高,一個程式崩潰不會影響別的程式
  2. 容易除錯,不易造成死鎖
  3. 有較為成熟的程式間通訊同步機制(共享記憶體,訊號,檔案鎖,socketpair….)

在接受客戶端連線的時候,如何再去建立一個程式,效率低下.故因此採用程式池的方式:
Master程式為父程式,主要控制子程式的狀態;可動態配置數量的Slave子程式,用於接受連線,
處理Http邏輯.

3.C++最難管理的還是記憶體

為了方便的進行記憶體管理,我設計了一個記憶體池,不會產生大量的記憶體碎片,效能待測試.以後還會
介紹如何實現的,盡請期待.

4.程式間通訊的方式很多,到底選擇哪幾個

瞭解了下Nginx,有考慮了使用的複雜度,我決定使用這幾個通訊.同步機制

  • 原子操作
  • 訊號量
  • 訊息佇列
  • 共享記憶體
  • 訊號

三、原始碼

想要原始碼的請戳這裡,希望大家多多對程式碼風格做出評判,畢竟自己只是個大三的學生.


四、參考文獻

小夥伴想要了解更多的高效能的網路程式設計,推薦一個大神的專欄

相關文章