天天看点

什么是IO,BIO,NIO,AIO

一、基本概念

IO:阻塞IO

BIO:同步阻塞IO。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器需要启动一个线程进行处理,如果这个链接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

NIO:同步非阻塞IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪,这需要用户进行不停的去询问。NIO的包括三个核心概念:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。

AIO:Asynchronous IO,异步非阻塞AIO。最大的特性时具有异步能力,这种能力对socket与文件I/O都起作用。AIO其实是一种在读写操作结束之前允许进行其他操作的I/O处理。

可概括为:BIO是“我要读”,NIO是“我可以读了”,AIO是“我读完了”

二、区别

(1)NIO和IO的主要区别

IO NIO
面向流 面向缓冲区
阻塞 非阻塞
选择器

(2)BIO,NIO,AIO对比

同步阻塞IO(VIO) 非阻塞IO(NIO) 异步IO(AIO)
客户端个数:IO线程 1:1 M:1(1个IO线程处理多个客户端连接) M:0(不需要启动额外的IO线程,被动回调)
IO类型(阻塞) 阻塞 非阻塞 非阻塞
IO类型(同步) 同步 同步 异步
API使用难度 简单 简单 复杂
调试难度 简单 简单 复杂
可靠性 非常差
吞吐量

三、应用场景

BIO:适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4之前的唯一选择, 但是程序简单直观容易理解。

NIO:适用于连接数目多且连接比较短(轻操作)的架构,比如聊推荐服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO:适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK1.7开始支持。

继续阅读