NIO与BIO

同步与异步

同步:某个时间段只能做一间事情.(如队列)

异步:某个时间段可以做多个事情(如多线程)

阻塞与非阻塞

NIO:同步非阻塞IO:Netty采用这种方式

BIO:同步阻塞IO

AIO:异步非阻塞IO

  • 在阻塞模式下,若从网络流中读取不到指定大小的数据量,阻塞IO就在那里阻塞着。比如,已知后面会有10个字节的数据发过来,但是我现在只收到8个字节,那么当前线程就在那傻傻地等到下一个字节的到来,对,就在那等着,啥事也不做,直到把这10个字节读取完,这才将阻塞放开通行。
  • 在非阻塞模式下,若从网络流中读取不到指定大小的数据量,非阻塞IO就立即通行。比如,已知后面会有10个字节的数据发过来,但是我现在只收到8个字节,那么当前线程就读取这8个字节的数据,读完后就立即返回,等另外两个字节再来的时候再去读取
     

BIO与NIO

NIO的全称是NoneBlocking IO,非阻塞IO,区别与BIO,BIO的全称是Blocking IO,阻塞IO。那这个阻塞是什么意思呢?

  1. Accept是阻塞的,只有新连接来了,Accept才会返回,主线程才能继
  2. Read是阻塞的,只有请求消息来了,Read才能返回,子线程才能继续处理
  3. Write是阻塞的,只有客户端把消息收了,Write才能返回,子线程才能继续读取下一个请求 

BIO(Blocking IO):

NIO与BIO

  • 一个client连接由一个socket接收连接信息,并把客户端信息交由一个线程去处理。客户端中的socket的outputStream传递的数据给服务端的inputstream接收,服务端把响应数据通过outputStream返回给客户端的inputstream响应
  • 传统的多线程服务器是BlockingIO模式的,从头到尾所有的线程都是阻塞的。这些线程就干等在哪里,占用了操作系统的调度资源,什么事也不干,是浪费
  • 阻塞IO(必须等到数据接收完毕才可执行业务逻辑),用流传输数据(InputStream/OutputStream)用完即关闭,在用时重新开辟--浪费系统性能,可以通过线程池解决

NIO (Non-Blocking IO):

NIO与BIO

是的发生的

  • Selector 一般称 为选择器 ,也可以翻译为 多路复用器,负责监听注册到selector的事件,进行对应的业务处理
  • buffer缓冲区(缓冲区是双向的--->面向缓冲区),负责数据的存储
  • Channel通道(多路复用机制)--->负责链接,负责数据的传输
  • Connect(连接就绪)、Accept(接受就绪)、Read(读就绪)、Write(写就绪)
  • 同步非阻塞(数据传输和业务分离),通过通道(Channel)和缓冲区(buffer)来传输数据,Channel(多路复用机制),避免了BIO流的重复创建和关闭对资源的消耗,一个线程轮询(selector选择器),数据准备完成时在去分发线程去处理

 Netty

  • Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象。
  • 在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外的线程池来处理。
  • Accept连接和读写操作也可以使用同一个线程池来进行处理。而请求处理逻辑既可以使用单独的线程池进行处理,也可以跟放在读写线程一块处理。线程池中的每一个线程都是NIO线程。用户可以根据实际情况进行组装,构造出满足系统需求的并发模型
  • Netty提供了一些列生命周期回调接口,当一个完整的请求到达时,当一个连接关闭时,当一个连接建立时,用户都会收到回调事件,然后进行逻辑处理