对NIO和netty的理解和使用

对NIO的理解和使用

1、BIO 是一种阻塞IO,监听阻塞(active),read阻塞。程序不往下执行 可进行多线程解决,但问题会出现空转,性能消耗问题

2、NIO 非阻塞IO,这个java中的实现和redis中的底层实现基本一致,liunx上主要采用了epoll模型,调用了 create ctl wait 系统指令 注册表到执行表中借助于liunx操作系统中中断程序完成

selector 字面意思之所以与select类似,因为早期版本1.4之前,java中NIO底层native调用的C代码中调用的liunx系统指令是select,后来改用了poll模型,到现在的epoll模型 select指令采用数组遍历,存在上线。后改进使用poll这种链表遍历,不存在上线。遍历比较耗性能,后改用epoll模型,存储采用hash表,操作上用了回调函数,事件响应式,一旦有数据或是链接就会触发回调函数

3、netty对传统的NIO实现进行了优化 采用多个reactor响应模型,这里的reactor是被包装了的selector,底层当前依然使用epoll模型实现。可以分为boss节点和worker节点,这两个阶段是两个线程池,每个线程实现一个selector 一般boss节点取得链接,work节点进行消息的读取,编码,执行,反编码和输出操作,在netty中worker节点时多线程的执行存在。

4、netty接收和发送数据,采用了零拷贝机制,源码中的byteBuf中内容存在直接内存中,直接内存,就是从网卡socket缓存队列,复制到内核态的物理内存,我们的用户内存,jvm的堆中存着对直接内存的引用,jvm的栈的栈针中存着对应的变量 也就是说,栈帧中存着变量的引用,引用了堆里的对直接内存中消息内容的引用,堆里的引用引用了内核态中的物理消息内存

5、netty的应用,在dubbo中默认的dubbo协议,就是采用netty实现通信,简单的聊天类窗口可以使用netty实现

经验分享 程序员 微信小程序 职场和发展