从Java BIO 到 Netty (一) ---IO

IO

I/O通常指的是输入/输出(Input/Output),在Java中有磁盘IO,网络IO等.
I/O在Java中也统称为流,我们可以通过流获取输入,输出数据.
Java中的流,整体上分为两类: 字符流与字节流.

  • 字符流: Reader/Writer,数据流中的最小单位是字符,用于读取字符文件
  • 字节流: InputStream/OutputStream,数据流中最小单位是字节,可以读取任意文件
  • 缓冲流: Bufferedxxx,对文件只是进行简单读写操作的话可以使用,通过缓冲可以提高读写效率

IO交互流程

一次IO分为两阶段:
①操作系统进行数据读取到内核缓冲区
②从内核缓冲区复制数据,拷贝的用户空间
从Java BIO 到 Netty (一) ---IO

IO的类型

IO分为两阶段,等待数据(等待数据拷贝至内核空间), 拷贝数据(从内核空间拷贝数据至用户空间)

名称 同步/异步 阻塞状态 优点 缺点 应用
阻塞IO模型 同步 等待数据与拷贝数据两阶段都阻塞 进程阻塞不消耗CPU资源;实现难度低 每个IO请求都会阻塞线程,系统开销大;不适合并发量大的应用 Java BIO
非阻塞IO模型 同步 等待数据不阻塞(轮询),拷贝数据阻塞 实现难度低,开发应用相较于阻塞IO模型较难 轮询调用,消耗CPU资源;适合并发量小切不需要及时响应的应用 Socket设置NON BLOCK
多路复用IO模型 同步 类似于阻塞IO 整体上是一直阻塞的,只是阻塞的是select线程,而不是用户线程,但是可以通过一个select线程处理多个用户线程 开发难度大 Java NIO, Netty
信号驱动IO模型 同步 等待数据不阻塞, 拷贝数据阻塞 应用少,不做介绍 开发难度大 应用少,不做介绍
异步IO模型 异步 两阶段都不阻塞 不阻塞,数据异步到位,适合高性能应用开发 需要系统底层支持,linux2.5内核首现,Linux2.6的内核标准特性 开发难度大

同步与异步

同步与异步关注的是消息通信机制

  • 同步: 发出调用后,就一直等待结果,没有得到结果时,不返回.
  • 异步: 发出调用后,立即返回,不刻意等待结果.

阻塞与非阻塞

阻塞与非阻塞关注的是等待结果时的状态.

  • 阻塞 : 在未得到结果时,会将当前线程挂起,阻塞当前线程执行
  • 非阻塞 : 在未得到结果时,当前调用不会阻塞当前线程执行

通俗的讲:
同步与异步存在于发起IO请求中
阻塞与非阻塞存在于实际的IO操作中

另一种解释

同步与异步指的是CPU时间片的利用.
如果请求方发起请求之后,一直等待应答结果(同步阻塞),或者可以先去处理其他事情,但是要不断轮询获取结果(同步非阻塞),形式上都是同步操作.
如果是服务方通知请求方结果的,请求方一直在等待通知(异步阻塞),或者请求方先处理其他事情,期间等待服务方通知的(异步非阻塞),形式上都是异步操作.

各IO模型的对比与总结

从Java BIO 到 Netty (一) ---IO