BIO,NIO的區別,使用場景

BIO,NIO的區別,使用場景。

 一、什麼是io?

i就是input,輸入,o就是output,輸出,合起來就是以流爲基本的輸入輸出。

二、傳統的io

傳統的服務器端同步阻塞I/O處理(也就是BIO,Blocking I/O):

當客戶端有請求到服務端的時候,服務端就會開啓一個線程進行處理,當有多個請求進入時,就會開啓多個線程分別處理對應的請求。

現在的多線程一般都使用線程池,可以讓線程的創建和回收成本相對較低。在活動連接數不是特別高(小於單機1000)的情況下,這種模型是比較不錯的,可以讓每一個連接專注於自己的I/O並且編程模型簡單,也不用過多考慮系統的過載、限流等問題、

三:NIO出現的原因背景

當面對十萬甚至百萬級連接的時候,傳統的BIO模型是無能爲力的。隨着移動端應用的興起和各種網絡遊戲的盛行,百萬級長連接日趨普遍,此時,必然需要一種更高效的I/O處理模型。

大多數客戶端BIO+連接池模型,可以建立n個連接,然後當某一個連接被I/O佔用的時候,可以使用其他連接來提高性能。

但多線程的模型面臨和服務端相同的問題:如果指望增加連接數來提高性能,則連接數又受制於線程數、線程很貴、無法建立很多線程,則性能遇到瓶

四:常見的I\O模型對比:

以socket.read()爲例子:

  • 傳統的BIO裏面socket.read(),如果TCP RecvBuffer裏沒有數據,函數會一直阻塞,直到收到數據,返回讀到的數據。
  • 對於NIO,如果TCP RecvBuffer有數據,就把數據從網卡讀到內存,並且返回給用戶;反之則直接返回0,永遠不會阻塞。
  • 最新的AIO(Async I/O)裏面會更進一步:不但等待就緒是非阻塞的,就連數據從網卡到內存的過程也是異步的。
  • 換句話說,BIO裏用戶最關心“我要讀”,NIO裏用戶最關心"我可以讀了",在AIO模型裏用戶更需要關注的是“讀完了”。
  • NIO一個重要的特點是:socket主要的讀、寫、註冊和接收函數,在等待就緒階段都是非阻塞的,真正的I/O操作是同步阻塞的(消耗CPU但性能非常高)。
  • NIO存在的問題

  • 使用NIO != 高性能,當連接數<1000,併發程度不高或者局域網環境下NIO並沒有顯著的性能優勢。

    NIO並沒有完全屏蔽平臺差異,它仍然是基於各個操作系統的I/O系統實現的,差異仍然存在。使用NIO做網絡編程構建事件驅動模型並不容易,陷阱重重。

    推薦大家使用成熟的NIO框架:如Netty,MINA等,解決了很多NIO的陷阱,並屏蔽了操作系統的差異,有較好的性能和編程模型。

五:NIO總結

NIO給我們帶來了些什麼:

  • 事件驅動模型
  • 避免多線程
  • 單線程處理多任務
  • 非阻塞I/O,I/O讀寫不再阻塞,而是返回0
  • 基於block的傳輸,通常比基於流的傳輸更高效
  • 更高級的IO函數,zero-copy
  • IO多路複用大大提高了Java網絡應用的可伸縮性和實用性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章