推荐:Java网络编程汇总
Java新一代网络编程模型AIO原理
原文地址
Java新一代网络编程模型AIO原理及Linux系统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)
异步非阻塞 I/O 模型是一种处理与 I/O 重叠进行的模型。读请求会立即返回,说明 read 请求已经成功发起了。在后台完成读操作时,应用程序然后会执行其他处理操作。当 read 的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次 I/O 处理过程。