同步 :相对IO而言,在同一时间,只能完成一个操作
异步:相对IO而言,在同一时间,同时完成多个操作
阻塞:相对数据而言,判断数据有没有准备好,如果没有准备好,停住不前,一直等待
非阻塞:相对数据而言,不管数据有没有准备好,都会给一个反馈,不至于客户端一直占用资源
万事万物相对论
解决cup空旋,NIOEventLoop run方法中判断是否有任务,然后执行select 方法,selectCnt超过阈值重新创建selector
组件介绍
channel
channelconfig
NioEventloop
bytebuf
Pipline
channelhandler
创建服务端Channel
bootstarp.channel()方法设置channelFactory,反射生成NioServerSocketChannel
newSocket()[通过底层jdk生成socket]
NioServerSocketChannelConfig()[tcp参数配置类]
AbstractNioChannel
configureBlocking(false)阻塞模式
AbstractChannel()[创建channelid,unsafe,pipline]
初始化服务端Channel
注册selector
serverBootstrap.bind()->AbstractBootStrap.doBind()->initAndRegister()->newChannel()
NioEventLoop
默认情况下,Netty服务端起多少线程?何时启动?
Netty是如何解决jdk空轮训bug?
Netty如何保证异步串行无锁化?
ThreadPerTaskExecutor
select()
- deadline以及任务穿插逻辑处理
- 阻塞式select
- 解决空轮询bug
processSelectedKeys()
- selectdKeySet优化
- processSelectedKeysOptimized()处理IO事件
runAllTasks()
Pipeline
netty是如何判断ChannelHandler类型的?
对于ChannelHandler的添加应该遵循什么样的顺序?
用户手动出发事件传播,不同的触发方式有什么样的区别?
netty是在那里检测有新连接接入的?
新连接是怎么注册到NioEventLoop线程的?
ByteBuf分类
- pool 和unpool
- unsafe和非unsafe
- Heap和Direct
DirectArena分配内存
- 从对象池里面里面拿到PooledByteBuf进行复用
- 从缓存上进行内存分配
- 从内存堆里面进行内存分配