推薦:Java網絡程式設計彙總
Java新一代網絡程式設計模型AIO原理
前言
從JDK 1.7版本開始,Java新加入的檔案和網絡IO特性稱為NIO2(New IO2, 因為JDK1.4中已經有過一個NIO了),包含了衆多性能和功能上的改進,其中最重要的部分,就是對異步IO的支援,稱為
Java AIO(Asynchronous IO)
。
因為AIO的實作需要充分調用OS,IO需要作業系統支援、并發也同樣需要作業系統的支援,是以性能方面不同作業系統差異會比較明顯。是以本文也附帶介紹了Linux 2.6及以後版本新增的AIO特性(因為這跟Java AIO是對應關系)。
Java AIO
基本原理
目前為止,Java共支援3種網絡程式設計模型:BIO、NIO、AIO:
- Java BIO :同步阻塞,伺服器實作模式為一個連接配接一個線程,即用戶端有連接配接請求時伺服器端就需要啟動一個線程進行處理,如果這個連接配接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
- Java NIO :同步非阻塞,伺服器實作模式為一個請求一個線程,即用戶端發送的連接配接請求都會注冊到多路複用器上,多路複用器輪詢到連接配接有I/O請求時才啟動一個線程進行處理。
- Java AIO(NIO 2) :異步非阻塞,伺服器實作模式為一個有效請求一個線程,用戶端的I/O請求都是由OS先完成了再通知伺服器應用去啟動線程進行處理。
BIO、NIO、AIO适用場景分析:
- BIO方式适用于連接配接數目比較小且固定的架構,這種方式對伺服器資源要求比較高,并發局限于應用中,JDK1.4以前的唯一選擇,但程式直覺簡單易了解。
- NIO方式适用于連接配接數目多且連接配接比較短(輕操作)的架構,比如聊天伺服器,并發局限于應用中,程式設計比較複雜,JDK1.4開始支援。
- AIO方式使用于連接配接數目多且連接配接比較長(重操作)的架構,比如相冊伺服器,充分調用OS參與并發操作,程式設計比較複雜,JDK7開始支援。
AIO介紹
JDK在1.4版本的NIO中提供了對非阻塞多路複用同步IO模型的支援,但是在Windows上是基于較低效select/poll實作的。
JDK1.7中提供對AIO的支援後,帶來了兩方面的好處:
- Windows上可以使用
了。iocp
- 簡化了網絡程式設計模型。異步IO相比較非阻塞多路複用模型更易了解,開發更為簡單。
和多路複用的Java NIO相比較,可以發現,異步IO是在資料讀取或者寫入調用已經完成的時候,再通知調用者,而非阻塞多路複用IO則是在有資料就緒,可以讀寫的時候通知調用者,讀寫仍然是由調用者執行,并且是阻塞的(這意味着如果要同時進行其他工作,要控制讀寫操作不能阻塞太長時間或者需要将其放去單獨的IO線程執行)。
JDK7中的Java AIO新增的類和接口主要有:
-
,對應于BIO中的AsynchronousServerSocketChannel
和NIO中的ServerSocket
,用于server端的網絡程式。ServerSocketChannel
-
,對應于BIO中的AsynchronousSocketChannel
和NIO中的Socket
,用于client端的網絡程式。SocketChannel
-
,CompletionHandler
,在回調接口
進行socket
等操作時,可以傳入一個accept/connect/read/write
的實作,操作執行完畢後,會調用注冊的CompletionHandler
。CompletionHandler
除了
CompletionHandler
這種回調方式,AIO中還支援傳回
Future
對象,使用
Future
來設定回調操作。
異步非阻塞 I/O(AIO)