[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 的特点?
-
一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持使用更高效的 socket 底层,对 epoll 空轮询引起的 cpu 占用飙升在内部进行了处理,避免 了直接使用 NIO 的陷阱,简化了 NIO 的处理方式。
-
采用多种 decoder/encoder 支持,对 TCP 粘包/分包进行自动化处理
-
可使用接受/处理线程池,提高连接效率,对重连、心跳检测的简单支持
-
可配置 IO 线程数、TCP 参数, TCP 接收和发送缓冲区使用直接内存代替堆内存,通过内存 池的方式循环利用 ByteBuf
-
通过引用计数器及时申请释放不再引用的对象,降低了 GC 频率
-
使用单线程串行化的方式,高效的 Reactor 线程模型
-
大量使用了 volitale、使用了 CAS 和原子类、线程安全类的使用、读写锁的使用
「真诚赞赏,手留余香」