Java IO 模型
IO 是个啥
IO,是 input/output
的缩写,表面意思是输入/输出
,描述计算机中数据流动的过程,实际上就是 CPU、内存和外部进行数据交换的过程
举个例子,某个进程要获取到数据的过程如下:
- 1.请求:进程请求外部数据
- 2.准备:缓冲区准备数据,通过磁盘或者网络读取数据到内核空的缓冲区
- 3.拷贝:将数据从内核空间再拷贝到进程的内存
Java 中的网络 IO
Java 中的网络 IO 模型分三种:
- BIO
阻塞 IO(Blocking IO)
,服务器为每个客户端连接开启一个线程来处理请求
- NIO
同步非阻塞 IO(Non-Blocking IO)
,服务器实现模式为一个线程处理多个请求(连接),即连接请求都会注册到多路复用器(Selector)上,多路复用器轮询到连接有 I/O 请求就进行处理
单个线程,可以处理更多的客户端请求
一个 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开始 |
逃避不一定躲得过,面对不一定最难过