开篇:Netty源码学习总结系列——线程调度模型全面总结
前言和目标
首先,好久之前写了:Netty 学习笔记(1)Netty 通信原理,可惜很久没更新了,不少博客园的网友经常问,到底还写不写,后来连问都不问了,深表惭愧,从今天开始,重新开启这个系列文章——Netty源码学习笔记。
其次,立意不同于一些零散的个人博客文章,打算从头到尾,形成一个系列,也不想流于表面,只是复制黏贴注释甚至源码。。。也不想糊弄大家,糊弄自己,随便看看怎么写的就简单完事。。。希望能兼顾底层原理和一些外围的相关技术总结和深入“科普”,且最好是能说明人家为什么要这样设计!
需要强调:并且本系列文章是综合了大量输入,从最开始的项目中的使用,到比如前期的各种市面上的Netty书籍,博客,一些大佬的源码视频教程等,我分别吸收并梳理了一些我认为说的不明白,或者说的不清楚,不深入,甚至是错误的地方,并且更多的找出为什么这样设计的点。
在最后的结束部分,打算以Netty+zookeeper实现一个简单的RPC框架,来巩固Netty的各种使用和最佳实践。
最后,期待这个系列,能全面总结和分析Netty,让大家少走弯路。
文章集合
开篇:Netty源码学习系列
主要介绍了使用Netty的场景和如何深入掌握它的一些经验。并且给出了下载,编译源码的方法。
最后简单介绍了Netty的基本组件。
Netty 学习笔记(1)Netty 通信原理
之前博客园里写过,主要是总结了一些操作系统层面的I/O系统调用,I/O多路复用机制和epoll机制的概念。
Netty服务端与客户端初始化流程(1)
从一个Netty服务端的demo入手,分析了Netty设计实现的线程池角色,以及一些常用API的用法,并从宏观上,解读了Netty的消息收发流程。
Netty服务端与客户端初始化流程(2)
从源码角度,分析了Netty封装的Channel以及重点Channel——Socket Channel的初始化的过程。并且回答了几个常见问题:
1、为何Netty创建服务端(客户端也一样)的channel用的是反射机制?
2、NettyI/O模型实例化的时候,都做了什么?
3、Netty的pipeline是何时创建的,都做了哪些事情?
Netty服务端与客户端初始化流程(3)
更加细致的从源码角度,分析了Netty为何给Channel在AbstractChannel设置id,unsafe,pipeline?
Netty服务端的Socket在哪里初始化?
好的编程习惯学习
服务端Channel创建的设计总结
Netty服务端NIO channel初始化过程分析
理解Netty服务端的bossGroup与workerGroup的理解,比如服务器端初始化设置了两个EventLoopGroup,一个bossGroup,另一个是workerGroup.这两个EventLoopGroup是干什么用的?
Netty服务端与客户端初始化流程(4)
主要分析总结如下:
1、Netty的bossGroup和NioServerSocketChannel是如何关联的?
-
I/O多路复用器——Selector介绍
-
Netty如何封装的Selector?
2、服务器绑定端口并设置监听事件的过程分析
-
Netty服务端在哪里accept新连接?
Netty的线程调度模型分析(1)
从这一篇开始,分析总结Netty的线程模型:
1、NioEventLoop和NioEventLoopGroup是什么关系?
2、Reactor模型介绍
3、Netty实现的是哪种Reactor线程模型?
4、Netty如何消除客户端连接上的线程同步问题?
Netty的线程调度模型分析(2)
从Netty的线程池实现入手:
1、深入理解Netty线程池
创建流程分析
默认情况创建一个Netty线程池会启动多少线程?
2、线程执行器详解
学习Netty如何安全高效的自定义有意义的线程(池)名?
NioEventLoop线程的命名规则
Netty的线程调度模型分析(3)
重点分析了Netty的线程池线程选择器,并且附带复习总结了volatile关键字意义以及正确使用的方式,接着对Netty线程池实例化NioEventLoop的过程进行了详解,并且点出了Netty的一个优化技巧:求模运算和按位与运算互转
Netty的线程调度模型分析(4)
还是从Netty的线程池入手,分析了NioEventLoop线程的启动过程:
1、NioEventLoop线程启动的时机分别是在哪里?
2、Netty如何判断外部线程和NioEventLoop线程,为什么要这样设计?
3、一个NioEventLoop线程对应多个channel,Netty怎么保证A channel的数据和B channel的数据多线程执行不出错呢?
4、为什么要把NioEventLoop和线程进行绑定呢,而且是设计成NioEventLoop的一个属性?
5、NioEventLoop线程为什么不在创建的时候直接启动?
6、NioEventLoop的线程启动为什么要用CAS?
7、默认情况Netty服务端(客户端)会创建多少线程,又是在何时启动的?
Netty的线程调度模型分析(5)
介绍完了Netty的线程池和NIO线程,开始分析Netty的线程模型核心——事件循环机制:
1、初识NioEventLoop线程的事件循环机制
2、Netty是如何分配I/O处理和异步任务处理的执行时间的?
3、Netty的事件轮询都做了哪些事情?
Netty的线程调度模型分析-番外篇(1)
写到这里,觉得有一些前置的基础需要巩固,复习总结下,所以番外篇都是和Netty不相干的内容,却又息息相关。
前置基础总结
1、CPU上下文,以及上下文切换过程,和为什么切换会耗时的总结
2、回忆进程,线程的引入,以及它们切换的本质,和Linux源码里的CPU(进程)调度算法
3、区分同步、异步、阻塞与非阻塞的概念,到底该如何阐述?
4、Java线程和操作系统进程的状态对应
5、Netty的定时任务调度概述
Netty的线程调度模型分析-番外篇(2)
接上一篇文章,总结了一些进程,线程,并发,性能以及和Java,Netty的种种联系:
1、线程的底层切换过程
2、同步,异步,阻塞,非阻塞到底该怎么阐述?
3、Java线程状态和操作系统进程(线程)状态对应关系
Netty的线程调度模型分析-番外篇(3)
这一篇,总结复习了操作系统都有什么I/O模型?
到底什么是I/O多路复用?
了解Linux网络编程中的系统调用函数
Netty的线程调度模型分析-番外篇(4)
这一篇,算是比较深入的分析了NIO的Selector——I/O多路复用器,即深入理解NIO的Selector,以及epoll机制和常规API的用法:
1、先从select、poll系统调用说起
2、谈谈你对epoll机制的理解,以及Java NIO使用的是什么触发模式?
3、谈谈你对NIO的Selector的理解
4、Selector如何检测Channel,如何被正确的唤醒,以及有什么注意事项?
Netty的线程调度模型分析(6)
从这篇开始,回到了对Netty源码的分析,从NIO线程的事件循环机制开始:
1、使用NIO的一些注意事项
2、Netty是如何使用的NIO的Selector,包括如何正确唤醒的?换个问题即:Netty检测Channel的策略都有哪些?
3、Netty如何解决了臭名昭著的“epoll”空轮询bug,以及该问题的争议和来龙去脉?
Netty的线程调度模型分析(7)
分析完了NIO线程的事件循环机制的第一部分——对Channel的检测策略,本篇就开始分析Netty处理I/O事件的过程:
1、hash表和扩容分析
2、Netty如何优化的JDK的Selector
3、学习对数组拷贝的正确用法
4、学习安全管理器的正确用法
5、清空数组的陷阱
6、NioEventLoop线程是如何处理I/O事件的?
Netty的线程调度模型分析(8)
主要是继续上一篇的内容,在7中没说完:
5、清空数组的陷阱
6、NioEventLoop线程是如何处理I/O事件的?主要是源码分析:
一些NIO的坑,Netty如何解决的
填充数组的快速方法
Netty的线程调度模型分析(9)
主要分析了Netty线程调度模型的第三件事——Netty对异步任务的处理过程和实现机制:
NioEventLoop线程是如何处理异步任务的?
掌握JDK的阻塞队列用法
Netty异步任务分类都有什么?
异步任务的添加过程和执行时机与策略
定时任务的添加过程和执行时机与策略
定时任务的分类
掌握JDK的优先级队列用法
Netty的线程调度模型分析(10)
Netty的线程模型总结暨常见面试题分解
1、学习Netty多线程数据处理和定时任务聚合的处理逻辑
2、多线程环境下,实例变量转为局部变量的程序设计技巧
3、Netty里有几类线程池,有什么区别,和JDK线程池又有什么区别?
4、Netty的任务有几类,为何要把定时任务聚合到普通任务队列里执行?
5、为什么Netty一定坚持用一个NioEventLoop线程串行执行注册在其上的task和channel里的I/O事件,并行不是更好么?
6、什么是CPU(线程)上下文切换?
7、为什么有人说CPU(线程,进程)上下文切换会影响系统性能?
8、Netty执行异步任务队列总结
9、NioEventLoop线程模型总结
10、Netty如何保证异步串行无锁化?
11、默认情况下Netty线程池起多少线程,何时启动?
12、Netty到底实现的哪种reactor模型?
13、Runtime.getRuntime().availableProcessors()的真正含义?
14、Netty的boss线程池和worker线程池能不能合在一起?
15、Netty是如何解决epoll空轮询bug的?
16、Netty多线程开发的最佳实践有哪些?
欢迎关注
dashuai的博客是终身学习践行者,大厂程序员,且专注于工作经验、学习笔记的分享和日常吐槽,包括但不限于互联网行业,附带分享一些PDF电子书,资料,帮忙内推,欢迎拍砖!