Code前端首页关于Code前端联系我们

Java研发面试题集:Netty有什么特点?线框?

terry 2年前 (2023-09-25) 阅读数 49 #后端开发

作者:孤独的赫尔墨斯Java研发面试题集:Netty 的特点?线程模型?

2。 Netty

1。 Netty有什么特点?

一个强大的、异步的、事件驱动的NIO框架,支持TCP、UDP和文件传输。使用更高效的套接字底层,在内部处理避免 epoll 空轮询导致的 CPU 使用率峰值。它消除了直接使用NIO的陷阱,并简化了NIO处理。

利用多解码器/编码器支持,可以利用接受/处理线程池自动处理TCP数据包粘连/分包,提高连接效率。简单支持重连和心跳检测可以配置IO线程数和TCP参数。 ,TCP接收和发送缓冲区使用直接内存而不是堆内存,通过内存池回收ByteBuf,通过引用计数器请求及时释放不再引用的对象,降低GC频率,使用单线程序列化,高效的Reactor。线程模型大量使用volital,使用CAS和原子类,使用线程安全类,使用读写锁

2。 Netty的线材型号?

Netty 通过 Reactor 模型基于多路复用器接收并处理用户请求。它内部实现了两个线程池:boss线程池和worker线程池。 boss线程池中的线程负责处理请求的accept事件。接收时收到accept事件的请求后,关联的socket被封装在NioSocketChannel中并移交给工作线程池。工作线程池负责请求的读写事件,由相应的处理程序处理。

  • 单线程模型:所有I/O操作均由单个线程完成,即复用、分发、事件处理均在单个Reactor线程上完成。它不仅要接收客户端的连接请求,发起到服务器的连接,还要发送/读取请求或回复/回复消息。一个 NIO 线程同时处理数百或数千个链接。性能无法支撑,速度慢。如果线程进入死循环,整个程序就会变得不可用,不适合高负载、高并发的应用场景。
  • 多线程模型:有一个NIO(Acceptor)线程,只负责监听服务器端,接收客户端的TCP连接请求; NIO线程池负责网络IO操作,即读取、解密、加密和发送消息。 ; 1个NIO线程可以同时处理N个链接,但1个链接只对应1个NIO线程。这是为了避免同时操作问题。然而,当有数百万个并发客户端连接或需要安全认证时,Acceptor线程可能会表现不佳。
  • 主从多线程模型:Acceptor线程用于绑定监听端口,接收客户端连接,从主线程池中Reactor线程的多路复用器中移除SocketChannel并重新注册到subthread 在池线程上,用于处理I/O读写,保证mainReactor只负责访问认证、握手等操作;

3。 BIO、NIO 和 AIO 有什么区别?

  • BIO:一个连接,一个线程。当客户端有连接请求时,服务器必须启动一个线程进行处理。电线开销很高。
  • 伪异步IO:将请求连接放在线程池中,一对多,但是线程仍然是非常宝贵的资源。
  • NIO:一个请求一个线程,但是客户端发出的连接请求被记录在多路复用器上。多路复用器仅在请求 I/O 请求连接时启动线程。处理它。
  • AIO:有效的请求是一个线程。客户端I/O请求首先由操作系统完成,然后通知服务器应用程序启动线程进行处理。 BIO是面向流的,NIO是面向缓冲区的; BIO的各种流都被阻塞了。 NIO是非阻塞的; BIO的流是单向的,而NIO的通道是双向的。
  • NIO的特点:事件驱动模型、单线程多任务、非阻塞I/O、I/O读写不再阻塞而是返回0、基于块的传输效率更高基于流的传输高效且更先进的IO特性零拷贝和IO复用显着提高了Java网络应用的可扩展性和可用性。基于Reactor线程模型。

在反应堆模式下,事件调度程序等待要应用的事件或状态或操作。事件派发器将事件传递给预先注册的事件处理函数或回调函数,由后者执行实际的处理。读和写操作。例如,读在Reactor中实现:注册读就绪事件及其关联的事件处理器,事件派发器等待事件,事件到达,激活协调器,协调器调用事件对应的处理器,事件处理器完成实际的读操作并处理。读取数据,记录新事件,然后返回控制权。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门