简单理解 Java I/O 模型

在理解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 类来实现  并通过回调处理

 

 

 

 

你可能感兴趣的:(IO)