Web Server的架構基本分為多線程和事件驅動兩個基本觀點,在實作上對多線程和事件驅動取長補短形成了流水線的架構。
在Web Server高并發,高吞吐率,低資源消耗,低延遲的要求下,Web Server的發展也曆經了事件驅動占主流,到多線程反擊[1][2],以及比較成熟的流水線架構。
在多線程的優點主要是容易了解,對資源的使用很容易飽和,缺點是上下文切換太多(線程代碼段1份,10萬個線程的話,就是重複10萬份,要想無上下文切換就需要要10萬個核),資源占用過多(線程建立需要給線程棧配置設定記憶體,雖有辦法降低這個消耗,但依然可觀),同步代碼調試困難(正确性很難驗證)。
事件驅動的主要缺點是系統的資源(記憶體,CPU)不容易飽和使用,使用者響應時間較長。優點是程式設計簡單,可以支援很高的并發量,linux2.6核心開始支援的epoll就是事件驅動的典型實作,事件驅動可以支援很高的并發量。
流水線的架構是介于多線程和事件驅動之間的一種形态,是目前廣泛采用的架構。
從本次開始,依次将會介紹
1)簡單的多線程架構
2)基于線程池的多線程架構
3)簡單的事件驅動架構(将會結合epoll進行介紹)
4)流水線的架構(cooperative multithreading Model和lock-free queue的相關介紹)
5)多流水線的架構
下圖是簡單的多線程架構,很容易了解,不再贅述,未完待續。
螺旋線表線程的含義,如下圖所示合計4個線程。Accept Loop承擔的是dispatch任務的線程,其餘線程處理使用者請求。
帶箭頭環線表示循環,帶箭頭直線表示控制流。
detached表示線程執行完後即退出,是以一個線程的從生到死隻為一個client的request服務。
