image-20190330112343817

同步 :相对IO而言,在同一时间,只能完成一个操作

异步:相对IO而言,在同一时间,同时完成多个操作

阻塞:相对数据而言,判断数据有没有准备好,如果没有准备好,停住不前,一直等待

非阻塞:相对数据而言,不管数据有没有准备好,都会给一个反馈,不至于客户端一直占用资源

万事万物相对论

image-20190330191756240

image-20190330195610172

解决cup空旋,NIOEventLoop run方法中判断是否有任务,然后执行select 方法,selectCnt超过阈值重新创建selector

组件介绍

channel

channelconfig

NioEventloop

bytebuf

Pipline

channelhandler

  1. 创建服务端Channel

    bootstarp.channel()方法设置channelFactory,反射生成NioServerSocketChannel

    newSocket()[通过底层jdk生成socket]

    NioServerSocketChannelConfig()[tcp参数配置类]

    AbstractNioChannel

    ​ configureBlocking(false)阻塞模式

    ​ AbstractChannel()[创建channelid,unsafe,pipline]

  2. 初始化服务端Channel

  3. 注册selector

serverBootstrap.bind()->AbstractBootStrap.doBind()->initAndRegister()->newChannel()

NioEventLoop

默认情况下,Netty服务端起多少线程?何时启动?

Netty是如何解决jdk空轮训bug?

Netty如何保证异步串行无锁化?

ThreadPerTaskExecutor

select()

  1. deadline以及任务穿插逻辑处理
  2. 阻塞式select
  3. 解决空轮询bug

processSelectedKeys()

  1. selectdKeySet优化
  2. processSelectedKeysOptimized()处理IO事件

runAllTasks()

Pipeline

netty是如何判断ChannelHandler类型的?

对于ChannelHandler的添加应该遵循什么样的顺序?

用户手动出发事件传播,不同的触发方式有什么样的区别?

netty是在那里检测有新连接接入的?

新连接是怎么注册到NioEventLoop线程的?

ByteBuf分类

  • pool 和unpool
  • unsafe和非unsafe
  • Heap和Direct

DirectArena分配内存

  • 从对象池里面里面拿到PooledByteBuf进行复用
  • 从缓存上进行内存分配
  • 从内存堆里面进行内存分配

image-20190413162318653