1what
是Java1. 4 开始引入的一种新I/O(API)
2why
通过使用非阻塞型I/O(Nio),不要求阻塞等待I/O 操作完成即可返回,从而减少了管理I/O 连接导致的系统开销,实现流畅的网络读写操作,大幅度提高了系统性能
3how
工作原理
针对传统I/O 工作模式的不足,NIO 工具包提出了基于Buffer(缓冲区)、Channel(通
道)、Selector(选择器)的新模式、Selector(选择器)、可选择的Channel(通道)和
SelectionKey(选择键)配合起来使用,可以实现并发的非阻塞型I/O 能力。
4Nio工具包的成员
Buffer(缓冲器)
的核心是一块内存区,可以直接对其执行与内存有关的操作,利用操作系统特性和能力提高和改善Java 传统I/O 的性能。
Channel(通道)
被认为是NIO 工具包的一大创新点,是(Buffer)缓冲器和I/O 服务之间的通道,具有双向性,既可以读入也可以写出,可以更高效的传递数据
Selector(选择器)和SelectionKey(选择键)
Selector 是实现并发型非阻塞I/O 的核心,各种可选择的通道将其感兴趣的事件注册
到Selector 对象上,Selector 在一个循环中不断轮循监视这各些注册在其上的Socket 通道。
SelectionKey 类则封装了SelectableChannel 对象在Selector 中的注册信息。当Selector 监测
到在某个注册的SelectableChannel 上发生了感兴趣的事件时,自动激活产生一个SelectionKey
对象,在这个对象中记录了哪一个SelectableChannel 上发生了哪种事件,通过对被激活的
SelectionKey 的分析,外界可以知道每个SelectableChannel 发生的具体事件类型,进行相应的
处理。
5传统的阻塞型网络 I/O的不足
Java 平台传统的I/O 系统都是基于Byte(字节)和Stream(数据流)的,相应的I/O 操
作都是阻塞型的,所以服务器程序也采用阻塞型I/O 进行数据的读、写操作。为了实现服
务器程序的并发性要求,系统由一个单独的主线程来监听用户发起的连接请求,一直处于阻塞状态;
当有用户连接请求到来时,程序都会启一个新的线程来统一处理用户数据的读、写操作。
这种模式的优点是简单、实用、易管理;然而缺点也是显而易见的:由于是为每一个客
户端分配一个线程来处理输入、输出数据,其线程与客户机的比例近似为1:1,随着线程
数量的不断增加,服务器启动了大量的并发线程,会大大加大系统对线程的管理开销,这将
成为吞吐量瓶颈的主要原因;其次由于底层的I/O 操作采用的同步模式,I/O 操作的阻塞管
理粒度是以服务于请求的线程为单位的,有可能大量的线程会闲置,处于盲等状态,造成I/O
资源利用率不高,影响整个系统的性能。