起因
嘛,又到了校招的季节。群里孩子们每天都在开心的讨论面试题(说的就和我不是一样),感觉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