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模型,可前往学习。

相关推荐
救救孩子把37 分钟前
从 JDK 8 到 JDK 23:HotSpot 垃圾回收器全景演进与深度剖析
java·开发语言·jvm·jdk
ha20428941941 小时前
Linux操作系统学习之---线程控制
java·linux·学习
Knight_AL1 小时前
Spring AOP 中@annotation的两种写法详解
java·spring
某空m1 小时前
【Android】BottomNavigationView实现底部导航栏
android·java
顾漂亮1 小时前
Spring AOP 实战案例+避坑指南
java·后端·spring
SimonKing2 小时前
Mybatis-Plus的竞争对手来了,试试 MyBatis-Flex
java·后端·程序员
光军oi2 小时前
JAVA全栈JVM篇————初识JVM
java·开发语言·jvm
我命由我123452 小时前
PDFBox - PDFBox 加载 PDF 异常清单(数据为 null、数据为空、数据异常、文件为 null、文件不存在、文件异常)
java·服务器·后端·java-ee·pdf·intellij-idea·intellij idea
7哥♡ۣۖᝰꫛꫀꪝۣℋ2 小时前
Spring Boot
java·spring boot·后端
Moniane2 小时前
C++深度解析:从核心特性到现代编程实践
java·开发语言·jvm