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

相关推荐
love530love几秒前
【PyCharm必会基础】正确移除解释器及虚拟环境(以 Poetry 为例 )
开发语言·ide·windows·笔记·python·pycharm
凌辰揽月2 分钟前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
前端世界3 分钟前
ASP.NET ListBox控件多选实战:3步打造高效兴趣收集系统
后端·asp.net
海奥华26 分钟前
go中的接口返回设计思想
开发语言·后端·golang
lifallen8 分钟前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
运维开发王义杰8 分钟前
Python: 告别 ModuleNotFoundError, 解决 pipx 环境下 sshuttle 缺少 pydivert 依赖的终极指南
开发语言·python
k要开心9 分钟前
从C到C++语法过度1
开发语言·c++
长安不见10 分钟前
背景知识: 理解LimitLatch背后的AQS
java
小吕学编程12 分钟前
策略模式实战:Spring中动态选择商品处理策略的实现
java·开发语言·设计模式
weixin_4383354018 分钟前
Spring Boot实现接口时间戳鉴权
java·spring boot·后端