- Java 中的 NIO 于 Java 1.4 中引入,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,
不单纯是 New。它是支持面向缓冲的,基于通道的 I/O 操作方法。 对于高负载、高并发的(网络)应用,应使用 NIO 。 - Java 中的 NIO 可以看作是 I/O 多路复用模型。也有很多人认为,Java 中的 NIO 属于同步非阻塞 IO 模型。
- 我们先来看看 同步非阻塞 IO 模型。
- 同步非阻塞 IO 模型中,应用程序会一直发起 read 调用,等待数据从内核空间拷贝
到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。 - 相比于同步阻塞 IO 模型,同步非阻塞 IO 模型确实有了很大改进。通过轮询操作,避免了一直阻塞。
- 但是,这种 IO 模型同样存在问题:应用程序不断进行 I/O 系统调用轮询数据是否已经准备好的过程是十分消耗 CPU 资源的。
- 这个时候,I/O 多路复用模型 就上场了。
- IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间 -> 用户空间)还是阻塞的。
- 目前支持 IO 多路复用的系统调用,有 select,epoll 等等。select 系统调用,目前几乎在所有的操作系统上都有支持。
- select 调用 :内核提供的系统调用,它支持一次查询多个系统调用的可用状态。几乎所有的操作系统都支持。
- epoll 调用 :linux 2.6 内核,属于 select 调用的增强版本,优化了 IO 的执行效率。
- IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗。
- Java 中的 NIO ,有一个非常重要的 选择器 ( Selector ) 的概念,也可以被称为 多路复用器。
通过它只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后,才会为其服务。