在理解java的I/O 模型之前先来看下基础的I/O 模型
1.BIO 阻塞型I/O: 顾名思义在进程发出I/O请求后,进程阻塞,在操作系统I/O操作完成,即数据准备就绪后,进程恢复运行
2 NIO 非阻塞型I/O:进程进行I/O请求后 立刻返回,如果数据没有准备好,则返回空,在使用时需要以轮询的方式反复进行I/O请求,确保数据到达。
3 I/O 多路复用( IO multiplexing):核心思路是以一个单独的线程去管理进程的所有I/O 请求(同步异步不一定) ,主要有是三个模型 select ,poll,epoll
其中 select 和poll 模型是以轮询的方式,检查各个线程的I/O操作有没有完成并通知相应的线程
而epoll是通过内核通知的方式,在数据准备好以后由内核通知管理线程,再由管理线程通知I/O对应线程
4 信号驱动式IO(signal-driven IO): 再这里首先先介绍操作系统I/O的两个阶段,第一阶段,将数据由数据源(网络,硬盘等)复制到操作系统内核缓冲区,第二阶段:将数据由操作系统内核缓冲区复制到进程的内存地址空间中,信号驱动IO 是进程发出I/O请求后,不阻塞继续运行,待I/O第一阶段完成,由操作系统以信号的方式通知进程,进程进行处理,此时进行I/O 第二阶段操作时进程需要阻塞
5 异步 I/O(asynchronous IO) 这个类似回调函数实现,进程发出I/O请求后,不阻塞继续运行,当该I/O操作的第二阶段完成后,操作系统通知进程 ,运行回调函数,处理数据
java I/O 模型
1 BIO 阻塞型IO 对应的是java.io 包下 各种 stream 和read 的类库
2 NIO java的NIO 是new IO 对应得模型是 I/O 多路复用
NIO 主要由三个部分组成:channel buffer,selector 其中buffer是缓冲区的抽象,代表数据源,channel是传输的抽象,
selector作为管理者 管理多个channel,整个流程就是线程通过buffer读写数据,数据通过channel进行传输,selector负责总体调度
3 AIO 异步 I/O :是在java NIO的基础上增加特殊的channel 类来实现 并通过回调处理