深入了解Netty【一】BIO、NIO、AIO简单介绍

时间:2019-11-29 23:43:38   收藏:0   阅读:79

引言

在Java中提供了三种IO模型:BIO、NIO、AIO,模型的选择决定了程序通信的性能。

1.1、使用场景

1.2、BIO

同步并阻塞模型,服务器会为每一个连接建立一个线程,如果连接过多,且线程不做任何事情,会极大的浪费资源,示意图如下:
技术分享图片

1.2.1、机制

技术分享图片
流程:

  1. 服务器端启动ServerSocket。
  2. 客户端启动Socket对服务器进行通信,服务器会为每个客户端建立一个线程与之通信。
  3. 客户端发送请求,先咨询服务器是都有线程响应,如果没有则会等待,或者被拒绝。
  4. 如果有响应,客户端线程会等待请求结束后,再继续执行。

1.2.2、问题

1.3、NIO

同步非阻塞模型,服务器端用一个线程处理多个连接,客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到连接有IO请求就进行处理:
技术分享图片

NIO的非阻塞模式,使得一个线程从某通道发送请求或者读取数据时,如果目前没有可用的数据,不会使线程阻塞,在数据可读之前,该线程可以做其他的事情。

NIO有三大核心部分:

技术分享图片
由图可知:

1.3.1、缓冲区(Buffer)

本质是可以读写数据的内存块,Channel读取或者写入的数据必须通过Buffer:
技术分享图片

java.nio.Buffer抽象类的属性:

// Invariants: mark <= position <= limit <= capacity
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;

技术分享图片

1.3.2、通道(Channel)

通道是双向的,可以读操作、也可以写操作。
java.nio.channels.Channel接口的常用实现类:
技术分享图片

FileChannel用于文件的数据读写,DatagramChannel用于UDP的数据读写,ServerSocketChannel和SocketChannel用于TCP的数据读写。

1.3.3、选择器(Selector)

Selector选择器使用一个线程来维护。多个Channel会以事件的方式注册到同一个Selector,当有事件发生时,Selector会获取事件,然后针对每个事件进行响应的处理。这样就不必为每个连接创建一个线程,不用维护多线程,也不会有多线程之间的上下文切换导致的系统的开销。
Selector示意图:

技术分享图片

1.4、AIO

异步非阻塞模型,AIO引入异步通道的概念,使用了Proactor,只有有效的请求才启动线程,特点是先由操作系统完成后,才通知服务器端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。

1.5、BIO NIO AIO 对比

技术分享图片

技术分享图片

原文:https://www.cnblogs.com/clawhub/p/11960890.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!