1.BIO/NIO/AIO简单介绍
IO指Java中input(输入流),output(输出流)等对外输出交换数据的形式,传输的可以是文件,网络,内存等
随着对流之间的传输要求越来越高,JAVA演变出了三代IO模型分别是 BIO、NIO、AIO。
(1)BIO (blocking I/O): 同步并阻塞
服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,相当于一对一模式,如果客户端一直连接着不发送请求的信息,或者它发送信息过程中有网络问题,导致服务端接收不到信息,这样就会造成服务端一直等着,即阻塞
从下面的解释可以看出BIO适合传输连接量比较小的场合,如果传输连接量变大,即会造成性能问题,也会导致大量的线程资源浪费,为了处理这些问题,就出现NIO
最后提一下,BIO在java1.4之前及其适用
(2)NIO (non-blocking I/O) 同步非阻塞
服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
通常来说是在BIO基础上加了一个Selector选择器,相当于加了一成过滤,Selector选择器会去判断客户请求的管道(Channel)信息是否能立即执行,而不用让服务端线程一直等待
Netty其在底层就是采用这种通信模型
(3)AIO(NIO.2) (Asynchronous I/O) 异步非阻塞
服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,总的来说是在NIO基层上在加了一成处理,这里我就不在这多做解释了
2.BIO与NIO模型区别
两组模型最大的别区在于阻塞与非阻塞,而所谓的阻塞是什么呢?而非阻塞又是如何解决的呢?
在阻塞模型中客户端与服务端建立连接后,就会按顺序发生三个事件
1.客户端把数据写入流中。(阻塞)
2.通过网络通道(TPC/IP)传输到服务端。(阻塞)
3.服务端读取。
这个过程中服务端的线程会一直处阻塞等待,直到数据发送过来后执行第3步。
如果在第1步客户端迟迟不写入数据,或者第2步网络传输延迟太高,都会导致服务端线程阻塞时间更长。所以更多的并发,就意味着需要更多的线程来支撑。