ES -> Netty -> NIO

NIO
NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。

IO NIO
面向流 面向缓冲区
阻塞IO 非阻塞IO
无选择器 选择器
  1. 面向流与面向缓冲区
    Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

  2. 阻塞与非阻塞IO
    通常来说,IO操作包括:对硬盘的读写、对socket的读写以及外设的读写。
    当用户线程发起一个IO请求操作(本文以读请求操作为例),内核会去查看要读取的数据是否就绪,对于阻塞IO来说,如果数据没有就绪,则会一直在那等待,直到数据就绪;对于非阻塞IO来说,如果数据没有就绪,则会返回一个标志信息告知用户线程当前要读的数据没有就绪。当数据就绪之后,便将数据拷贝到用户线程,这样才完成了一个完整的IO读请求操作,也就是说一个完整的IO读请求操作包括两个阶段
    1)查看数据是否就绪;
    2)进行数据拷贝(内核将数据拷贝到用户线程)。
    那么阻塞(blocking IO)和非阻塞(non-blocking IO)的区别就在于第一个阶段,如果数据没有就绪,在查看数据是否就绪的过程中是一直等待,还是直接返回一个标志信息
    Java中传统的IO都是阻塞IO,比如通过socket来读数据,调用read()方法之后,如果数据没有就绪,当前线程就会一直阻塞在read方法调用那里,该线程在此期间不能再干任何事情了,直到有数据才返回;而如果是非阻塞IO的话,当数据没有就绪,read()方法应该返回一个标志信息,告知当前线程数据没有就绪,该线程可以继续做其他的事情,而不是一直在那里等待。非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
    同步IO和异步IO模型是针对用户线程和内核的交互来说的:
    对于同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;
    而异步IO:只有IO请求操作的发出是由用户线程来进行的,IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。
    这是同步IO和异步IO关键区别所在,同步IO和异步IO的关键区别反映在于第二个阶段,即数据拷贝阶段是由用户线程完成还是内核完成。所以说异步IO必须要有操作系统的底层支持。

  3. 选择器(Selectors)
    Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

References
http://www.cnblogs.com/dolphin0520/p/3916526.html
https://www.cnblogs.com/xiaoxi/p/6576588.html

为什么选择Netty作为基础通信框架?
https://blog.csdn.net/broadview2006/article/details/46041995
https://blog.csdn.net/zl1zl2zl3/article/details/52891870
https://blog.csdn.net/opengl_es/article/details/40979371?utm_source=tuicool&utm_medium=referral

Spark也选择Netty!!!
https://blog.csdn.net/psiitoy/article/details/77530886

一篇文章读懂Netty的高性能架构之道
https://www.cnblogs.com/Irving/p/5709130.html

猜你喜欢

转载自blog.csdn.net/weixin_42257250/article/details/82970402