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

相关推荐
妮妮喔妮22 分钟前
【无标题】
开发语言·前端·javascript
慕y27426 分钟前
Java学习第十五部分——MyBatis
java·学习·mybatis
大鸡腿同学27 分钟前
身弱武修法:玄之又玄,奇妙之门
后端
fie888927 分钟前
浅谈几种js设计模式
开发语言·javascript·设计模式
A__tao29 分钟前
SQL 转 Java 实体类工具
java·数据库·sql
喝可乐的布偶猫34 分钟前
Java类变量(静态变量)
java·开发语言·jvm
TDengine (老段)1 小时前
TDengine STMT2 API 使用指南
java·大数据·物联网·时序数据库·iot·tdengine·涛思数据
喝可乐的布偶猫1 小时前
韩顺平之第九章综合练习-----------房屋出租管理系统
java·开发语言·ide·eclipse
Code季风1 小时前
深入理解微服务中的服务注册与发现(Consul)
java·运维·微服务·zookeeper·架构·go·consul
光军oi1 小时前
java微服务(Springboot篇)——————IDEA搭建第一个Springboot入门项目
java·spring boot·微服务