面试题系列-Netty

Posted by 麦子 on Thursday, 2020年06月04日

[TOC]

说明:以下文字来源网络各相关面试题目收集

BIO、NIO 和 AIO 的区别?

BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线 程开销大。伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。

NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用 器轮询到连接有 I/O 请求时才启动一个线程进行处理。

AIO:一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用去 启动线程进行处理,

BIO 是面向流的,NIO 是面向缓冲区的;BIO 的各种流是阻塞的。而 NIO 是非阻塞的;BIO 的 Stream 是单向的,而 NIO 的 channel 是双向的。

NIO 的特点:事件驱动模型、单线程处理多任务、非阻塞 I/O,I/O 读写不再阻塞,而是返 回 0、基于 block 的传输比基于流的传输更高效、更高级的 IO 函数 zero-copy、IO 多路复用 大大提高了 Java 网络应用的可伸缩性和实用性。基于 Reactor 线程模型。

在 Reactor 模式中,事件分发器等待某个事件或者可应用或个操作的状态发生,事件分发 器就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操 作。如在 Reactor 中实现读:注册读就绪事件和相应的事件处理器、事件分发器等待事 件、事件到来,激活分发器,分发器调用事件对应的处理器、事件处理器完成实际的读操 作,处理读到的数据,注册新的事件,然后返还控制权。

注:查看另一篇博客《浅析I/O模型》

Netty 的特点?

  1. 一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持使用更高效的 socket 底层,对 epoll 空轮询引起的 cpu 占用飙升在内部进行了处理,避免 了直接使用 NIO 的陷阱,简化了 NIO 的处理方式。

  2. 采用多种 decoder/encoder 支持,对 TCP 粘包/分包进行自动化处理

  3. 可使用接受/处理线程池,提高连接效率,对重连、心跳检测的简单支持

  4. 可配置 IO 线程数、TCP 参数, TCP 接收和发送缓冲区使用直接内存代替堆内存,通过内存 池的方式循环利用 ByteBuf

  5. 通过引用计数器及时申请释放不再引用的对象,降低了 GC 频率

  6. 使用单线程串行化的方式,高效的 Reactor 线程模型

  7. 大量使用了 volitale、使用了 CAS 和原子类、线程安全类的使用、读写锁的使用

「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付