开篇:Netty源码学习总结系列——线程调度模型全面总结

前言和目标

首先,好久之前写了:Netty 学习笔记(1)Netty 通信原理,可惜很久没更新了,不少博客园的网友经常问,到底还写不写,后来连问都不问了,深表惭愧,从今天开始,重新开启这个系列文章——Netty源码学习笔记。

其次,立意不同于一些零散的个人博客文章,打算从头到尾,形成一个系列,也不想流于表面,只是复制黏贴注释甚至源码。。。也不想糊弄大家,糊弄自己,随便看看怎么写的就简单完事。。。希望能兼顾底层原理和一些外围的相关技术总结和深入“科普”,且最好是能说明人家为什么要这样设计!

需要强调:并且本系列文章是综合了大量输入,从最开始的项目中的使用,到比如前期的各种市面上的Netty书籍,博客,一些大佬的源码视频教程等,我分别吸收并梳理了一些我认为说的不明白,或者说的不清楚,不深入,甚至是错误的地方,并且更多的找出为什么这样设计的点。

在最后的结束部分,打算以Netty+zookeeper实现一个简单的RPC框架,来巩固Netty的各种使用和最佳实践。

最后,期待这个系列,能全面总结和分析Netty,让大家少走弯路。

文章集合

开篇:Netty源码学习系列

开篇:Netty源码学习系列

主要介绍了使用Netty的场景和如何深入掌握它的一些经验。并且给出了下载,编译源码的方法。

最后简单介绍了Netty的基本组件。

Netty 学习笔记(1)Netty 通信原理

Netty 学习笔记(1)Netty 通信原理

之前博客园里写过,主要是总结了一些操作系统层面的I/O系统调用,I/O多路复用机制和epoll机制的概念。

Netty服务端与客户端初始化流程(1)

Netty服务端与客户端初始化流程(1)

从一个Netty服务端的demo入手,分析了Netty设计实现的线程池角色,以及一些常用API的用法,并从宏观上,解读了Netty的消息收发流程。

Netty服务端与客户端初始化流程(2)

Netty服务端与客户端初始化流程(2)

从源码角度,分析了Netty封装的Channel以及重点Channel——Socket Channel的初始化的过程。并且回答了几个常见问题:

1、为何Netty创建服务端(客户端也一样)的channel用的是反射机制?

2、NettyI/O模型实例化的时候,都做了什么?

3、Netty的pipeline是何时创建的,都做了哪些事情?

Netty服务端与客户端初始化流程(3)

Netty服务端与客户端初始化流程(3)

更加细致的从源码角度,分析了Netty为何给Channel在AbstractChannel设置id,unsafe,pipeline?

Netty服务端的Socket在哪里初始化?

好的编程习惯学习

服务端Channel创建的设计总结

Netty服务端NIO channel初始化过程分析

理解Netty服务端的bossGroup与workerGroup的理解,比如服务器端初始化设置了两个EventLoopGroup,一个bossGroup,另一个是workerGroup.这两个EventLoopGroup是干什么用的?

Netty服务端与客户端初始化流程(4)

Netty服务端与客户端初始化流程(4)

主要分析总结如下:

1、Netty的bossGroup和NioServerSocketChannel是如何关联的?

  • I/O多路复用器——Selector介绍

  • Netty如何封装的Selector?

2、服务器绑定端口并设置监听事件的过程分析

  • Netty服务端在哪里accept新连接?

 

Netty的线程调度模型分析(1)

Netty的线程调度模型分析(1)

从这一篇开始,分析总结Netty的线程模型:

1、NioEventLoop和NioEventLoopGroup是什么关系?

2、Reactor模型介绍

3、Netty实现的是哪种Reactor线程模型?

4、Netty如何消除客户端连接上的线程同步问题?

Netty的线程调度模型分析(2)

Netty的线程调度模型分析(2)

从Netty的线程池实现入手:

1、深入理解Netty线程池

创建流程分析

默认情况创建一个Netty线程池会启动多少线程?

2、线程执行器详解

学习Netty如何安全高效的自定义有意义的线程(池)名?

NioEventLoop线程的命名规则

Netty的线程调度模型分析(3)

Netty的线程调度模型分析(3)

重点分析了Netty的线程池线程选择器,并且附带复习总结了volatile关键字意义以及正确使用的方式,接着对Netty线程池实例化NioEventLoop的过程进行了详解,并且点出了Netty的一个优化技巧:求模运算和按位与运算互转

Netty的线程调度模型分析(4)

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的线程调度模型分析(5)

介绍完了Netty的线程池和NIO线程,开始分析Netty的线程模型核心——事件循环机制:

1、初识NioEventLoop线程的事件循环机制

2、Netty是如何分配I/O处理和异步任务处理的执行时间的?

3、Netty的事件轮询都做了哪些事情?

Netty的线程调度模型分析-番外篇(1)

Netty的线程调度模型分析-番外篇(1)

写到这里,觉得有一些前置的基础需要巩固,复习总结下,所以番外篇都是和Netty不相干的内容,却又息息相关。

前置基础总结

1、CPU上下文,以及上下文切换过程,和为什么切换会耗时的总结

2、回忆进程,线程的引入,以及它们切换的本质,和Linux源码里的CPU(进程)调度算法

3、区分同步、异步、阻塞与非阻塞的概念,到底该如何阐述?

4、Java线程和操作系统进程的状态对应

5、Netty的定时任务调度概述

Netty的线程调度模型分析-番外篇(2)

Netty的线程调度模型分析-番外篇(2)

接上一篇文章,总结了一些进程,线程,并发,性能以及和Java,Netty的种种联系:

1、线程的底层切换过程

2、同步,异步,阻塞,非阻塞到底该怎么阐述?

3、Java线程状态和操作系统进程(线程)状态对应关系

Netty的线程调度模型分析-番外篇(3)

Netty的线程调度模型分析-番外篇(3)

这一篇,总结复习了操作系统都有什么I/O模型?

到底什么是I/O多路复用?

了解Linux网络编程中的系统调用函数

 

Netty的线程调度模型分析-番外篇(4)

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的线程调度模型分析(6)

从这篇开始,回到了对Netty源码的分析,从NIO线程的事件循环机制开始:

1、使用NIO的一些注意事项

2、Netty是如何使用的NIO的Selector,包括如何正确唤醒的?换个问题即:Netty检测Channel的策略都有哪些?

3、Netty如何解决了臭名昭著的“epoll”空轮询bug,以及该问题的争议和来龙去脉?

 

Netty的线程调度模型分析(7)

Netty的线程调度模型分析(7)

分析完了NIO线程的事件循环机制的第一部分——对Channel的检测策略,本篇就开始分析Netty处理I/O事件的过程:

1、hash表和扩容分析

2、Netty如何优化的JDK的Selector

3、学习对数组拷贝的正确用法

4、学习安全管理器的正确用法

5、清空数组的陷阱

6、NioEventLoop线程是如何处理I/O事件的?

Netty的线程调度模型分析(8)

Netty的线程调度模型分析(8)

主要是继续上一篇的内容,在7中没说完:

5、清空数组的陷阱

6、NioEventLoop线程是如何处理I/O事件的?主要是源码分析:

一些NIO的坑,Netty如何解决的

填充数组的快速方法

  

Netty的线程调度模型分析(9)

Netty的线程调度模型分析(9)

主要分析了Netty线程调度模型的第三件事——Netty对异步任务的处理过程和实现机制:

NioEventLoop线程是如何处理异步任务的?

掌握JDK的阻塞队列用法

Netty异步任务分类都有什么?

异步任务的添加过程和执行时机与策略

定时任务的添加过程和执行时机与策略

定时任务的分类

掌握JDK的优先级队列用法

Netty的线程调度模型分析(10)

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电子书,资料,帮忙内推,欢迎拍砖!

原文地址:https://www.cnblogs.com/kubixuesheng/p/12391117.html