netty 相关面试题(一)

线程模型

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 和原子类、线程安全类的使用、读写锁的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值