JAVA中三种I/O框架——BIO、NIO、AIO

一、BIO(Blocking I/O)

BIO,同步阻塞IO模型,应用程序发起系统调用后会一直等待数据的请求,直至内核从磁盘获取到数据并拷贝到用户空间;

在一般的场景中,多线程模型下的BIO是成本较低、收益较高的方式。但是,如果在高并发的场景下,过多的创建线程,会严重占据系统资源,降低系统对外界响应效率。即使使用线程池,只能一定程度上缓解了频繁调用IO接口带来的资源占用。

二、NIO(Non-Blocking/New I/O)

NIO,JAVA中与JDK1.4引入该IO模型,但不要简单的理解为同步非阻塞,JAVA中的NIO实际上可以看作IO多路复用模型,下面简单介绍下这两种I/O模型。

2.1 同步非阻塞模型

应用程序向内核发起请求后,即使kernel没有从磁盘中取到数据,也会返回一个结果给用户,用户判断结果正确性,如果不是需要的数据,则后续继续发起请求,即轮询请求,直至kernel取到数据并返回。

采用轮询方式,会导致系统上下文切换开销很大,会大幅度推高CPU占用率。

2.2 IO多路复用模型

Java 中的 NIO ,有一个非常重要的选择器 ( Selector ) 的概念,也可以被称为 多路复用器。通过它,只需要一个线程便可以管理多个客户端连接。当客户端数据到了之后,才会为其服务。线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。

IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗,解决了同步阻塞I/O和同步非阻塞I/O的问题,是一种非常高效的I/O模型。

三、AIO(Asynchronous I/O)

AIO,异步IO模型,也叫NIO2,JAVA7中引入,异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

四、几种常见IO模型的对比

图片来自【美团技术团队】https://tech.meituan.com/2016/11/04/nio.html ,其中也详细阐述了NIO模型,可前往学习。

相关推荐
zihao_tom29 分钟前
Spring Boot(快速上手)
java·spring boot·后端
hua872221 小时前
SpringSecurity之跨域
java
小王不爱笑1321 小时前
G1 GC 的核心基础:Region 模型的补充细节
java·jvm·算法
salipopl1 小时前
Spring 中的 @ExceptionHandler 注解详解与应用
java·后端·spring
LJianK12 小时前
java封装
java·前端·数据库
海海不瞌睡(捏捏王子)2 小时前
C#知识点概要
java·开发语言·1024程序员节
jessecyj2 小时前
SpringBoot详解
java·spring boot·后端
Flittly2 小时前
【SpringAIAlibaba新手村系列】(2)Ollama 本地大模型调用
java·ai·springboot
_MyFavorite_2 小时前
JAVA重点基础、进阶知识及易错点总结(10)Map 接口(HashMap、LinkedHashMap、TreeMap)
java·开发语言
qqty12172 小时前
Spring Boot管理用户数据
java·spring boot·后端