Java IO
未完待续...
IO模型
Java中的BIO、NIO和AIO都是Java语言对操作系统接口的封装。 UNIX提供了5种IO模型,分别是阻塞IO模型、非阻塞IO模型、多路复用IO模型、信号驱动IO模型和异步IO模型。 以套接字接口(send/sendto和recv/recvfrom)中的recvfrom为例来讲解此模型。 首先要知道,应用进程读取数据分为两个阶段:
- 等待数据准备就绪阶段
- 数据从内核复制到用户空间
阻塞IO模型
在用户空间中调用recvfrom,系统调用直到数据报到达且被复制到应用程序的缓冲区中或发生错误才返回,在此期间进程处于阻塞状态。
非阻塞IO模型
在用户空间中调用recvfrom,如果该缓冲区中没有数据的话,就直接返回一个EWOULDBLOCK错误。一般可通过轮询检查。
多路复用IO模型
首先使用select/poll/epoll系统调用,进程受阻于select/poll/epoll,等待1个或多个套接字变为可读;当数据准备就绪时,调用recvfrom从内核缓冲区复制数据。
select/poll是顺序扫描fd是否就绪;epoll基于事件驱动方式。
信号驱动IO模型
首先开启套接口信号驱动IO功能,并通过系统调用sigaction执行一个信号处理函数(非阻塞)。当数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据。
异步IO模型
用户线程调用aio_read系统调用后立即返回,一直到数据复制完成后,通知信号处理程序处理。
对于BIO,每个连接都对应一个线程,所有线程同时在工作。对于NIO,所有连接都会注册到多路复用器上,当有读写事件发生时,才会有线程来处理。
Netty
Netty使用多路复用IO模型,使用Reactor线程模式。 多路复用IO模型可以用阻塞IO模式,也可以用非阻塞IO模式。 Reactor线程模型分为单线程模型、多线程模型和主从线程模型。