吃透Netty源码系列五十六之NioEventLoopGroup创建细节二

吃透Netty源码系列五十六之NioEventLoopGroup创建细节二

  • NioEventLoop
    • openSelector
      • SelectorTuple
      • SelectedSelectionKeySet
      • SelectedSelectionKeySetSelector
  • ServerBootstrap创建
  • NioServerSocketChannel创建
    • 获取原生ServerSocketChannelImpl对象
    • 传入监听事件OP_ACCEPT
    • 在原生的通道上设置监听事件OP_ACCEPT
    • 创建配置NioServerSocketChannelConfig
      • DefaultChannelConfig属性初始化ByteBufAllocator
      • ByteBufUtil的初始化
      • 与写相关的属性

NioEventLoop

我们继续NioEventLoop的构造函数,这里就是对原生的selectedKeys做了优化。
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第1张图片

openSelector

先获取原生的Selector
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第2张图片
如果禁止优化就直接包装原生的返回:
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第3张图片

SelectorTuple

这个元组里面就是一个是原生的,一个是包装后的。
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第4张图片
反射出sun.nio.ch.SelectorImpl
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第5张图片
创建优化的SelectedSelectionKeySet
在这里插入图片描述

SelectedSelectionKeySet

里面就是用数组来存SelectionKey,不够就扩容:
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第6张图片
直接内存操作,将原生的SelectorselectedKeyspublicSelectedKeys替换成selectedKeySet
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第7张图片
看原生的这两个属性已经改了:
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第8张图片
最后将原生的Selector封装成SelectedSelectionKeySetSelector,然后包装到元组返回:
在这里插入图片描述

SelectedSelectionKeySetSelector

其实就是代理了原生的Selector
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第9张图片
一个是原生的一个是封装后的:
在这里插入图片描述
这个SelectedSelectionKeySet是共享的:
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第10张图片
NioEventLoopGroup基本就这些了,其他的我在另外文章讲过就不多说了,我们来看看ServerBootstrap吧。

ServerBootstrap创建

选项和属性是两个并发安全的hashmap,然后创建一个ServerBootstrapConfig配置。
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第11张图片

NioServerSocketChannel创建

获取原生ServerSocketChannelImpl对象

ServerBootstrapbind里,会用反射创建NioServerSocketChannel
在这里插入图片描述
默认的选择器提供器:
在这里插入图片描述
就是获取一个NIO原生的ServerSocketChannel的实现类sun.nio.ch.ServerSocketChannelImpl对象,毕竟netty只是做了封装,底层的操作还是原生的来做。
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第12张图片
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第13张图片

传入监听事件OP_ACCEPT

这里NioServerSocketChannel默认监听的事件就是OP_ACCEPT
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第14张图片

在原生的通道上设置监听事件OP_ACCEPT

就是在原生的上面设置:
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第15张图片

创建配置NioServerSocketChannelConfig

吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第16张图片
先获取javaChannel
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第17张图片
就是我们刚才获取的原生通道:
在这里插入图片描述
然后到这里:
在这里插入图片描述

DefaultChannelConfig属性初始化ByteBufAllocator

这里就是字节分配器创建的地方,我们来看看他会是什么。
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第18张图片
然后是这里。
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第19张图片

ByteBufUtil的初始化

分配器是这个:
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第20张图片
不是安卓的就是用池化的分配器:
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第21张图片
在这里插入图片描述
所以我们知道我们用的是池化的分配器。

会到这里,会创建一个AdaptiveRecvByteBufAllocator,可调节的接收缓冲区,后面会详细讲。
在这里插入图片描述

与写相关的属性

这里自旋发送的次数,就是最多发送16次,将缓冲区的数据发出去,然后自动读就是每当读事件处理完了,还会继续监听读事件,还有写水位设置,就是写缓冲区超过64K的时候就不可写了,要小于32K才可写,会触发通道的写能力改变事件channelWritabilityChanged
吃透Netty源码系列五十六之NioEventLoopGroup创建细节二_第22张图片
写的可能比较碎,因为有些东西已经讲过,重复讲没必要,讲一些前面没关注的东西。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

你可能感兴趣的:(吃透Netty源码系列,吃透Netty源码系列,Netty源码解析,Netty,NioEventLoop,事件循环)