《計算之道卷 Ⅲ:C 語言與 JVM 源碼》是一本深入探討計算機科學與技術的圖書。本書旨在幫助讀者更深入地理解計算機內部的工作原理,并探索從高級編程語言到 JVM 源碼等核心概念。本書適合對計算機科學和底層技術感興趣的讀者,無論是學習計算機基礎知識還是進一步擴展技術視野,都能從本書中獲益良多。
在《計算之道卷Ш:C 語言與JM 源碼》中,作者以清晰易懂的語言詳細介紹了高級編程語言的工作原理。通過本書,讀者將了解編程語言的特性和原理、計算機網(wǎng)絡、JVM 等關鍵概念,從而更好地理解計算機執(zhí)行程序的方式。以及將學習JVM 源碼,并了解 hotspot、全局模塊等底層機制。結合實例和案例研究,讀者將能夠編寫高效、可靠的高性能應用程序。
無論是學生、工程師還是對計算機科學感興趣的讀者,本書都將成為你不可或缺的參考資源。
在編程語言與虛擬機技術深度交融的當下,本書以獨特的 推理式 視角,打通 C 語言特性與 JVM 底層實現(xiàn)的技術脈絡,為系統(tǒng)級開發(fā)者與語言愛好者構建從上層設計到源碼級實現(xiàn)的完整認知體系。書中從 C 語言的演進邏輯切入,拆解面向對象編程的核心原理(如類、多態(tài)、泛型),并通過與 C 語言、Java 的對比,揭示編程語言設計的共性與差異;繼而深入計算機網(wǎng)絡底層,結合 Linux 內核網(wǎng)絡包處理源碼,解析 TCP/UDP 協(xié)議棧、HTTP/HTTPS 通信機制,展現(xiàn)網(wǎng)絡技術從理論到工程實現(xiàn)的全鏈路。聚焦 JVM 技術棧,本書以 Hello World 程序為起點,逐層剖析字節(jié)碼結構、類加載機制及 Hotspot 虛擬機啟動原理,涵蓋 JVM 執(zhí)行引擎、垃圾回收(GC)等核心模塊,輔以《JVM 規(guī)范手冊》的實踐指引,幫助讀者掌握 Java 語言 一次編寫,到處運行 的底層奧秘。
無論是深耕 C 的系統(tǒng)工程師、探索 JVM 原理的 Java 開發(fā)者,還是致力于編程語言研究的學生,均可通過本書的 原理推導 源碼分析 雙維度講解,突破技術瓶頸,建立 語言設計 運行時環(huán)境 系統(tǒng)實現(xiàn) 的全局視野,在復雜技術棧中錨定底層邏輯,提升問題定位與架構設計能力。
1. 為什么要寫這本書
本書是《計算之道》叢書的第III 卷。前兩卷對計算機底層原理和計算機操作系統(tǒng)相關知識進行了深入探索,并結合混沌樹進行串聯(lián)。本書在前兩卷的基礎上進行擴展,使大家掌握的底層知識落地。同時,本書也是對混沌學堂課程內容的提煉和總結。
計算機網(wǎng)絡是互聯(lián)網(wǎng)和分布式系統(tǒng)的基石,了解網(wǎng)絡協(xié)議、通信模型和網(wǎng)絡編程是從事網(wǎng)絡開發(fā)和系統(tǒng)架構的關鍵要素。
C 語言是一種高性能的編程語言,廣泛應用于系統(tǒng)級開發(fā)、游戲開發(fā)和嵌入式系統(tǒng)等領域,掌握C 語言的語法和特性對于提升開發(fā)效率和代碼質量至關重要。
JVM 是Java 應用程序的核心,它負責解釋和執(zhí)行Java 字節(jié)碼,并提供垃圾回收、內存管理和線程調度等功能,深入了解JVM 的工作原理和調優(yōu)技巧有助于編寫高效的Java應用程序。
本書旨在對這三個主題進行綜合介紹,幫助讀者掌握扎實的基礎知識,并理解它們在實際應用中的作用。
其實在現(xiàn)實學習過程中,大家經(jīng)常學習計算機底層知識原理,但這種知識在工作中使用頻率不高,又經(jīng)常忘記。一邊學習,一邊遺忘,已經(jīng)成為學習計算機底層知識原理的常態(tài)。有沒有一種方法可以避免這種狀況發(fā)生?這就是黃俊老師的計算機混沌學習法嘗試用混沌知識樹,將計算機底層知識原理進行梳理,通過推理、推論的方式,提高大家對底層知識的理解,直到徹底掌握,不再遺忘。
本書適合以下讀者閱讀:希望學習計算機網(wǎng)絡、C 語言和JVM 基礎知識的讀者;需要深入了解網(wǎng)絡編程的讀者;在工作中遇到網(wǎng)絡、C 語言或JVM 相關問題,希望系統(tǒng)學習和解決的讀者;需要深入了解計算機底層知識的讀者。
2. 背景知識
本書假設讀者已具備一定的編程基礎和計算機科學知識。
最好是已經(jīng)閱讀過《計算之道》第I 卷、第II 卷的讀者,理解本書內容將更為輕松。
本書將詳細講解C 語言、計算機網(wǎng)絡和JVM 的基礎知識,并提供實例和案例來幫助讀者理解和應用所學知識。
3. 如何閱讀本書
本書按照C 語言、計算機網(wǎng)絡和JVM 的順序組織,每個主題包含多個章節(jié),依次遞進地介紹相關概念和技術。每個章節(jié)都以清晰的流程和總結開頭,幫助讀者理解和記憶所學內容。
讀者可以根據(jù)自己的需求和興趣選擇閱讀順序。如果已經(jīng)熟悉某個主題,可以跳過相應章節(jié),直接閱讀感興趣的內容。
第1 章 C 語言的推理
在這一章中,你將了解從機器語言到匯編語言,再到C 語言的語言演進過程,以及這些語言出現(xiàn)的原因和存在的缺點。也將了解C 語言的出現(xiàn)如何解決人們對計算機軟件的需求,面向對象和面向過程的思想差異。并將領略學習計算機底層知識的魅力和各個編程語言的共性。
第2 章 C 語言的特性和原理
在這一章中,介紹了C 語言特性的底層原理。同時總結了C 類語言存在的問題。你將了解如何設計一門新語言,知道Java 語言的出現(xiàn)是為了專注于業(yè)務需求的開發(fā),你還將了解如何通過底層原理來學習不同的編程語言。
第3 章 計算機網(wǎng)絡推理
在這一章中,介紹了計算機網(wǎng)絡下三層,同時讓讀者明確知道什么是計算機網(wǎng)絡協(xié)議,計算機網(wǎng)絡究竟研究什么。我們使用混沌學習推理方法,避免讀者陷入大量名詞堆砌的記憶。
第4 章 傳輸協(xié)議原理
在這一章中,你將了解TCP 是一個無比復雜的協(xié)議,需要解決網(wǎng)絡傳輸中的許多問題。這些問題不僅涉及技術層面,還需要避免漏洞,如果存在漏洞被黑客利用,將會帶來巨大損失。你還將了解TCP 中很多解決方案可以在不同業(yè)務場景中被借鑒。關于TCP 這個協(xié)議的細節(jié),推薦閱讀《TCP/IP 詳解 卷1:協(xié)議》。
第5 章 Linux 網(wǎng)絡包處理源碼分析
在這一章中,深入分析了Linux 網(wǎng)絡接受數(shù)據(jù)包的全過程。在Linux 操作系統(tǒng)中,最復雜的模塊就是網(wǎng)絡模塊。在這里,你將了解Linux 操作系統(tǒng)網(wǎng)絡收包細節(jié):涉及網(wǎng)卡驅動、網(wǎng)絡子系統(tǒng)、協(xié)議棧,以及內核ksoftirqd 線程等內核組件之間的交互。
第6 章 應用層協(xié)議原理
在這一章中,你將了解最常見卻又最容易忽視的HTTP 協(xié)議。從網(wǎng)絡支付出發(fā),了解HTTPS 如何保證交易安全。你還將了解直播所使用的核心技術。
第7 章 Java Hello World 底層推理
希望了解虛擬機,首先要了解真實的物理機。在這一章中,首先介紹了C 語言程序Hello World 在真實的物理機下是如何編譯的,編譯后的二進制格式ELF,以及Linux 是如何執(zhí)行ELF 的過程,作為相關知識背景。基于這些相關知識背景,我們推理出JVM 的設計目的。
第8 章 Hotspot JVM 啟動原理
在這一章里,你將了解Hotspot 的啟動過程,以JavaMain()函數(shù)為突破點,開啟JVM源碼的閱讀。你還將了解類加載器,從JVM 虛擬機的角度出發(fā),介紹三層類加載器和雙親委派模型,為深入理解JVM 原理打好基礎。結合構建混沌樹主干和枝葉的方法,將所學知識進行關聯(lián)。
4. 勘誤和支持
由于本書不可避免地存在一些疏漏或不夠準確之處,歡迎讀者批評指正。
黃俊
專注于研究Java語言
專注于研究Hotspot
專注于研究Linux內核
專注于研究C語言與匯編
專注于研究架構設計
專注于研究多線程并發(fā)處理
專注于研究高效學習方式
曾就職于美團、阿里
前新東方業(yè)務架構師
賴志環(huán)
十年游戲及互聯(lián)網(wǎng)應用的技術研發(fā)經(jīng)歷。負責過5000以上注冊用戶,日活躍用戶達800萬,10萬多用戶同時在線,年流水達1億的游戲產(chǎn)品研發(fā)。熟悉技術研發(fā)的多重領域。自2016年至今創(chuàng)辦深圳帝國互娛網(wǎng)絡在線有限公司,聯(lián)合創(chuàng)始人負責技術部。
第1 章 C 語言的推理 1
1.1 編程語言演變過程 1
1.2 C 語言出現(xiàn)的原因 3
1.2.1 C 語言圖書管理系統(tǒng) 4
1.2.2 C 語言的出現(xiàn)原因 5
1.2.3 C 語言圖書管理系統(tǒng) 7
1.3 面向過程和面向對象 8
1.4 C 語言特性來源 11
1.5 其他編程語言原理推導 12
1.6 編程語言的共性 13
1.7 小結 15
第2 章 C 語言的特性和原理 17
2.1 對象和類原理 17
2.1.1 C 語言的class 關鍵字 19
2.1.2 C 語言的new/delete運算符 19
2.1.3 C 語言的this 指針 22
2.2 異常處理 23
2.2.1 C 語言異常處理 23
2.2.2 Java 異常處理 24
2.3 C 語言的特性 26
2.3.1 C 語言的hello world 26
2.3.2 C 語言的數(shù)據(jù)類型 27
2.3.3 C 語言的指針和引用 28
2.3.4 C 語言的類與對象 29
2.3.5 C 語言的多態(tài) 31
2.3.6 C 語言的泛型編程 32
2.4 匯編、C 和C 語言存在的問題 35
2.4.1 匯編語言 35
2.4.2 C 語言 36
2.4.3 C 語言 37
2.4.4 最常見的問題 38
2.5 Java 語言出現(xiàn)的推論 40
2.5.1 內存泄漏和野指針規(guī)避 40
2.5.2 新語言的設計要求 42
2.5.3 新語言的兩種實現(xiàn)方法 43
2.6 如何通過底層來學習不同的編程語言 45
2.7 小結 48
第3 章 計算機網(wǎng)絡推理 50
3.1 計算機網(wǎng)絡的研究內容 50
3.2 計算機網(wǎng)絡協(xié)議 52
3.2.1 什么是協(xié)議 52
3.2.2 誰來制定協(xié)議 53
3.2.3 協(xié)議分層 54
3.3 計算機網(wǎng)絡地址 56
3.3.1 MAC 地址 56
3.3.2 IP 地址 58
3.3.3 ARP 59
3.4 數(shù)據(jù)傳輸 61
3.5 計算機網(wǎng)絡下三層 61
3.6 小結 62
第4 章 傳輸協(xié)議原理 64
4.1 UDP 65
4.1.1 四元組 65
4.1.2 UDP 的特點 66
4.1.3 UDP 的使用場景 66
4.2 TCP 68
4.2.1 TCP 包頭部分 68
4.2.2 建立TCP 鏈接 69
4.2.3 釋放TCP 連接 71
4.2.4 TCP 狀態(tài)機 73
4.3 TCP 可靠傳輸重傳機制 75
4.4 TCP 可靠傳輸滑動窗口 82
4.5 TCP 可靠傳輸流量控制 85
4.6 TCP 可靠傳輸擁塞控制 86
4.6.1 TCP 的擁塞控制原理 87
4.6.2 擁塞控制的算法 88
4.7 TCP 和UDP 的區(qū)別 92
4.8 小結 93
第5 章 Linux 網(wǎng)絡包處理源碼分析 94
5.1 Linux 網(wǎng)絡收包的總體流程 96
5.2 Linux 啟動的網(wǎng)絡準備 98
5.2.1 網(wǎng)卡e100 驅動初始化 99
5.2.2 啟動網(wǎng)卡e100 105
5.2.3 網(wǎng)卡e100 網(wǎng)絡數(shù)據(jù)發(fā)送隊列初始化 107
5.2.4 網(wǎng)卡e100 網(wǎng)絡數(shù)據(jù)接收隊列初始化 109
5.2.5 網(wǎng)卡e100 的中斷處理 112
5.2.6 開啟硬中斷 113
5.2.7 軟中斷ksoftirqd 內核線程 114
5.2.8 網(wǎng)絡子系統(tǒng)初始化 121
5.2.9 協(xié)議棧注冊 123
5.3 Linux 接收網(wǎng)絡數(shù)據(jù) 129
5.3.1 e100 對網(wǎng)絡數(shù)據(jù)包的存儲 130
5.3.2 硬中斷處理 131
5.3.3 軟中斷處理 132
5.3.4 網(wǎng)絡層IP 協(xié)議棧處理 143
5.3.5 傳輸層UDP 協(xié)議棧處理 152
5.4 網(wǎng)絡消息最終歸途 159
5.4.1 激活用戶進程 159
5.4.2 recvfrom 系統(tǒng)調用 167
5.4.3 Socket 數(shù)據(jù)結構 170
5.4.4 socket 創(chuàng)建 171
5.5 小結 179
第6 章 應用層協(xié)議原理 181
6.1 HTTP 協(xié)議 181
6.1.1 DNS 解析 182
6.1.2 發(fā)送HTTP 請求 183
6.1.3 HTTP 請求的響應 184
6.1.4 瀏覽器解析 185
6.1.5 瀏覽器進行頁面渲染 186
6.1.6 一次完整的HTTP 請求小結 187
6.2 掃碼支付背后那些事 188
6.2.1 掃碼支付的工作流程 189
6.2.2 掃碼支付如何保證交易安全 189
6.2.3 HTTPS 協(xié)議 191
6.2.4 Https 協(xié)議建立連接 194
6.3 直播使用的流媒體協(xié)議 197
6.3.1 直播的技術組成部分 197
6.3.2 直播的核心技術 197
6.4 小結 199
第7 章 Java Hello World 底層推理 201
7.1 回顧C 語言的Hello World 201
7.1.1 Hello World 在Linux 平臺編譯執(zhí)行過程 202
7.1.2 hello.c 程序編譯過程 202
7.1.3 hello.out 可執(zhí)行文件格式及內存映像 203
7.1.4 hello.out 程序裝載和執(zhí)行的過程 203
7.1.5 入口函數(shù)和程序初始化 205
7.1.6 Windows 操作系統(tǒng)的hello.c 206
7.1.7 C 語言的平臺關聯(lián)性 207
7.2 Java 的HelloWorld 208
7.3 Hello World 的運行 211
7.4 HelloWorld 的字節(jié)碼文件結構 213
7.5 執(zhí)行HelloWorld 的main 方法前的過程 217
7.6 HelloWorld 的main 方法的執(zhí)行過程 221
7.6.1 JVM 的執(zhí)行引擎 221
7.6.2 JVM 的GC 222
7.7 《JVM 規(guī)范手冊》 223
7.8 小結 224
第8 章 Hotspot JVM 啟動原理 226
8.1 啟動Hotspot VM 227
8.1.1 main()函數(shù) 228
8.1.2 JLI_Launch()函數(shù) 229
8.1.3 JVMInit()函數(shù) 232
8.1.4 ContinueInNewThread()函數(shù) 232
8.1.5 ContinueInNewThread0()函數(shù) 233
8.1.6 JavaMain()函數(shù) 234
8.2 類加載器 235
8.2.1 Bootstrap ClassLoader 類加載器 236
8.2.2 三層類加載器 239
8.2.3 雙親委派模型 244
8.3 Hotspot CreateVM 245
8.3.1 初始化系統(tǒng)屬性及SystemProperites 247
8.3.2 給JVM 的主干添加枝葉程序參數(shù)解釋 250
8.3.3 線程安全點 255
8.3.4 初始化全局線程隊列及vm_init_globals 257
8.3.5 JavaThread 257
8.4 初始化全局模塊init_globals 258
8.4.1 JVM 解釋器模塊 261
8.4.2 代碼高速緩存模塊 265
8.4.5 universe_init 267
8.4.3 StubRountines 272
8.4.6 marksweep_init 275
8.5 小結 276