线程模型
BIO 同步阻塞
AIO 异步阻塞IO
NIO Non-Block IO 同步非阻塞
BIO、AIO、NIO之间的区别
BIO 同步阻塞,每当有一个客户端发起请求的时候就需要启动一个线程进行处理,线程开销大;BIO面向流,且Stream是单向的;
AIO 异步阻塞,内核将读完成事件通知应用,读操作由内核完成,应用只需操作数据即可;应用做异步写操作时立即返回,内核会进行写操作排队并执行写操作;
NIO 同步非阻塞,客户端的请求会被注册到多路复用器上;相当于对于多个请求有一个统一的接收方,但是接收方在接收到请求后直接将请求丢到下一级;NIO是面向缓冲区的,通过channel收发消息;
NIO的组成
Buffer : 在此与channel进行交互,可以针对Buffer自定义编解码器,或者调用框架中的编解码器;
flip:反转此缓冲区,将 position 给 limit,然后将 position 置为 0,其实就是切换读写模式;
clear:清除此缓冲区,将 position 置为 0,把 capacity 的值给 limit;
rewind:重绕此缓冲区,将 position 置为 0;
channel:与客户端建立的连接,双向通道,但是只能通过Buffer访问数据,不能直接对数据进行操作。通过对channel中的事件进行分析,作出相应处理
seletor:使一个单独的线程管理多个 Channel,open 方法可创建 Selector,register 方法向多路复用器器注册通道,可以监听的事件类型:读、写、连接、accept。
pipe:两个线程之间的单向数据连接,数据会被写到 sink 通道,从 source 通道读取。上面针对Buffer的编解码器,在此添加到通道中使用;另外可以定义请求头等相关参数。
NIO 服务端的创建
Netty的特点
1、一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持。简化了传统的编解码操作;同时支持多种协议格式;
2、使用更高效的 socket 底层,对 epoll 空轮询引起的 cpu 占用飙升在内部进行了处理,避免了直接使用 NIO 的陷阱,简化了 NIO 的处理方式。
3、采用多种 decoder/encoder 支持,并可以自定编解码,对 TCP 粘包/分包进行自动化处理
4、可使用接受/处理线程池,提高连接效率,对重连、心跳检测的简单支持
5、可配置 IO 线程数、TCP 参数, TCP 接收和发送缓冲区使用直接内存代替堆内存,通过内存池的方式循环利用 ByteBuf,通过引用计数器及时申请释放不再引用的对象,降低了 GC 频率、使用单线程串行化的方式,高效的 Reactor 线程模型
6、大量使用了 volitale、使用了 CAS 和原子类、线程安全类的使用、读写锁的使用