BIO和NIO的区别
生活随笔
收集整理的這篇文章主要介紹了
BIO和NIO的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
BIO:同步阻塞式IO,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
?
NIO:同步非阻塞式IO,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。 ?
AIO(NIO.2):異步非阻塞式IO,服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理。 ?
BIO ?
同步阻塞式IO,相信每一個學習過操作系統網絡編程或者任何語言的網絡編程的人都很熟悉,在while循環中服務端會調用accept方法等待接收客戶端的連接請求,一旦接收到一個連接請求,就可以建立通信套接字在這個通信套接字上進行讀寫操作,此時不能再接收其他客戶端連接請求,只能等待同當前連接的客戶端的操作執行完成。 ?
如果BIO要能夠同時處理多個客戶端請求,就必須使用多線程,即每次accept阻塞等待來自客戶端請求,一旦受到連接請求就建立通信套接字同時開啟一個新的線程來處理這個套接字的數據讀寫請求,然后立刻又繼續accept等待其他客戶端連接請求,即為每一個客戶端連接請求都創建一個線程來單獨處理,大概原理圖就像這樣: ?
?
NIO ?
同步非阻塞式IO,關鍵是采用了事件驅動的思想來實現了一個多路轉換器。 ?
NIO與BIO最大的區別就是只需要開啟一個線程就可以處理來自多個客戶端的IO事件,這是怎么做到的呢? ?
就是多路復用器,可以監聽來自多個客戶端的IO事件: ?
A. ? 若服務端監聽到客戶端連接請求,便為其建立通信套接字(java中就是通道),然后返回繼續監聽,若同時有多個客戶端連接請求到來也可以全部收到,依次為它們都建立通信套接字。 ?
B. ? 若服務端監聽到來自已經創建了通信套接字的客戶端發送來的數據,就會調用對應接口處理接收到的數據,若同時有多個客戶端發來數據也可以依次進行處理。 ?
C. ? 監聽多個客戶端的連接請求和接收數據請求同時還能監聽自己時候有數據要發送。 ?
?
總之就是在一個線程中就可以調用多路復用接口(java中是select)阻塞同時監聽來自多個客戶端的IO請求,一旦有收到IO請求就調用對應函數處理。 ?
各自應用場景 ?
NIO:同步非阻塞式IO,服務器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。 ?
AIO(NIO.2):異步非阻塞式IO,服務器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啟動線程進行處理。 ?
BIO ?
同步阻塞式IO,相信每一個學習過操作系統網絡編程或者任何語言的網絡編程的人都很熟悉,在while循環中服務端會調用accept方法等待接收客戶端的連接請求,一旦接收到一個連接請求,就可以建立通信套接字在這個通信套接字上進行讀寫操作,此時不能再接收其他客戶端連接請求,只能等待同當前連接的客戶端的操作執行完成。 ?
如果BIO要能夠同時處理多個客戶端請求,就必須使用多線程,即每次accept阻塞等待來自客戶端請求,一旦受到連接請求就建立通信套接字同時開啟一個新的線程來處理這個套接字的數據讀寫請求,然后立刻又繼續accept等待其他客戶端連接請求,即為每一個客戶端連接請求都創建一個線程來單獨處理,大概原理圖就像這樣: ?
?
雖然此時服務器具備了高并發能力,即能夠同時處理多個客戶端請求了,但是卻帶來了一個問題,隨著開啟的線程數目增多,將會消耗過多的內存資源,導致服務器變慢甚至崩潰,NIO可以一定程度解決這個問題。
NIO ?
同步非阻塞式IO,關鍵是采用了事件驅動的思想來實現了一個多路轉換器。 ?
NIO與BIO最大的區別就是只需要開啟一個線程就可以處理來自多個客戶端的IO事件,這是怎么做到的呢? ?
就是多路復用器,可以監聽來自多個客戶端的IO事件: ?
A. ? 若服務端監聽到客戶端連接請求,便為其建立通信套接字(java中就是通道),然后返回繼續監聽,若同時有多個客戶端連接請求到來也可以全部收到,依次為它們都建立通信套接字。 ?
B. ? 若服務端監聽到來自已經創建了通信套接字的客戶端發送來的數據,就會調用對應接口處理接收到的數據,若同時有多個客戶端發來數據也可以依次進行處理。 ?
C. ? 監聽多個客戶端的連接請求和接收數據請求同時還能監聽自己時候有數據要發送。 ?
?
總之就是在一個線程中就可以調用多路復用接口(java中是select)阻塞同時監聽來自多個客戶端的IO請求,一旦有收到IO請求就調用對應函數處理。 ?
各自應用場景 ?
到這里你也許已經發現,一旦有請求到來(不管是幾個同時到還是只有一個到),都會調用對應IO處理函數處理,所以:
(1)NIO適合處理連接數目特別多,但是連接比較短(輕操作)的場景,Jetty,Mina,ZooKeeper等都是基于java nio實現。
(2)BIO方式適用于連接數目比較小且固定的場景,這種方式對服務器資源要求比較高,并發局限于應用中。
總結
以上是生活随笔為你收集整理的BIO和NIO的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaWeb 安全问题及解决方案
- 下一篇: tomcat7查看后台管理怎么设置用户名