目录

BIO、NIO、AIO 的区别

NIO的原理

使用NIO的框架之一:Netty


BIO、NIO、AIO 的区别

特性 BIO (Blocking I/O) 同步阻塞 IO NIO (Non-Blocking I/O) 同步非阻塞 IO AIO (Asynchronous I/O) 异步非阻塞 IO
核心模型 面向流,一个连接一个线程 面向缓冲区,Reactor 模型(多路复用) 面向缓冲区,Proactor 模型
阻塞性 阻塞 非阻塞 非阻塞
同步 / 异步 同步 同步 异步
核心组件 Socket、ServerSocket Channel、Buffer、Selector AsynchronousSocketChannel、AsynchronousServerSocketChannel
线程模型 连接数 = 线程数(高资源消耗) 一个线程处理多个连接(多路复用) 回调 / Future 处理结果(无需轮询)
适用场景 连接数少、需求简单的场景(如简单 Socket) 连接数多、短连接(如 Netty、RPC) 连接数多、长连接(如文件下载、大数据传输)
JDK 版本 JDK 1.0+ JDK 1.4+ JDK 1.7+ (NIO.2)
  1. BIO(同步阻塞 IO

    1. 核心特点:线程发起 IO 请求后,会一直阻塞直到数据读写完成,期间线程无法做其他事。

    2. 问题:每来一个连接就需要创建一个线程,连接数多的时候会导致线程数暴增,内存占用高、上下文切换频繁,性能瓶颈明显。

  2. NIO(同步非阻塞 IO

    1. 核心特点

      • 非阻塞:线程发起 IO 请求后,若数据未准备好,不会阻塞,而是返回一个状态,线程可以处理其他任务。

      • 多路复用:通过 Selector(选择器)监听多个 Channel(通道)的事件(连接、读、写),一个线程就能处理多个连接,解决了 BIO 线程膨胀的问题。

      • 面向缓冲区:数据读写先经过缓冲区,而非直接操作流,更灵活。

  3. AIO(异步非阻塞 IO

    1. 核心特点

      • 异步:线程发起 IO 请求后,直接返回,由操作系统完成数据读写,完成后通过回调函数Future 通知线程处理结果,全程无需线程参与轮询。

      • 真正的非阻塞:相比 NIO(同步非阻塞,线程仍需轮询事件),AIO 完全由系统接管,线程利用率更高。

NIO的原理

通过三大核心组件协同工作实现非阻塞 IO

组件 作用 底层实现
Buffer 数据容器(读写数据的缓冲区) 基于堆内存(HeapByteBuffer)或直接内存(DirectByteBuffer,映射到系统物理内存)
Channel 数据传输通道(双向、可非阻塞) 封装操作系统的文件描述符(FileDescriptor),对应底层的 socket / 文件 IO 通道
Selector IO 多路复用器(核心) 底层调用操作系统的 IO 多路复用 API(epoll/select/poll),监听多个 Channel 的事件

注册阶段:每个客户端(client1/client2…)通过 ChannelSelector 注册连接、读、写等事件。

轮询阶段:单个线程驱动 Selector,循环检测所有注册的 Channel 是否有事件就绪。

事件处理:当某个 Channel 的事件就绪时,Selector 会将其标记为就绪状态,线程获取该事件对应的 SelectionKey,并通过 Channel 和 Buffer 完成数据读写。

循环复用:线程处理完就绪事件后,继续回到 Selector 轮询下一批就绪事件,实现一个线程高效处理大量连接。

使用NIO的框架之一:Netty

Netty。

Netty 的 I/O 模型是基于非阻塞 I/O 实现的,底层依赖的是 NIO 框架的多路复用器 Selector。采用 epoll 模式后,只需要一个线程负责 Selector 的轮询。当有数据处于就绪状态后,需要一个事件分发器(Event Dispather),它负责将读写事件分发给对应的读写事件处理器(Event Handler)。事件分发器有两种设计模式:Reactor 和 Proactor,Reactor 采用同步 I/O, Proactor 采用异步 I/O。

Reactor 实现相对简单,适合处理耗时短的场景,对于耗时长的 I/O 操作容易造成阻塞。Proactor 性能更高,但是实现逻辑非常复杂,适合图片或视频流分析服务器,目前主流的事件驱动模型还是依赖 select 或 epoll 来实现。


上述内容也同步在我的飞书,欢迎访问

https://my.feishu.cn/wiki/QLauws6lWif1pnkhB8IcAvkhncc?from=from_copylink

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,你们的支持就是我坚持下去的动力!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐