開篇: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電子書,資料,幫忙內推,歡迎拍磚!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM