起因

嘛,又到了校招的季节。群里孩子们每天都在开心的讨论面试题(说的就和我不是一样),感觉NIO,AIO算是热点问题了,这里整理一发。以及,wp写不了markdown好痛苦啊,是不是该考虑换个博客了…..

前言

I/O 这个词怎么也会很熟悉,UNIX中把所有I/O操作都模型化为文件,就理解成文件的 读写即可

UNIX中的体现

其实NIO , BIO , AIO这种称呼貌似都是Java带起来的

最开始,read / write在一个通道中执行,程序运行到此处阻塞,等待I/O操作完成才能继续,当然可以用多线程/进程解决,然而不够优雅。

于是I/O多路复用技术被提出。简单的说,可以让一个线程管理多个I/O流。

  • select实现: 第一个实现,然而有一些蛋疼的问题(诸如不是线程安全,链接数限制什么的)
  • poll实现: 改掉了select的一些蛋疼,然而,还不是线程安全的
  • epoll实现: 最新的实现,修了poll的一批问题,以及,线程安全了。。

于是Java怎么看

  • BIO: 同步阻塞式I/O
  • NIO: 同步非阻塞式I/O
  • AIO: 异步非阻塞式I/O

BIO:
这个不用多说,基本学编程的时候都用过吧,做个单线程server什么的,等待连接并处理

NIO:
首先要说明,jdk1.4时新加了一个包来专门操作非阻塞I/O,叫做nio。然而这里讨论的是非阻塞I/O概念,并不是nio包。

用单个线程处理多个连接,简单来说是把每个连接的不同事件注册在一个selector上,然后事件准备好,线程再去处理,所以说NIO本身是基于事件驱动思想的,然而NIO实现上需要主动的去查询是否有事件准备好

AIO:
AIO的提起其实是Java7引入了nio 2.0(NIO plus?),意为异步式I/O,不用主动的去查询,而是由操作系统通知应用程序(体现为回调函数)

主要是新加了这些:

AsynchronousChannel
AsynchronousServerSocketChannel
AsynchronousSocketChannel
AsynchronousChannelGroup
CompletionHandler