Featured image of post Tomcat的异步IO模型的Nio2Endpoint是怎么设计的

Tomcat的异步IO模型的Nio2Endpoint是怎么设计的

一、NIO和NIO2

在上篇文章:《Tomcat的NioEndpoint组件是怎么实现I/O多路复用》中开头讲了同步阻塞、同步非阻塞I/O和异步I/O。在Java中同步非阻塞I/O和异步I/O都是在java.nio.channels这个包中,并没有 aio 这个包,所以有些地方也会把异步I/O叫做NIO2。

同步非阻塞I/O是通过Selector不断轮询内核是否有可读连接,并不会阻塞线程,但是当有可读连接,在将数据中从内核拷贝到用户进程的时候这个阶段是阻塞的

异步I/O在read内核没有连接后会马上返回并不会阻塞线程这个同步非阻塞I/O一样,不过异步I/O不需要一直轮询。两者最大的不同是异步I/O它在把数据从内核拷贝到用户进程这个阶段是非阻塞的,这是内核将数据准备好,然后通过调用异步I/O的回调把数据传输给用户进程。很明显数据的拷贝是需要内核支持,所以需要看底层的操作系统是否支持异步I/O模型。Windows 的 IOCP 和 Linux 内核 2.6 的 AIO 都提供了异步 I/O 的支持,Java 的 NIO.2 API 就是对操作系统异步 I/O API 的封装。

二、NIO2的示例

主要相关的类看:java.nio.channels*Asynchronous*开头的类。

NIO2ServerExample

Licensed under CC BY-NC-SA 4.0