Java IO 模型

发布时间 2023-12-20 15:12:42作者: yzl1990

IO 是个啥

IO,是 input/output 的缩写,表面意思是输入/输出,描述计算机中数据流动的过程,实际上就是 CPU、内存和外部进行数据交换的过程

举个例子,某个进程要获取到数据的过程如下:
image

  • 1.请求:进程请求外部数据
  • 2.准备:缓冲区准备数据,通过磁盘或者网络读取数据到内核空的缓冲区
  • 3.拷贝:将数据从内核空间再拷贝到进程的内存

Java 中的网络 IO

Java 中的网络 IO 模型分三种:

  • BIO
    阻塞 IO(Blocking IO),服务器为每个客户端连接开启一个线程来处理请求
    image
  • NIO
    同步非阻塞 IO(Non-Blocking IO),服务器实现模式为一个线程处理多个请求(连接),即连接请求都会注册到多路复用器(Selector)上,多路复用器轮询到连接有 I/O 请求就进行处理
    image

单个线程,可以处理更多的客户端请求
image

一个 Selector 对应一个处理线程
一个 Selector 上可以注册多个 Channel
每个 Channel 都会对应一个 Buffer(有时候一个 Channel 可以使用多个 Buffer,这时候程序要进行多个 Buffer 的分散和聚集操作)
Buffer 的本质是一个内存块,底层实现是一个数组
Selector 会根据不同的事件在各个 Channel 上切换
Buffer 是双向的,可以读/写,如果切换读写,则需要调用 Buffer 的 flip 方法
Channel 也是双向的,数据可以流入/流出

  • AIO
    异步非阻塞 IO(Async Non-Blocking IO),AIO 引入异步通道的概念,由操作系统完成与客户端之间的 read/write,之后再由操作系统主动通知服务器线程去处理后面的工作,在这个过程中服务器线程不必同步等待 read/write 完成。由于不同的操作系统对 AIO 的支持程度不同,AIO 目前未得到广泛应用。

适用场景

I/O模式 使用场景 JDK版本
BIO 连接数比较小且固定的架构 1.4以前
NIO 连接数目多且连接比较短的架构 1.4开始
AIO 连接数目多且连接时间长的架构 1.7开始