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

相关推荐
葫芦和十三3 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp4 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑4 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯5 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan7 小时前
多Agent之间的区别
后端
青石路9 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充10 小时前
1.面向对象设计思想
后端
IT_陈寒10 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro10 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗11 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端