NioEventLoop:1 select,2 处理select所得,3 处理任务(普通和定时,按ioRatio确定时间)
read,accept和connect,write全部在这里处理,不像mina按Processor,Connector,Acceptor区分。
accept处理:和read处理完全一致,Unsafe.read()
NioByteUnsafe(NioSocketChannel): read, 读数据,fireChannelRead
NioMessageUnsafe(NioServerSocketChannel),accept,读(其实accept到SocketChannel),fireChannelRead,到ServerBootstrapAcceptor处将accet所得Channel注册到EventLoop
粘包、拆包:存在Nagle和Mss,考虑ByteToMessageDecoder,根据长度字段,固定长度,分隔符等拆分或拼装为应用层报文。
服务端:生成NioServerSocketChannel, 设置options和attrs,ServerBootstrapAcceptor等,注册到EventLoop,不关注任何事件,NioServerSocketChannel绑定某个地址,关注accept事件
客户端:connect和读写都在一个EventLoopGroup,不分开。
PooledByteBufAllocator:分配direct和heap的ByteBuf
PoolArena:含Init(0-25),00(1-50),25(25-75),50(50-100),75(75-100),100(100)这6个PoolChunkList
初始在Init内,超过25进入00ChunkList,后面5个可来回移动,Init支持到0,即完全释放也不会回收,00回不到Init了,若在00内完全释放,则内存回收
PoolChunkList:含内存使用率上下限,ChunkList之间双向链接,持有头Chunk,相邻ChunkList的内存使用率重合,避免Chunk频繁来回移动
PoolChunk:Chunk之间双向链接,11层,2048个叶子节点,每个节点有个计数,如8层节点计数为8,则此节点可分配,为9则其有单个子节点被分配了,为12则已经完全被分配了
PoolSubPage:8k,bitmap(8个long,512位),最小可按16字节分配,在init时根据分配的大小来确定bitmap的使用长度,