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

  • 相关阅读:
    flash 自定义右键功能
    本地和VMware虚拟主机之间的网络访问
    java: org.luaj.vm2.LuaError:XXX module not found lua脚本初始化出错
    火狐 提示“此连接是不受信任的” 可能是因为开启了其它抓包代理软件导致的
    批量导入数据库
    引用Interop.SQLDMO.dll后的注意事项。
    c# Invoke和BeginInvoke 区别
    闭包的7种形式
    C#使用ICSharpCode.SharpZipLib压缩后进行web批量下载文件
    C# Socket编程笔记
  • 原文地址:https://www.cnblogs.com/kubixuesheng/p/12391117.html
Copyright © 2020-2023  润新知