欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 一文讲清 AIO BIO NIO的区别

一文讲清 AIO BIO NIO的区别

2025/2/23 5:08:54 来源:https://blog.csdn.net/sosovo66/article/details/145765953  浏览:    关键词:一文讲清 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函数,然后用户进程中会创建出一个信号处理程序,同时用户进程可立马返回执行其他操作,在数据写入到内核、且从内核拷贝到用户缓冲区后,内核会通知对应的用户进程对数据进行处理。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词