BIO、NIO和AIO的区别

一、基础知识:

I/O 模型的简单理解:

1.BIO(Blocking I/O):同步阻塞,一个线程处理一个通道上的事件。

2.NIO(Non-blocking I/O):同步非阻塞,使用选择器(Selector)来管理多个通道,一个线程可以按某种顺序处理多个通道上的事件(同一时间一个线程只能处理一个通道)。

3.AIO(Asynchronous I/O):异步非阻塞,使用操作系统提供的异步I/O机制来管理多个通道,一个线程可以同时处理多个通道上的事件(同一时间一个线程可以处理多个通道)

同步与异步:
  1. 同步(Synchronous):

    • 同步指的是任务按顺序依次执行,一个任务的执行必须等待前一个任务的完成。
    • 在同步处理中,任务的调用者需要主动等待任务的完成,并在等待期间阻塞并占用资源。
    • 在同步模式下,任务的执行顺序是确定的,具有可预测性。
  2. 异步(Asynchronous):

    • 异步指的是任务的执行不依赖于前一个任务的完成,可以同时执行多个任务,任务的执行结果可能以回调函数或事件的形式返回。
    • 在异步处理中,任务的调用者不需要主动等待任务的完成,而是继续执行其他任务,真正的处理工作由其他线程、进程或者操作系统来完成。
    • 在异步模式下,任务的执行顺序不确定,具有不可预测性,但可以提高系统的并发性和响应性。

二、BIO、NIO和AIO的区别

I/O 模型:

BIO:调用线程会在读写操作上阻塞,直到数据完全传输或发生错误。

NIO:使用选择器轮询通道上的事件,并处理已经就绪的通道,可以处理多个连接,但仍然需要一个线程来处理一个通道的 I/O 操作,一个线程可以对应多个通道(常用组件有Channel和Buffer)。

AIO:I/O 操作在后台由操作系统进行处理,调用线程可以继续处理其他任务,当 I/O 操作完成时,操作系统会通知应用程序。

并发支持:

BIO:每个连接都需要一个独立的线程处理,当并发连接数增加时,线程数量会大量增加,对系统资源消耗较大。

NIO:使用较少的线程处理多个连接,线程可以处理多个通道的就绪事件。

假设一个线程可以处理 5 个通道的事件,当有多个通道就绪时,线程会按照某种顺序(例如选择器上注册的顺序)依次处理每个就绪的通道。在处理一个就绪通道的事件时,如果该事件涉及阻塞的操作(如 I/O 操作),那么该线程可能会在这个操作上阻塞,而不会处理其他通道的事件,如果这5个通道中第一个通道上的事件已经被处理,那么在下一个轮询周期时,选择器会重新检查该通道的状态,如果有新的事件进入该通道,那么该通道也会重新进入排队,等待处理。

AIO:通过回调机制实现异步处理,不需要线程等待 I/O 操作完成,可以处理大量的并发连接而不需要过多的线程。

编程方式:

BIO:采用阻塞方式,代码编写简单直观,但对并发连接数有限制。

NIO:采用事件驱动和选择器的方式,代码编写较复杂,需要处理就绪事件。

AIO:通过回调机制,在操作完成时触发回调函数进行处理,编程方式相对复杂,但相对于 NIO 更容易实现高并发。

性能表现:

BIO:适用于连接数较少且处理逻辑简单的情况,对于大规模并发请求,性能较差。

NIO:适用于连接数多但交互较简单的情况,适合处理长连接和高并发连接。

AIO:可以在处理大量简单或者复杂的I/O请求时提供好的性能。

相关推荐
cfm_29143 分钟前
ThreadLocal 内存泄漏
java·jvm
我的xiaodoujiao5 分钟前
Django 基础知识详细图文教程 4-Django 视图定义与使用
开发语言·数据库·后端·测试工具·django·sqlite
l1t6 分钟前
DeepSeek总结的DuckDB在 CI 中为 release 和 glibc CLI 构建启用 LTO - #24225
开发语言·数据库·ci/cd·duckdb
whitelbwwww7 分钟前
c++运行RKNN
开发语言·c++
NJCloud9 分钟前
Docker 镜像管理:分层结构、构建优化与最佳实践
java·docker·容器
2601_9620702314 分钟前
差异基因富集分析(R语言——GO&KEGG&GSEA)
开发语言·golang·r语言
布莱克60516 分钟前
栈(Stack)详解:定义、作用、应用场景及与队列的区别(附 C/C++ 代码)
c语言·开发语言·c++·
vipxieliang16 分钟前
收货地址验证完整方案:省市区与详细地址
java·spring boot
zmzb010317 分钟前
C++课后习题训练记录Day203
开发语言·c++
Apifox19 分钟前
Apifox 8 月更新|调试、权限与协作体验持续优化
前端·后端·测试