Java常见的3中 IO 模型

Posted offerNotFound

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java常见的3中 IO 模型相关的知识,希望对你有一定的参考价值。

本文部分参考 Guide大佬的八股文!!!

UNIX 系统下, IO 模型一共有 5 种: 同步阻塞 I/O、同步非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。本文记录不易理解,建议去看这里的讲解

BIO (Blocking I/O)

BIO 属于同步阻塞 IO 模型。在同步阻塞 IO 模型中,应用程序发起 read 调用后,会一直阻塞,直到在内核把数据拷贝到用户空间。

同步阻塞:从准备数据到拷贝数据都一直是阻塞的。

BIO 在连接数量少时还能应付,当连接数达到百万级别时就不行了,需要换更高效的 IO 模型。

NIO (Non-blocking/New I/O)

NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它支持面向缓冲的,基于通道的 I/O 操作方法。 对于高负载、高并发的(网络)应用,应使用 NIO 。

Java 中的 NIO 可以看作是 I/O 多路复用模型。也有很多人认为,Java 中的 NIO 属于同步非阻塞 IO 模型。

同步非阻塞:准备数据这一块去不阻塞的,但拷贝数据这任然阻塞。

NIO 通过轮询操作,避免了一直阻塞。但是这个不断轮询操作十分耗 CPU 资源,这个时候,I/O 多路复用模型 就上场了。

IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间->用户空间)还是阻塞的。

IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗。

AIO (Asynchronous I/O)

AIO 也就是 NIO 的另一个版本,是异步 IO 模型。

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

以上是关于Java常见的3中 IO 模型的主要内容,如果未能解决你的问题,请参考以下文章

网络IO模型

Java IO模型详解

Java 四种常见网络IO模型以及selectpollepoll函数的简单介绍

Java NIO Reactor网络编程模型的深度理解

第95p,最常见的4种网络IO模型

高性能Socket模型