web伺服器和客戶端完成並行處理請求三大方式
從設計架構上來說,Nginx伺服器是與眾不同的。不同之處一方面提現在它的模組化設計,另一方面,也是更重要的一方面。體現在它對客戶端請求的處理機制上。
Web伺服器和客戶端是一對多的關係,Web伺服器必須有能力同時對多個客戶端提供服務。一般來說,完成並行處理請求工作有三種方式:多程序方式、多執行緒方式和非同步方式。
多程序方式
伺服器每當接收到一個客戶端時,就由伺服器主程序生成一個子程序出來和該客戶端建立連線進行互動,知道連線斷開,改子程序就結束了。
多程序方式的優點在於,設計和實現相對簡單,各個子程序之間相互獨立,處理客戶端請求的過程彼此不受到干擾,並且當一個子程序產生問題時,不容易將影響蔓延到其他程序中,這保證了提供服務的穩定性。當子程序退出時,其佔用資源會被作業系統回收,也不會留下任何垃圾。而其缺點也是很明顯的。作業系統中生成一個子程序需要進行記憶體複製等操作,在資源和時間上會產生一定的額外開銷,因此,如果web伺服器接受大量的併發請求,就會對系統資源造成壓力,導致系統性能下降。
初期的Apache伺服器就是採用這種方式對外提供服務的。為了應對大量併發請求,Apache伺服器採用“”預生成程序”的機制對多程序方式進行了改進。“預生成程序”的工作方式很好理解。它將生成子程序的時機提前,在客戶端請求還沒到來之前就預先生成好,當請求到來時,主程序分配一個子程序和該客戶端進行互動,互動完成後,該程序也不結束,而被主程序管理起來等待下一個客戶端請求的到來。改進的多程序方式在一定程度上緩解了大量併發請求情形下web伺服器對系統資源造成的壓力。但是由於Apache伺服器在最初的架構設計上採用了多程序方式,因此不能從根本上解決效能問題。
多執行緒方式
多執行緒和多程序的方式相似,它是指,伺服器每當接收到一個客戶端時,會由伺服器主程序派生一個執行緒出來和該客戶端進行互動。
優點:
由於作業系統產生一個執行緒的開銷遠遠小於產生一個程序的開銷,所以多執行緒方式在很大程度上減輕了web伺服器對系統資源的要求。
該方式使用多執行緒進行任務排程,開發方面可以遵循一定的標準,這相對來說比較規範和有利於協作。
缺點:線上程管理方面,該方式有一定的不足。
多個執行緒位於同一個程序內,可以訪問同樣的記憶體空間,彼此之間相互影響;
在開發過程中,不可避免的要有開發者自己對記憶體進行管理,其增加了出錯的風險。
伺服器系統需要長時間連續不停的運轉,錯誤的逐漸積累可能對整個伺服器產生重大影響。