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

引言

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

1.一、使用场景

  • BIO BIO适用于链接数比较小的应用,这种IO模型对服务器资源要求比较高。
  • NIO BIO适用于链接数目多、链接时间短的应用,好比聊天、弹幕、服务器间通信等应用。
  • AIO AIO适用于链接数目多、链接时间长的应用,好比相册服务器。

1.二、BIO

同步并阻塞模型,服务器会为每个链接创建一个线程,若是链接过多,且线程不作任何事情,会极大的浪费资源,示意图以下: 服务器

BIO.png

1.2.一、机制

BIO-工做机制.png
流程:

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

1.2.二、问题

  • 服务端对于每一个请求都要创建独立的线程。
  • 并发数大时,要建立大量的线程,系统资源占用大。
  • 链接创建以后,若是当前线程暂时没有数据可读,则线程就阻塞再Read上,形成线程资源浪费。

1.三、NIO

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

NIO.png

NIO的非阻塞模式,使得一个线程从某通道发送请求或者读取数据时,若是目前没有可用的数据,不会使线程阻塞,在数据可读以前,该线程能够作其余的事情。并发

NIO有三大核心部分:异步

  • Channel(通道)
  • Buffer(缓冲区)
  • Selector(选择器)

NIO-三大部件.png
由图可知:

  • 每一个Channel对应一个Buffer。
  • Selector对应一个线程,一个线程对应多个Channel。
  • Selector会根据不一样的事件,在各个通道上切换。
  • Buffer是内存块,底层是数据。

1.3.一、缓冲区(Buffer)

本质是能够读写数据的内存块,Channel读取或者写入的数据必须经过Buffer: 性能

Buffer.png

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

// Invariants: mark <= position <= limit <= capacity
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
复制代码

Buffer-属性.png

1.3.二、通道(Channel)

通道是双向的,能够读操做、也能够写操做。 java.nio.channels.Channel接口的经常使用实现类: 操作系统

Channel.png

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

1.3.三、选择器(Selector)

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

Selector示意图.png

1.四、AIO

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

1.五、BIO NIO AIO 对比

对比.png

tencent.jpg
相关文章
相关标签/搜索