BIO、NIO、AIO之间的区别

发布时间:2026/6/8 9:49:28

BIO、NIO、AIO之间的区别 BIO (Blocking I/O)BIO 属于同步阻塞 IO 模型 。同步阻塞 IO 模型中应用程序发起 read 调用后会一直阻塞直到内核把数据拷贝到用户空间。在客户端连接数量不高的情况下是没问题的。但是当面对十万甚至百万级连接的时候传统的 BIO 模型是无能为力的。因此我们需要一种更高效的 I/O 处理模型来应对更高的并发量。NIO (Non-blocking/New I/O)Java 中的 NIO 于 Java 1.4 中引入对应 java.nio 包提供了 Channel , SelectorBuffer 等抽象。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 多路复用的系统调用有 selectepoll 等等。select 系统调用目前几乎在所有的操作系统上都有支持。select 调用内核提供的系统调用它支持一次查询多个系统调用的可用状态。几乎所有的操作系统都支持。epoll 调用linux 2.6 内核属于 select 调用的增强版本优化了 IO 的执行效率。IO多路复用模型通过减少无效的系统调用减少了对 CPU 资源的消耗。Java 中的 NIO 有一个非常重要的选择器 ( Selector ) 的概念也可以被称为 多路复用器。通过它只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后才会为其服务。Buffer、Channel和Selector三者之间的关系如下AIO (Asynchronous I/O)AIO 也就是 NIO 2。Java 7 中引入了 NIO 的改进版 NIO 2,它是异步 IO 模型。异步 IO 是基于事件和回调机制实现的也就是应用操作之后会直接返回不会堵塞在那里当后台处理完成操作系统会通知相应的线程进行后续的操作。总结最后来一张图简单总结一下 Java 中的 BIO、NIO、AIO。

相关新闻