本文最后更新于85 天前,其中的信息可能已经过时,如有错误请发送邮件到3082654005@qq.com
BIO、NIO、AIO 的核心区别
| 维度 | BIO(阻塞 I/O) | NIO(非阻塞 I/O) | AIO(异步 I/O) |
|---|
| 阻塞方式 | 同步阻塞:线程需全程等待 I/O 完成,期间无法做其他事。 | 同步非阻塞:线程无需等待,但需主动轮询 I/O 状态(通过 Selector)。 | 异步非阻塞:线程无需等待 / 轮询,操作系统完成后主动通知(回调 / Future)。 |
| 线程参与阶段 | 线程参与 I/O 的 “等待 + 数据处理” 全过程。 | 线程参与 “轮询 I/O 状态” 和 “数据处理” 两个阶段。 | 线程仅参与 “数据处理” 阶段,I/O 的 “等待 + 执行” 由操作系统完成。 |
| 并发模型 | 一连接一线程,并发量低。 | 多路复用,一线程管理多连接,并发量高。 | 异步通知,一线程可处理更多连接,并发量更高(理论上)。 |
| 适用场景 | 低并发、简单场景(如本地文件读写)。 | 高并发、小数据量、I/O 频繁(如即时通讯、服务器)。 | 低并发、大数据量、I/O 耗时较长(如大文件传输、远程请求)。 |
| 复杂度 | API 简单直观,开发成本低。 | 需手动管理 Selector、Buffer,逻辑较复杂(如 Netty 封装后简化)。 | 无需管理轮询,代码更简洁,但底层依赖操作系统支持(如 Linux 对 AIO 支持有限)。 |
| 维度 | 同步 IO | 异步 IO |
|---|
| 等待方式 | 程序主动等待 IO 完成,期间无法做事 | 程序不等待,IO 在后台执行,完成后通知 |
| CPU 利用率 | 低(等待时 CPU 可能空闲) | 高(等待时 CPU 可执行其他任务) |
| 代码复杂度 | 简单(顺序执行) | 较高(需处理回调 / 通知) |
| 维度 | 阻塞 IO | 非阻塞 IO |
|---|
| IO 未就绪时的状态 | 进程 / 线程被挂起,无法执行任何任务 | 进程 / 线程不阻塞,可继续执行其他任务 |
| CPU 利用率 | 低(阻塞时 CPU 可分配给其他进程) | 可能较高(轮询会消耗 CPU 资源) |
| 代码复杂度 | 简单(顺序执行,无需处理 “未就绪” 状态) | 较高(需轮询检查,处理 “未就绪” 分支) |
| 适用场景 | 低并发、IO 操作快的场景(如本地文件读取) | 高并发、IO 操作慢的场景(如网络通信) |