NIO与AIO

本文探讨了Java中的NIO(Non-BlockingI/O)和AIO(AsynchronousI/O)模型,比较了EpollSelectorImpl在Linux中的实现,以及为何Netty不采用AIO而选择NIO,主要原因是AIO在Unix系统上的性能不如NIO,且缺乏必要的功能如无套接字支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NIO与AIO

NIO模型

2024-03-26T13:34:50-wljrvr.png

在 LInux 环境中,java.nio.channels.Selector 的子类叫做 sun.nio.ch.EPollSelectorImpl ,其底 层是基于 Epoll 模型去实现的 IO 多路复用器。

对于 Epoll 模型 我们需要了解到它底层的三个函数

2024-03-26T13:20:39-mswtop.png

在 JDK 实现的底层中,EPollSelectorImpl 在初次创建的时候,会调用 create 函数去内存块中 开辟一块空间。然后再调用 ctl 方法,往这个内存块中创建一颗红黑树,并且将 socket 对象插 入到树上。然后再调用 wait 方法,让出 CPU。

整体的执行过程如下图所示:

2024-03-26T13:49:14-niqxih.png

AIO模型

AIO(Asynchronous I/O)

  • AIO是Java 1.7引入的,它提供了更高级别的异步I/O操作。
  • AIO的主要特点是在进行I/O操作时不需要阻塞线程,当I/O操作完成后会通过回调函数通知程序,从而实现异步处理。
  • 相比于NIO,AIO更加方便,因为它把I/O操作的处理逻辑封装到了回调函数中,程序员不需要手动管理缓冲区和通道。

2024-03-26T13:50:04-oyfgms.png

为什么 Netty 没有使用 AIO 而是采用 NIO 的思路去进行设计?

创始人在GitHub中的回答

2024-03-26T13:57:06-vnznob.png

翻译:
不比unix系统上的NIO(epoll)快(这是真的)
没有daragram支持
不必要的线程模型(过多的抽象而没有使用)

总而言之,可以理解为,在 Unix 系统上 AIO 性能综合表现不如 NIO 好,所以 Netty 使用了 NIO 作为底层的核心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

造 山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值