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请求时提供好的性能。

相关推荐
牛马小陈同学6 分钟前
Kafka+Zookeeper从docker部署到spring boot使用完整教程
linux·spring boot·docker·zookeeper·kafka·prettyzoo·kafka-ui
Mryan20059 分钟前
SpringBoot项目报错: 缺少 Validation
java·spring boot
赖皮猫17 分钟前
PIKIE-RAG 本地部署实践
后端·python·flask
Asthenia041232 分钟前
面试回顾:Java RMI 问题解析(续)
后端
无名之逆35 分钟前
[特殊字符] Hyperlane 框架:高性能、灵活、易用的 Rust 微服务解决方案
运维·服务器·开发语言·数据库·后端·微服务·rust
SnXJi_1 小时前
开源赋能,双驱协同:纷析云财务与进销存软件助力企业数字化转型
java·gitee·开源·开源软件
Asthenia04121 小时前
面试回顾:Java RMI 问题解析
后端
Vitalia1 小时前
⭐算法OJ⭐寻找最短超串【动态规划 + 状态压缩】(C++ 实现)Find the Shortest Superstring
开发语言·c++·算法·动态规划·动态压缩
uhakadotcom1 小时前
Python 中的 @staticmethod 和 @classmethod 详解
后端·面试·github
eternal__day1 小时前
第三期:深入理解 Spring Web MVC [特殊字符](数据传参+ 特殊字符处理 + 编码问题解析)
java·前端·spring·java-ee·mvc