当前位置: 首页 > article >正文

一文讲清 AIO BIO NIO的区别

引言

在 Java 编程中,BIO(Blocking I/O)、NIO(Non-blocking I/O)和 AIO(Asynchronous I/O)是三种不同的 I/O 模型,它们在处理输入输出操作时有着不同的机制和特点,但是市面上大部分都是文字讲解不够深刻,本篇文章力求讲清楚他们三者的区别

BIO同步阻塞

BIO(Blocking-IO)即同步阻塞模型,这也是最初的IO模型,也就是当调用内核的read()函数后,内核在执行数据准备、复制阶段的IO操作时,应用线程都是阻塞的,所以本次IO操作则被称为同步阻塞式IO,如下:

  

当程序中需要进行IO操作时,会先调用内核提供的read()函数,但在之前分析过IO的工作原理,IO会经过“设备→内核缓冲区→程序缓冲区”这个过程,该过程必然是耗时的,在同步阻塞模型中,程序中的线程发起IO调用后,会一直挂起等待,直至数据成功拷贝至程序缓冲区才会继续往下执行。

NIO非阻塞式 I/O

非阻塞式 I/O,是 Java 1.4 引入的新 I/O 模型。它基于通道(Channel)和缓冲区(Buffer)进行操作,线程在进行 I/O 操作时,如果没有数据可用或无法立即完成操作,不会被阻塞,而是可以继续执行其他任务。通过选择器(Selector)可以实现一个线程管理多个通道的 I/O 操作。

当应用程序中发起IO调用后,内核并不阻塞当前线程,而是立马返回一个“数据未就绪”的信息给应用程序,而应用程序这边则一直反复轮询去问内核:数据有没有准备好?直到最终数据准备好了之后,内核返回“数据已就绪”状态,紧接着再由进程去处理数据

AIO 异步 I/O

即异步 I/O,是 Java 7 引入的异步 I/O 模型。在 AIO 中,当进行 I/O 操作时,线程不会等待操作完成,而是在操作完成后会通过回调函数或 Future 对象通知线程。线程在发起 I/O 操作后可以继续执行其他任务,从而实现真正的异步处理。

 在AIO模型中,同样会基于信号驱动实现,在最开始会先调用aio_read、sigaction函数,然后用户进程中会创建出一个信号处理程序,同时用户进程可立马返回执行其他操作,在数据写入到内核、且从内核拷贝到用户缓冲区后,内核会通知对应的用户进程对数据进行处理。


http://www.kler.cn/a/554534.html

相关文章:

  • hive迁移补数脚本细粒度 表名-分区唯一键
  • Linux内核实时机制7 - 实时改造机理 -软中断优化上
  • php 系统命令执行及绕过
  • shell编程总结
  • 树莓派4基于Debian GNU/Linux 12 (Bookworm)添加多个静态ipv4网络
  • 设计模式教程:享元模式(Flyweight Pattern)
  • 实时股票行情接口与WebSocket行情接口的应用
  • python中格式化输出知识点汇总
  • 使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)
  • 视觉目标检测之小目标检测技术调研与实验
  • 网络安全技术pat实验 网络安全 实验
  • 当滑动组件连续触发回调函数的三种解决办法
  • 相比于WebSocket,SSE更适合轻量级
  • 【Scrapy】Scrapy教程7——存储数据
  • 【每日德语】leuchten 发光
  • HarmonyOS全栈开发指南:从入门到精通,构建万物智联的未来生态(四)
  • Spark提交任务
  • android,flutter 混合开发,pigeon通信,传参
  • Sun-Panel:简洁且美观的导航首页开源项目!!
  • Nginx 请求转发配置指南