Java常见的3中 IO 模型
Posted 无恙_z
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 模型的主要内容,如果未能解决你的问题,请参考以下文章