網絡編程的基本模型是Client/Server模型,也就是兩個進程之間進行相互通訊,其中服務端提供位置信息(綁定的IP地址和監聽端口),客戶端經過鏈接操做向服務器監聽的地址發起鏈接請求,經過三次握手創建鏈接,若是鏈接創建成功,雙方就能夠經過網絡套接字(Socket)進行通訊。編程
在基於傳統同步阻塞模型開發中,ServerSocket負責綁定IP地址,啓動監聽端口; Socket負責發起鏈接操做。鏈接成功以後,雙方經過輸入和輸出流進行同步阻塞式通訊。服務器
BIO通訊模型圖網絡
經過上圖所示的通訊模型圖來熟悉下BIO的服務端通訊模型:採用BIO通訊模型的服務端,一般由一個獨立的Acceptor線程負責監聽客戶端的鏈接,它接收到客戶端鏈接請求以後爲每一個客戶端建立一個新的線程進行鏈路處理,處理完成以後,經過輸出流返回應答給客戶端,線程銷燬。這就是典型的——請求——應答通訊模型。併發
該模型最大的問題就是缺少彈性伸縮能力,當客戶端併發訪問量增長後,服務端的線程個數和客戶端併發訪問數呈1:1的正比關係,因爲線程是Java虛擬機很是寶貴的系統資源,當線程數膨脹以後,系統的性能將急劇降低,隨着併發訪問量的繼續增大,系統會發生線程堆棧溢出,建立新線程失敗等問題,並最終致使進程宕機或者僵死,不能對外提供服務。異步
同步阻塞式I/O 模型高併發
BIO主要的問題在於每當有一個新的客戶端請求接入時,服務端必須建立一個新的線程處理新接入的客戶端鏈路,一個線程只能處理一個客戶端鏈接。在高性能服務器應用領域,每每須要面向成千上萬個客戶端的併發鏈接,這種模型顯然沒法知足高性能,高併發接入的場景。性能
爲了改進一線程一鏈接模型,後來又演進出了一種經過線程池或者消息隊列實現1個或者多個線程處理N個客戶端的模型,因爲它的底層通訊機制依然使用同步阻塞I/O,因此被稱爲「僞異步」,下一節會講到。spa