Java IO模型之BIO、NIO、AIO三种常见IO模型解析

 更新时间:2024年07月15日 08:59:55   作者:JavaBuild  
这篇文章主要介绍了今天我们来聊Java IO模型,BIO、NIO、AIO三种常见IO模型,我们从应用调用的过程中来分析一下整个IO的执行过程,不过在此之前,我们需要简单的了解一下整个操作系统的空间布局,需要的朋友可以参考下

一、写在开头

很久没更新喽,最近build哥一直在忙着工作,忙着写小说,都忘记学习自己的本职了,哈哈,不过现在正式回归!
我们继续学习Java的IO相关内容,之前我们了解到,所谓的IO(Input/Output)就是计算机系统与外部设备之间通信的过程。

二、IO调用过程

接下来我们从应用调用的过程中来分析一下整个IO的执行过程。不过在此之前,我们需要简单的了解一下整个操作系统的空间布局。为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为用户空间(User space) 和 内核空间(Kernel space ) 。

内核空间: 是操作系统内核所使用的空间,用来存储底层内核代码、数据结构以及内核级别的系统调用。内核空间拥有比较高的权限,比如文件管理、进程通信、内存管理等等。
用户空间: 用户级别的应用程序和服务分配的内存区域。它包含了应用程序的代码、数据和运行时堆栈。用户空间与内核空间相对隔离,具有较低的权限级别,不能直接访问内核空间或硬件资源。

image

所以说,我们想要进行 IO 操作,一定是要依赖内核空间的能力。平常开发过程中接触最多的就是磁盘 IO(读写文件) 和 网络 IO(网络请求和响应)。

执行步骤:

应用程序发起IO请求;系统内核接受到系统调用请求;内核等待数据准备;内核将数据从内核空间拷贝到用户空间;IO输出给应用程序。

三、IO常用模型

在UNIX系统中,我们所提到的IO模型一般是这四种:同步阻塞 I/O、同步非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O

不过,在日常使用中,我们常用的多为 BIO(Blocking I/O):同步阻塞 IO 模型、NIO (Non-blocking/New I/O):同步非阻塞 IO 模型、AIO (Asynchronous I/O):异步 IO 模型。

3.1 BIO (Blocking I/O)

在传统的IO中,多以这种同步阻塞的IO模型为主,这种模型下,程序发起IO请求后,处理线程处于阻塞状态,直到请求的IO数据从内核空间拷贝到用户空间。如下图可以直观的体现整个流程(图源:沉默王二)。

image

如果发起IO的应用程序并发量不高的情况下,这种模型是没问题的。但很明显,当前的互联网中,很多应用都有高并发IO请求的情况,这时就迫切的需要一款高效的IO模型啦。

3.2 NIO (Non-blocking/New I/O)

这种NIO模型,这个N既可以命名为NEW代表一种新型的IO模型,又可以理解为Non-Blocking,非阻塞之意。

Java NIO 是 Java 1.4 版本引入的,基于通道(Channel)和缓冲区(Buffer)进行操作,采用非阻塞式 IO 操作,允许线程在等待 IO 时执行其他任务。常见的 NIO 类有 ByteBuffer、FileChannel、SocketChannel、ServerSocketChannel 等。(图源:深入拆解Tomcat & Jetty)

image

虽然在应用发起IO请求时,之多多次发起,无须阻塞。但在内核将数据拷贝到用户空间时,还是会阻塞的,为了保证数据的准确性和系统的安全稳定。

3.3 I/O 多路复用模型

在同步非阻塞IO模型下,需要通过不断的轮询去检查请求数据是否已经完成,这个过程是很耗CPU的。因此,便又诞生了I/O多路复用模型。

I/O 多路复用模型:使用操作系统提供的多路复用功能(如 select、poll、epoll 等),使得单个线程可以同时处理多个 I/O 事件。当某个连接上的数据准备好时,操作系统会通知应用程序。这样,应用程序可以在一个线程中处理多个并发连接,而不需要为每个连接创建一个线程。(图源:沉默王二)

image

3.4 AIO (Asynchronous I/O)

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

image

总结

以上BIO、NIO、AIO三种常见的IO模型是Java面试中最常考的,大家一定要记住其各自的特点和作用。

阻塞 I/O:应用程序执行 I/O 操作时,会一直等待数据传输完成,期间无法执行其他任务。非阻塞 I/O:应用程序执行 I/O 操作时,如果数据未准备好,立即返回错误状态,不等待数据传输完成,可执行其他任务。异步 I/O:应用程序发起 I/O 操作后,内核负责数据传输过程,完成后通知应用程序。应用程序无需等待数据传输,可执行其他任务。

到此这篇关于今天我们来聊Java IO模型,BIO、NIO、AIO三种常见IO模型的文章就介绍到这了,更多相关Java IO模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中过滤器Filter+JWT令牌实现登录验证

    SpringBoot中过滤器Filter+JWT令牌实现登录验证

    本文主要介绍了SpringBoot中过滤器Filter+JWT令牌实现登录验证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • java中 == 与 equal 的区别讲解

    java中 == 与 equal 的区别讲解

    这篇文章介绍了java中 == 与 equal 的区别,有需要的朋友可以参考一下
    2013-10-10
  • 解决java.lang.NoClassDefFoundError:lombok/Data报错问题

    解决java.lang.NoClassDefFoundError:lombok/Data报错问题

    在Java开发中,使用Lombok库简化代码非常普遍,今天在启动拉取的git代码时,遇到了java.lang.NoClassDefFoundError:lombok/Data的报错,经过检查,发现错误的原因是将Date误写为Data,且错误地引用了lombok.Data包
    2024-09-09
  • jsp页面中获取servlet请求中的参数的办法详解

    jsp页面中获取servlet请求中的参数的办法详解

    在JAVA WEB应用中,如何获取servlet请求中的参数,本文讲解了jsp页面中获取servlet请求中的参数的办法
    2018-03-03
  • SpringBoot实战之处理异常案例详解

    SpringBoot实战之处理异常案例详解

    这篇文章主要介绍了SpringBoot实战之处理异常案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Springboot集成RabbitMQ并验证五种消息模型

    Springboot集成RabbitMQ并验证五种消息模型

    RabbitMQ 提供了5种常用消息模型,本文主要介绍了Springboot集成RabbitMQ并验证五种消息模型,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Java内存溢出和内存泄露

    Java内存溢出和内存泄露

    这篇文章主要介绍了Java内存溢出和内存泄露的相关资料,需要的朋友可以参考下
    2017-10-10
  • JAVA调用JavaScript的方法示例

    JAVA调用JavaScript的方法示例

    本文主要介绍了JAVA调用JavaScript的方法示例,主要介绍了两种方式,一种是使用Java的ScriptEngine接口,另一种是使用Java的URLConnection类来获取JS文件,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Spring cloud OpenFeign中动态URl、动态传递接口地址代码示例

    Spring cloud OpenFeign中动态URl、动态传递接口地址代码示例

    openFeign是作为微服务之间调用的解决方案,每个微服务项目是必不可少的,下面这篇文章主要给大家介绍了关于Spring cloud OpenFeign中动态URl、动态传递接口地址的相关资料,需要的朋友可以参考下
    2024-02-02
  • idea中操作git shelve与git stash全过程

    idea中操作git shelve与git stash全过程

    文章介绍了两种代码暂存工具:gitshelve和gitstash,gitshelve提供了静默暂存功能,可以从shelf中取出暂存的代码并多次取出,不需要后可以删除shelf,gitstash则通过vcs菜单进行暂存和取出,方便在不同分支间切换时保留修改
    2025-11-11

最新评论