NIO总结

经典IO模型

  • BIO, 同步阻塞IO模型

  • NIO,同步非阻塞IO模型,轮训server获取数据

  • 多路复用IO模型,多路复用实现了一个线程处理多个 I/O 句柄的操作。多路指的是多个数据通道,复用指的是使用一个或多个固定线程来处理每一个 Socket,通过select调用获取通道的数据状态,进而继续后续操作

  • 信号驱动IO模型,类似回调,通过向系统内部发送的信号,不阻塞当前线程执行,待系统返回信号再执行IO操作

AIO,异步IO模型,与信号驱动有点类似,区别在于,AIO是在发生系统调用之后,客户端不阻塞,并且系统主动将数据拷贝到客户端并告诉客户端可以进行操作,客户端不需要再去进行系统调用获取数据。
image.png

复习同步/异步,阻塞/非阻塞

  • 同步/异步,关注的是消息通信的机制,同步就是调用者发起一个调用,调用不返回,调用者就一直等待,直到调用返回。异步就是调用者发起一个调用,这个调用立刻返回,但是不一定有结果,结果会在被调用者实际产生时通过回调,消息等机制让调用者知晓。
  • 阻塞/非阻塞,关注的是调用过程中的状态,当执行调用的线程没有得到结果,线程挂起等待,就是阻塞,当执行调用的线程没有得到结果,线程不会挂起,会切换到其他任务执行,就是非阻塞。
  • 举个例子:张三去银行办理存款业务,把钱给柜员后,柜员跟他说:稍等,这边流程走完才能保证你的钱存进去了,张三就坐在柜台等着流程走完,柜员跟他说可以了,张三才走。这个过程就是一个同步的过程
  • 另一个情况,张三去银行办理存款业务,把钱给柜员后,柜员跟他说:这边已经收到你的存款了,等到我们流程走完确保你的钱存进去后会发短信告知,张三就起身走了。这个过程就是一个异步的过程
  • 再拿上面例子解释阻塞/非阻塞,张三一直等着柜员给他钱存进去了的消息才离开,就是阻塞的,反之,张三钱给了柜员之后就去拿快递了,等拿完快递再来银行找柜员拿消息,就是非阻塞的。
  • 其实同步异步,阻塞非阻塞,可以理解为同一个问题不同的角度的阐述,阻塞非阻塞,从线程调用这个过程作为角度,而同步异步是更高层次角度,把通信双方作为整体来看待。

Netty

  • netty的使用的是reactor线程模型,而IO模型则是使用的多路复用IO模型,reactor线程模型与多路复用IO模型有些共同的地方,他们都有一个select,通过select来获取通道状态进行后续操作,在netty中,专门有一个线程监听请求连接,监听到之后,会将请求通过select下发给后续的线程池进行处理,而线程池中的线程则是则对应一个channel,每个channel中有对应的pipeline,在pipelline中进行具体数据处理,通过context进行数据传递。

  • tcp粘包拆包问题,其实根本原因是因为在tcp协议的通信中,每个packet的大小是固定的,而packet中的数据不一定完整,接收方接受到的packet,可能会因为过大进行拆分,或因为过小进行组合,从而出现粘包拆包问题,需要确定一个读取长度,让接收方知道数据读取的结束点,在netty中,可以基于长度,特定字符,换行符等作为区分。

Q.E.D.