標籤:阻塞io伺服器模型 多線程伺服器模型 多線程 並發 多線程伺服器
針對單線程伺服器模型的特點,我們可以對其進行改進,使之能對多個用戶端同時進行響應。最簡單的改進即是使用多線程(或多進程)伺服器模型,在應用程式層層級,我們一般採用多線程模式。多線程能讓多個用戶端同時請求,並能幾乎同時對這些請求進行響應,而不用排隊一個一個處理,能同時為多個用戶端提供一問一答的服務。
圖2-6-1-2 多線程阻塞伺服器模型
多線程伺服器模型核心就是利用多線程機制,為每個用戶端分配一個線程。2-6-1-2,伺服器初始化一個Serversocket執行個體,綁定某個連接埠號碼,並使之監聽用戶端的訪問。兩個用戶端幾乎同時過來請求,伺服器在接收到用戶端請求後,建立兩條線程進行處理,直到響應完成。在這過程中,伺服器只是簡單的負責接收訊息,然後交給處理者線程來處理,伺服器能在短時間內接收多個用戶端的請求。
這種模型也是阻塞式的,因為每個線程向用戶端寫入訊息並不是馬上返回的,圖2-6-1-2中黑塊這段時間片就是阻塞時間。但這種模式比單線程處理效能明顯高了,不用等到第一個請求處理完才處理第二個。對於多線程,如果線程數大於CPU數量,那麼作業系統將會在多個線程之間調度,從而使其他線程能使用CPU,每調度一次導致一次環境切換,大多通用的處理器中,每次調度大概需要5000-10000個刻度,大概幾微妙。
用這種多線程伺服器模型就能真正地完美解決問題了嗎?其實不然,隨著用戶端的數量越來越多,當達到成百上千路串連請求時,多線程操作會嚴重消耗系統cpu資源,並且多線程更容易進入假死狀態。對此提出了“線程池”的概念,線程池在啟動時先把一定數量的線程先建立好放到記憶體中,並且使用完不真正銷毀線程,而是放回池裡,以供新任務使用。這種緩衝池機制能有效減少線程建立與銷毀的頻率,大大降低系統開銷。這種機制在Tomcat中也是有所體現,2-6-1-3,當一個請求過來時嘗試從池裡擷取一個線程,如果有空閑線程則返回一個線程供使用,而如果沒有空閑線程了則直接關閉socket串連拒絕服務,保證伺服器在處理能力範圍內運行
圖2-6-1-3 多線程阻塞伺服器模型-線程池
多線程伺服器模型的特點:能支援對多個用戶端同時進行響應,處理能力得到大大的提高,有較大的並發量,但伺服器系統資源消耗較大,同時擁有較複雜的結構,實現的代碼也相對比較複雜。這種模型適用於訪問並發量較大,請求是短期的、無狀態的,商務邏輯比較複雜,對回應時間要求較高的場合。