天天看點

Java新一代網絡程式設計模型AIO原理

推薦:​​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新增的類和接口主要有:

  • ​AsynchronousServerSocketChannel​

    ​​ ,對應于BIO中的​

    ​ServerSocket​

    ​​和NIO中的​

    ​ServerSocketChannel​

    ​,用于server端的網絡程式。
  • ​AsynchronousSocketChannel​

    ​​,對應于BIO中的​

    ​Socket​

    ​​和NIO中的​

    ​SocketChannel​

    ​,用于client端的網絡程式。
  • ​CompletionHandler​

    ​​,​

    ​回調接口​

    ​​,在​

    ​socket​

    ​​進行​

    ​accept/connect/read/write​

    ​​等操作時,可以傳入一個​

    ​CompletionHandler​

    ​​的實作,操作執行完畢後,會調用注冊的​

    ​CompletionHandler​

    ​。

除了​

​CompletionHandler​

​​這種回調方式,AIO中還支援傳回​

​Future​

​​對象,使用​

​Future​

​來設定回調操作。

異步非阻塞 I/O(AIO)