Java新一代网络编程模型AIO原理

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 处理过程。

在这里插入图片描述

发布了288 篇原创文章 · 获赞 325 · 访问量 65万+

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/104183006