面试必备-如何理解BIO、NIO、AIO

谈到IO首先要了解一下同步,异步,阻塞,非阻塞的概念。

一、 同步、异步、阻塞、非阻塞。

1. 概念解析

同步/异步, 它们是消息的通知机制。

同步

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。

简单来说就是当前程序执行完才能执行后面的程序,程序执行时按照顺序执行,平时写的代码基本都是同步的;

异步

异步的概念和同步相对。

当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。

简单来说就是程序没有等到上一步程序执行完才执行下一步,而是直接往下执行,前提是下面的程序没有用到异步操作的值,异步的实现方式基本上都是多线程(定时任务也可实现,但是情况少)。

阻塞/非阻塞, 它们是程序在等待消息(无所谓同步或者异步)时的状态。

阻塞

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。

对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

2.

案例分析

同步阻塞

你去一家饭馆吃饭,点完饭后取了号就一直排队等着,排到自己了然后取餐找位置吃饭。

同步非阻塞

后来你发现饭馆旁边开了一个书屋,然后点完饭后取了号想着趁着人多就去看会书,但是看一会就需要去饭馆看看排没排到自己。

异步阻塞

再后来饭馆生意越来越好,给点过餐的人每人一个报警器,这样就不用一直排队等了,直接坐位置上,报警器一响就代表饭好了。但是报警器有范围,离开了餐馆就不能用了,所以不能去书屋看书。

异步非阻塞

再后来老板的饭馆支持手机点餐了,你直接去书屋看书,在手机上点了餐,老板把饭做好了就给你打电话了,你就可以去吃饭了。

面试必备-如何理解BIO、NIO、AIO

二、 BIO、NIO、AIO

1. 概念解析

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

NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,

2. 场景分析:

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

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

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

1) BIO

BIO就是传统的IO,比较简单,不再过多的阐述

2) NIO

新的IO,即New IO或者Non-Blocking IO,即同步不阻塞的IO。jdk1.4之后提供了一系列的方法来操作流,定义在java.nio包下面。相比于传统的BIO,NIO 提供了高速的面向快的I/O,它加入了Buffer、Channel、Selector等概念。它是基于事件驱动的,采用了Reactor模式,它使用一个线程管理所有的socket通道,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。它的特点是要不断主动地去询问数据有没有处理完,一般只适用于连接数目较大但连接时间短的应用,如聊天应用等。

· Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

· Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。

· Selectors(选择器):Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。

3) AIO

新的IO2.0,即NIO2.0,jdk1.7开始应用,叫做异步不阻塞的IO。AIO引入异常通道的概念,采用了Proactor模式,简化了程序编写,一个有效的请求才启动一个线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间长的应用。

------------END--------------


分享到:


相關文章: