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.為了提高併發性:到底是選擇多程式還是多執行緒模式
多程式與多執行緒各有優缺點,並且大部分是互補的,具體就不再贅述了,
詳情請戳這裡
我選擇多程式的原因是:
- 安全性高,一個程式崩潰不會影響別的程式
- 容易除錯,不易造成死鎖
- 有較為成熟的程式間通訊同步機制(共享記憶體,訊號,檔案鎖,socketpair….)
在接受客戶端連線的時候,如何再去建立一個程式,效率低下.故因此採用程式池的方式:
Master程式為父程式,主要控制子程式的狀態;可動態配置數量的Slave子程式,用於接受連線,
處理Http邏輯.
3.C++最難管理的還是記憶體
為了方便的進行記憶體管理,我設計了一個記憶體池,不會產生大量的記憶體碎片,效能待測試.以後還會
介紹如何實現的,盡請期待.
4.程式間通訊的方式很多,到底選擇哪幾個
瞭解了下Nginx,有考慮了使用的複雜度,我決定使用這幾個通訊.同步機制
- 原子操作
- 訊號量
- 訊息佇列
- 共享記憶體
- 訊號
三、原始碼
想要原始碼的請戳這裡,希望大家多多對程式碼風格做出評判,畢竟自己只是個大三的學生.
四、參考文獻
小夥伴想要了解更多的高效能的網路程式設計,推薦一個大神的專欄