【BIO、NIO、AIO的区别?】
1. 阻塞与非阻塞
-
BIO (Blocking I/O)
同步阻塞模型,线程发起读写请求后必须等待操作完成。例如当调用InputStream.read()
时,线程会阻塞直到数据就绪。 -
NIO (Non-blocking I/O)
同步非阻塞模型,通过Selector
实现事件驱动机制。线程可以通过轮询方式检查多个通道的就绪状态,当没有就绪事件时,线程可执行其他任务。 -
AIO (Asynchronous I/O)
异步非阻塞模型,采用回调机制。线程发起读写请求后立即返回,操作系统完成IO操作后通过回调函数通知应用程序。
2. 缓冲区设计
-
BIO
基于流式处理,直接操作字节流或字符流:InputStream in = socket.getInputStream(); int data = in.read(); // 直接从流中读取
-
NIO
强制使用Buffer
进行块数据传输,提供堆内外内存支持:ByteBuffer buffer = ByteBuffer.allocateDirect(1024); channel.read(buffer); // 数据先写入缓冲区
-
AIO
通过CompletionHandler
实现零拷贝优化,操作系统直接管理数据缓冲区。
3. 线程模型对比
模型 | 线程消耗 | 适用场景 |
---|---|---|
BIO | 1:1 (连接:线程) | 低并发短连接(<1000) |
NIO | M:N (多路复用) | 高并发短连接(如聊天服务器) |
AIO | 1:M (事件回调) | 高并发长连接(如文件服务器) |
4. 性能指标
-
吞吐量
T N I O ≈ 3 × T B I O ( 千兆网络环境 ) T_{NIO} \approx 3 \times T_{BIO} \quad (千兆网络环境) TNIO≈3×TBIO(千兆网络环境)
T A I O ≥ 1.5 × T N I O ( L i n u x e p o l l 实现 ) T_{AIO} \geq 1.5 \times T_{NIO} \quad (Linux epoll实现) TAIO≥1.5×TNIO(Linuxepoll实现) -
延迟特性
- BIO:固定延迟(受线程切换影响)
- NIO:波动延迟(受事件轮询间隔影响)
- AIO:稳定低延迟(依赖操作系统优化)
架构选择建议
- 传统Web应用:NIO(Netty框架)
- 大文件传输:AIO(JDK7+)
- 遗留系统维护:BIO(兼容旧协议)