日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

【Java】BIO、NIO、AIO网络编程模型概述

發(fā)布時間:2025/3/15 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java】BIO、NIO、AIO网络编程模型概述 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

我們知道,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,有了不少的簡化。

建表做個對比

對比指標(biāo)同步阻塞IO偽異步IONIOAIO
客戶端數(shù)目 : 服務(wù)器端 I/O 線程數(shù)目1 : 1m : nm : 1m : 0
網(wǎng)絡(luò) I/O 模型同步阻塞 I/O同步阻塞I/O同步非阻塞I/O異步非阻塞I/O
吞吐量較低一般較高較高
編程復(fù)雜度比較簡單比較簡單非常復(fù)雜比較復(fù)雜

總結(jié)

以上是生活随笔為你收集整理的【Java】BIO、NIO、AIO网络编程模型概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。