1. 程式人生 > >web伺服器和客戶端完成並行處理請求三大方式

web伺服器和客戶端完成並行處理請求三大方式

從設計架構上來說,Nginx伺服器是與眾不同的。不同之處一方面提現在它的模組化設計,另一方面,也是更重要的一方面。體現在它對客戶端請求的處理機制上。

Web伺服器和客戶端是一對多的關係,Web伺服器必須有能力同時對多個客戶端提供服務。一般來說,完成並行處理請求工作有三種方式:多程序方式、多執行緒方式和非同步方式。

多程序方式

伺服器每當接收到一個客戶端時,就由伺服器主程序生成一個子程序出來和該客戶端建立連線進行互動,知道連線斷開,改子程序就結束了。

多程序方式的優點在於,設計和實現相對簡單,各個子程序之間相互獨立,處理客戶端請求的過程彼此不受到干擾,並且當一個子程序產生問題時,不容易將影響蔓延到其他程序中,這保證了提供服務的穩定性。當子程序退出時,其佔用資源會被作業系統回收,也不會留下任何垃圾。而其缺點也是很明顯的。作業系統中生成一個子程序需要進行記憶體複製等操作,在資源和時間上會產生一定的額外開銷,因此,如果web伺服器接受大量的併發請求,就會對系統資源造成壓力,導致系統性能下降。

初期的Apache伺服器就是採用這種方式對外提供服務的。為了應對大量併發請求,Apache伺服器採用“”預生成程序”的機制對多程序方式進行了改進。“預生成程序”的工作方式很好理解。它將生成子程序的時機提前,在客戶端請求還沒到來之前就預先生成好,當請求到來時,主程序分配一個子程序和該客戶端進行互動,互動完成後,該程序也不結束,而被主程序管理起來等待下一個客戶端請求的到來。改進的多程序方式在一定程度上緩解了大量併發請求情形下web伺服器對系統資源造成的壓力。但是由於Apache伺服器在最初的架構設計上採用了多程序方式,因此不能從根本上解決效能問題。

多執行緒方式

多執行緒和多程序的方式相似,它是指,伺服器每當接收到一個客戶端時,會由伺服器主程序派生一個執行緒出來和該客戶端進行互動。

優點:

由於作業系統產生一個執行緒的開銷遠遠小於產生一個程序的開銷,所以多執行緒方式在很大程度上減輕了web伺服器對系統資源的要求。

該方式使用多執行緒進行任務排程,開發方面可以遵循一定的標準,這相對來說比較規範和有利於協作。

缺點:線上程管理方面,該方式有一定的不足。

多個執行緒位於同一個程序內,可以訪問同樣的記憶體空間,彼此之間相互影響;

在開發過程中,不可避免的要有開發者自己對記憶體進行管理,其增加了出錯的風險。

伺服器系統需要長時間連續不停的運轉,錯誤的逐漸積累可能對整個伺服器產生重大影響。

非同步方式

非同步方式是和多程序多執行緒方式完全不同的一種處理客戶端請求的方式。在介紹該方式之前,我們先複習一下同步、非同步以及阻塞和非阻塞的概念。 網路通訊中的同步機制和非同步機制是描述通訊模式的概念。同步機制,
是指傳送方傳送請求後,需要等待接收到接收方發回的響應後,才接著傳送下一個請求; 非同步機制,和同步機制正好相反,傳送方在傳送一個請求後,不等待接收方響應這個請求,就繼續傳送下一個請求。 在同步機制中,所有的請求在伺服器端得到同步,傳送方和接收方對請求的處理步調是一致的;在非同步機制中,所有來自發送方的請求形成一個佇列,接收方處理完成後通知傳送方。 阻塞和非阻塞用來描述程序處理呼叫的方式,在網路通訊中,主要指網路套接字Socket的阻塞和非阻塞方式。Socket的實質也就是IO操作。Socket的阻塞呼叫方式為,呼叫結果返回之前,當前執行緒從執行狀態被掛起,一直等到呼叫結果返回之後,才進入就緒狀態,獲取cpu後繼續執行。Socket的阻塞呼叫方式和非阻塞呼叫方式正好相反,在非阻塞方式中,如果呼叫結果不能馬上返回,當前執行緒也不會被掛起,而是立即返回執行下一個呼叫。 在網路通訊中,經常可以看到有人將同步和阻塞等同,非同步和非阻塞等同。事實上,這兩對概念有一定的區別,不能混淆。兩對概念的組合,就會產生四個新的概念,同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞。 同步阻塞方式:傳送方向接收方傳送請求後,一直等待響應。接收方接收請求後進行的IO操作如果不能馬上得到結果,就一直等到返回結果後,才響應傳送發,期間不能做任何事情。這種方式實現簡單,但是效率不高 同步非阻塞方式:傳送發向接收方傳送請求後,一直等待響應。接收方接收請求後進行的IO操作如果不能馬上的到結果,也可以繼續往下呼叫去做其他事情,但由於沒有結果返回會,不響應,直到結果返回了才響應傳送方。實際上並不會使用這種方式。 非同步阻塞方式:傳送方向接收方傳送請求後,不用等待響應,可以接著進行其他工作;接收方不能馬上返回,就阻塞,期間不能做任何事情。實際工作中也不使用這種方式,一般使用非同步非阻塞的方式。 非同步非阻塞方式:傳送方向接收方傳送請求後,不用等待響應,可以接著進行其他工作;接收方不能馬上返回,就去做其他的事情,往下呼叫,如果其他事情做完,才等待返回。當IO操作完成以後,將完成狀態和結果通知接收方,接收方再響應傳送方。