【Java】BIO、NIO、AIO网络编程模型概述
前言
我們知道,UNIX環(huán)境下常見的網(wǎng)絡(luò)I/O模型有5種:
- 同步阻塞
- 同步非阻塞
- I/O復(fù)用
- 信號驅(qū)動
- 異步非阻塞
那么基于上述五種模型,Java中,隨著NIO和AIO(NIO 2.0)的引入,一般具有以下三種網(wǎng)絡(luò)編程模型:
- BIO
- NIO
- AIO
這次,我們就簡單聊聊這三種網(wǎng)絡(luò)編程模型
BIO
BIO是一個經(jīng)典的網(wǎng)絡(luò)編程模型,是通常我們實(shí)現(xiàn)一個服務(wù)器端程序的過程。
步驟如下:
- 主線程accept請求阻塞。
- 請求到達(dá),創(chuàng)建新的線程來處理這個socket,完成對客戶端的響應(yīng)。
- 主線程繼續(xù)accept下一個請求。
這個模型的一個明顯的缺點(diǎn):
當(dāng)客戶端連接快速增長時,服務(wù)器端創(chuàng)建的線程也會驟增,系統(tǒng)性能可能會驟降。
因此,在該模型的基礎(chǔ)上,可以創(chuàng)建線程池,從而避免對每個客戶端線程都創(chuàng)建一個新的服務(wù)器端線程,進(jìn)而提升性能(創(chuàng)建線程是很耗費(fèi)資源的,盡管線程可以看做輕量級進(jìn)程)。
可參考Tomcat 的 BIO Connector。
這種方式也有被稱為“偽異步I/O”,因?yàn)樗前颜埱髵伒骄€程池中異步等待處理。
NIO
Java的NIO類庫從JDK1.4(Java4)開始引入,這里NIO主要指非阻塞I/O,主要使用Selector多路復(fù)用器來實(shí)現(xiàn)的。
Selector在Linux等主流操作系統(tǒng)中是通過epoll實(shí)現(xiàn)的。
epoll 詳解
epoll 百度百科
Java NIO Selector 剖析
NIO的實(shí)現(xiàn)流程類似于select:
- 創(chuàng)建ServerSocketChannel監(jiān)聽客戶端連接并綁定監(jiān)聽窗口,設(shè)置為非阻塞模式。
- 創(chuàng)建Reactor線程,創(chuàng)建多路復(fù)用器Selector并啟動線程。
- 將ServerSocketChannel注冊到Reactor線程的Selector上。監(jiān)聽accept事件。
- Selector在線程run方法中無限循環(huán)輪詢準(zhǔn)備就緒的key。
- Selector監(jiān)聽到新的客戶端接入,處理新的請求,完成TCP三次握手,建立物理連接。
- 將新的客戶端連接注冊到Selector上,監(jiān)聽讀操作。讀取客戶端發(fā)送的網(wǎng)絡(luò)消息。
- 客戶端發(fā)送的數(shù)據(jù)就緒則讀取客戶端請求,進(jìn)行處理。
AIO
傳說中的AIO其實(shí)是NIO 2.0,Java的AIO類庫從JDK1.7(Java7)引入,它提供了異步文件通道和異步socket通道的實(shí)現(xiàn)。
AIO底層在Windows上是通過IOCP實(shí)現(xiàn)的,在Linux上則是通過epoll實(shí)現(xiàn)的。
IOCP 解讀
IOCP 百度百科
LinuxAsynchronousChannelProvider.java
UnixAsynchronousServerSocketChannelImpl.java
流程:
- 創(chuàng)建AsynchronousServerSocketChannel,綁定監(jiān)聽端口。
- 調(diào)用AsynchronousServerSocketChannel的accpet方法,傳入自己實(shí)現(xiàn)的CompletionHandler。包括上一步都是非阻塞的。
- 連接傳入,回調(diào)CompletionHandler的completed方法,在里面,調(diào)用AsynchronousSocketChannel的read方法,傳入負(fù)責(zé)處理數(shù)據(jù)的CompletionHandler。
- 數(shù)據(jù)就緒,觸發(fā)負(fù)責(zé)處理數(shù)據(jù)的CompletionHandler的completed方法。繼續(xù)做下一步處理即可。
- 寫入操作類似,也需要傳入CompletionHandler。
AIO比起NIO,有了不少的簡化。
建表做個對比
| 客戶端數(shù)目 : 服務(wù)器端 I/O 線程數(shù)目 | 1 : 1 | m : n | m : 1 | m : 0 |
| 網(wǎng)絡(luò) I/O 模型 | 同步阻塞 I/O | 同步阻塞I/O | 同步非阻塞I/O | 異步非阻塞I/O |
| 吞吐量 | 較低 | 一般 | 較高 | 較高 |
| 編程復(fù)雜度 | 比較簡單 | 比較簡單 | 非常復(fù)雜 | 比較復(fù)雜 |
總結(jié)
以上是生活随笔為你收集整理的【Java】BIO、NIO、AIO网络编程模型概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链技术的发展趋势
- 下一篇: 用0和5凑被90整除的max数(洛谷P2