IO模型

简介: BIO、NIO、AIO是Java中处理网络I/O的三种模型。BIO为阻塞式,每个连接需单独线程,高并发下性能受限;NIO通过非阻塞与多路复用提升并发能力,少量线程可处理大量请求;AIO进一步实现异步非阻塞,数据复制时线程可释放,由回调机制处理后续操作。三者适用于不同场景,BIO易用但低效,NIO高效但复杂,AIO理论性能更优但目前在Linux上仍依赖多路复用实现。Java 21引入虚拟线程后,BIO也可兼具高性能与易编写特性。

BIO、NIO、AIO
问这个问题,通常是考察你对 Web 应用高并发的理解
预备知识
● 开发 Web 应用,肯定分成客户端和服务器。
● 客户端与服务器交互,肯定得做这么几件事:
○ 服务器线程等待有客户端连接上来
○ 客户端真的连上来了,建立连接
○ 客户端没有向服务器发送请求,此时服务器线程需要等待数据准备好
○ 客户端向服务器发送请求,需要将请求数据从网卡复制到系统内存
● 上面 a. c. 这两个阶段,没有客户端连接,没有数据请求,这时是否需要一个线程时刻盯着?
○ 如果需要占用一个线程,那么就称线程被阻塞
○ 如果不需要线程盯着,线程可以腾出手来去干别的活,那么就称线程非阻塞
● d. 阶段的数据复制,不会用到 CPU,也就是不会用到线程,同样也存在线程阻塞还是线程非阻塞两种情况
BIO(阻塞 I/O)
● 是指 b. c. d.这几个阶段,线程都得阻塞,腾不出手干别的,即使此时它无所事事
● 高并发下,阻塞线程多了,处理连接、处理请求的能力就会大受影响
○ 增加线程不可行,毕竟线程是有限资源,这是成本问题
○ 不增加线程也不行,没有新线程,没人去处理新连接,处理新请求
NIO(非阻塞 I/O)
● 是指 b. c. 这两个阶段,线程可以不阻塞,腾出手干别的(怎么干别的,要靠多路复用)
● 非阻塞 I/O 通常结合多路复用技术一起使用,能够在高并发下用少量线程处理大量请求
○ 多路复用是以面向事件的方式处理连接、处理请求,有事件发生才去处理,没有事件则不会占用线程
○ 使用了多路复用技术后,新客户端来了要连接,客户端发来了新请求,都会产生事件,把这些事件交给一个线程去统一处理就行了
○ 线程不会在高并发下存在无事可做的现象,它被充分压榨,利用率高
AIO(异步 I/O)
● NIO 在 d. 这个阶段,线程仍需阻塞,不能被解放出来干其它活
● AIO 则更进一步,只需要提前准备好回调函数,在数据复制时线程被解放,该干嘛干嘛,等数据复制完毕,由系统使用另外线程来调用回调函数做后续处理
● AIO 在 Linux 下本质还是用多路复用技术来实现
小结
● BIO 并发性低,但代码更容易编写
● NIO 并发性高,不过代码编写困难
● AIO 并发性在 Linux 下没有本质提高,用的人少
● 【进阶】Java 21 起,正式支持虚拟线程
○ 配合虚拟线程时,仍然是以 BIO 方式来编写代码,代码编写容易
○ 虚拟线程非常廉价,线程不是不够吗,可劲加就行(不用担心线程闲置问题)
○ Java 21 重新实现了网络 API,虚拟线程底层也会配合多路复用机制,在代码易编写的情况下,兼具高性能
P.S.
● B 是 Blocking 阻塞
● N 是 Non-Blocking 非阻塞
● A 是 Asynchronous 异步

目录
相关文章
|
缓存 安全 Linux
Linux 五种IO模型
Linux 五种IO模型
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
434 4
网络协议与IO模型
|
安全 NoSQL Java
一文搞懂网络通信的基石✅IO模型与零拷贝
【10月更文挑战第1天】本文深入探讨了网络通信中的IO模型及其优化方法——零拷贝技术。首先介绍了IO模型的概念及五种常见类型:同步阻塞、同步非阻塞、多路复用、信号驱动和异步IO模型。文章详细分析了每种模型的特点和适用场景,特别是多路复用和异步IO在高并发场景中的优势。接着介绍了零拷贝技术,通过DMA直接进行数据传输,避免了多次CPU拷贝,进一步提升了效率。最后总结了各种模型的优缺点,并提供了相关的代码示例和资源链接。
一文搞懂网络通信的基石✅IO模型与零拷贝
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
112 3
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
241 3
|
数据挖掘 开发者
网络IO模型如何选择?
网络IO模型如何选择?【10月更文挑战第5天】
137 2
|
数据库
同步IO模型是一种常见的编程模型
【10月更文挑战第5天】同步IO模型是一种常见的编程模型
132 2
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
167 1
|
存储 机器人 Linux
Netty(二)-服务端网络编程常见网络IO模型讲解
Netty(二)-服务端网络编程常见网络IO模型讲解