TinyWeb--C++構建高性能Web服務器

C++構建高性能Web服務器——Step 0:前言

1、想法:

  • 一直想用C++作個項目,由於比較喜歡網絡通訊這部分,又讓事情變得更有些挑戰性,我最終選擇實現一個高性能的Web服務器。
  • 在宏觀上我但願TinyWeb可以這樣:html

    • 配置簡單
    • 擴展容易
    • 性能高效
    • 功能強大
  • 並但願在開發的過程當中可以掌握如下知識:git

    • Unix環境編程的技能
    • Unix網絡編程的技能
    • 鞏固C++11知識
    • 掌握構建大型C++項目的技能
    • 掌握多進程、多線程同步、通訊機制
    • 實現高性能可複用Memory-pool
    • 掌握基本的數據結構(紅黑樹、鏈表、Hash)
    • 可以把通用的網絡部分做爲單獨的網絡庫、爲之後網絡開發提高效率
  • TinyWeb 目前的功能是:github

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

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

2、設計思想

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

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

至於爲什麼使用Epoll,而不使用Select或Poll,點這裏看看吧.安全

2.爲了提升併發性:究竟是選擇多進程仍是多線程模式

多進程與多線程各有優缺點,而且大部分是互補的,具體就再也不贅述了,
詳情請戳這裏
我選擇多進程的緣由是:服務器

  1. 安全性高,一個進程崩潰不會影響別的進程
  2. 容易調試,不易形成死鎖
  3. 有較爲成熟的進程間通訊同步機制(共享內存,信號,文件鎖,socketpair....)

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

3.C++最難管理的仍是內存

爲了方便的進行內存管理,我設計了一個內存池,不會產生大量的內存碎片,性能待測試.之後還會
介紹如何實現的,盡請期待.

4.進程間通訊的方式不少,到底選擇哪幾個

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

  • 原子操做
  • 信號量
  • 消息隊列
  • 共享內存
  • 信號

3、源碼

想要源代碼的請戳這裏,但願你們多多對代碼風格作出評判,畢竟本身只是個大三的學生.多線程


4、參考文獻

小夥伴想要了解更多的高性能的網絡編程,推薦一個大神的專欄併發

相關文章
相關標籤/搜索