Java IO和UNIX IO之间的关系
Java IO | UNIX IO |
---|---|
BIO | Blocking IO |
NIO | IO multiplexing |
AIO | Asynchronous IO |
五种I/O模型
阻塞I/O(blocking IO)
用户调用io后一直阻塞到数据准备好复制到用户空间之后再返回。
非阻塞IO (non-blocking IO)
这个模型下在调用io系统调用之后不会阻塞用户线程,通过用户线程不断询问内核数据是否准备好,当内核返回数据准备完毕,用户线程再将数据从内核空间复制到用户空间。
IO多路复用 (IO muticomplex)
这种模型下存在着一个多路复用器(select/poll/epoll)可以监听多个多个socket的io事件,如何任何一个或者多个sokect准备好,用户线程返回处理这些事件。这个模型任然会阻塞用户线程,但是可以使用一个用户线程处理多个IO请求,复用了线程。
异步IO(asynchronous IO)
程序发起一个IO系统调用之后立马返回,内核在数据准备好之后复制到用户空间再发送信号给用户线程,用户线程收到信号之后进行读写。
对比
问题
1. 旧版本的java nio使用了select系统调用,现在使用的是epoll?
因为select会不断的轮询文件描述符,epoll是注册一个回调函数,epoll效率会好。
2. java有真正的AIO吗?
Windows中的实现是的IOCP。在Linux中,没有,linux中的AIO的底层还是epoll。