java中的幾種IO模型--BIO

java中的幾種IO模型

我會陸續的講解一下BIO/NIO/AIO的一些概念性的不同,並將其中的一些不同點做一下總結。這篇文章主要對BIO進行一些概念性的梳理。

一、傳統的BIO

網絡編程的基本模型是Clientt/Server模型,其中服務端負責提供位置信息(綁定ip和端口號)客戶端負責通過連接操作向服務端監聽的地址發送連接請求,通過三次握手建立連接。

1、BIO通信模型

傳統的同步阻塞式通信模型BIO的服務端通常由一個獨立的Acceptor線程負責箭筒客戶端的鏈接,它在接收到客戶端的鏈接請求之後爲每一個客戶端創建一個新的線程進行鏈路處理,處理完之後通過輸出流返回給客戶端,線程銷燬。也就是說客戶端的請求數與服務端的鏈路處理線程是一對一的關係。

2、BIO的不足

該模型最大的問題就是缺乏彈性伸縮能力,當客戶端的併發訪問量增加後,服務端的線程個數和客戶端的併發訪問量呈1:1的關係,由於服務器的資源有限,當線程數增加後,系統的性能將急劇下降,隨着線程數的繼續增大,勢必會導致系統發生線程的堆棧溢出,創建線程失敗等問題。從而導致服務端進程宕機,不能提供服務。
爲了改進這一線程一連接的模型可以通過線程池或消息隊列實現一個或者多個線程處理N個客戶端的僞異步請求模型。

二、僞異步IO

僞異步IO模型是服務端在啓動時創建一個服務器處理類的線程池,當接收到新的客戶端連接時,將請求socket封裝成一個Task,然後調用線程池的execute方法執行。從而避免每個請求都創建一個新的線程。

僞異步IO的弊端

由於對java輸入流IInputStream進行讀取操作時,它會一直阻塞下去,知道發生以下三種事件:
有數據可讀;
可用數據已經讀取完畢;
發生空指針異常或者IO異常
這意味着當對方發送請求或者應答消息比較緩慢,或者網絡傳輸較慢時,讀取輸入流一方的通信線程將被長時間阻塞,從而導致級聯故障。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章