《計算之道卷 Ⅲ:C 語言與 JVM 源碼》是一本深入探討計算機科學(xué)與技術(shù)的圖書。本書旨在幫助讀者更深入地理解計算機內(nèi)部的工作原理,并探索從高級編程語言到 JVM 源碼等核心概念。本書適合對計算機科學(xué)和底層技術(shù)感興趣的讀者,無論是學(xué)習(xí)計算機基礎(chǔ)知識還是進一步擴展技術(shù)視野,都能從本書中獲益良多。
在《計算之道卷Ш:C 語言與JM 源碼》中,作者以清晰易懂的語言詳細介紹了高級編程語言的工作原理。通過本書,讀者將了解編程語言的特性和原理、計算機網(wǎng)絡(luò)、JVM 等關(guān)鍵概念,從而更好地理解計算機執(zhí)行程序的方式。以及將學(xué)習(xí)JVM 源碼,并了解 hotspot、全局模塊等底層機制。結(jié)合實例和案例研究,讀者將能夠編寫高效、可靠的高性能應(yīng)用程序。
無論是學(xué)生、工程師還是對計算機科學(xué)感興趣的讀者,本書都將成為你不可或缺的參考資源。
在編程語言與虛擬機技術(shù)深度交融的當下,本書以獨特的 推理式 視角,打通 C 語言特性與 JVM 底層實現(xiàn)的技術(shù)脈絡(luò),為系統(tǒng)級開發(fā)者與語言愛好者構(gòu)建從上層設(shè)計到源碼級實現(xiàn)的完整認知體系。書中從 C 語言的演進邏輯切入,拆解面向?qū)ο缶幊痰暮诵脑恚ㄈ珙、多態(tài)、泛型),并通過與 C 語言、Java 的對比,揭示編程語言設(shè)計的共性與差異;繼而深入計算機網(wǎng)絡(luò)底層,結(jié)合 Linux 內(nèi)核網(wǎng)絡(luò)包處理源碼,解析 TCP/UDP 協(xié)議棧、HTTP/HTTPS 通信機制,展現(xiàn)網(wǎng)絡(luò)技術(shù)從理論到工程實現(xiàn)的全鏈路。聚焦 JVM 技術(shù)棧,本書以 Hello World 程序為起點,逐層剖析字節(jié)碼結(jié)構(gòu)、類加載機制及 Hotspot 虛擬機啟動原理,涵蓋 JVM 執(zhí)行引擎、垃圾回收(GC)等核心模塊,輔以《JVM 規(guī)范手冊》的實踐指引,幫助讀者掌握 Java 語言 一次編寫,到處運行 的底層奧秘。
無論是深耕 C 的系統(tǒng)工程師、探索 JVM 原理的 Java 開發(fā)者,還是致力于編程語言研究的學(xué)生,均可通過本書的 原理推導(dǎo) 源碼分析 雙維度講解,突破技術(shù)瓶頸,建立 語言設(shè)計 運行時環(huán)境 系統(tǒng)實現(xiàn) 的全局視野,在復(fù)雜技術(shù)棧中錨定底層邏輯,提升問題定位與架構(gòu)設(shè)計能力。
1. 為什么要寫這本書
本書是《計算之道》叢書的第III 卷。前兩卷對計算機底層原理和計算機操作系統(tǒng)相關(guān)知識進行了深入探索,并結(jié)合混沌樹進行串聯(lián)。本書在前兩卷的基礎(chǔ)上進行擴展,使大家掌握的底層知識落地。同時,本書也是對混沌學(xué)堂課程內(nèi)容的提煉和總結(jié)。
計算機網(wǎng)絡(luò)是互聯(lián)網(wǎng)和分布式系統(tǒng)的基石,了解網(wǎng)絡(luò)協(xié)議、通信模型和網(wǎng)絡(luò)編程是從事網(wǎng)絡(luò)開發(fā)和系統(tǒng)架構(gòu)的關(guān)鍵要素。
C 語言是一種高性能的編程語言,廣泛應(yīng)用于系統(tǒng)級開發(fā)、游戲開發(fā)和嵌入式系統(tǒng)等領(lǐng)域,掌握C 語言的語法和特性對于提升開發(fā)效率和代碼質(zhì)量至關(guān)重要。
JVM 是Java 應(yīng)用程序的核心,它負責解釋和執(zhí)行Java 字節(jié)碼,并提供垃圾回收、內(nèi)存管理和線程調(diào)度等功能,深入了解JVM 的工作原理和調(diào)優(yōu)技巧有助于編寫高效的Java應(yīng)用程序。
本書旨在對這三個主題進行綜合介紹,幫助讀者掌握扎實的基礎(chǔ)知識,并理解它們在實際應(yīng)用中的作用。
其實在現(xiàn)實學(xué)習(xí)過程中,大家經(jīng)常學(xué)習(xí)計算機底層知識原理,但這種知識在工作中使用頻率不高,又經(jīng)常忘記。一邊學(xué)習(xí),一邊遺忘,已經(jīng)成為學(xué)習(xí)計算機底層知識原理的常態(tài)。有沒有一種方法可以避免這種狀況發(fā)生?這就是黃俊老師的計算機混沌學(xué)習(xí)法嘗試用混沌知識樹,將計算機底層知識原理進行梳理,通過推理、推論的方式,提高大家對底層知識的理解,直到徹底掌握,不再遺忘。
本書適合以下讀者閱讀:希望學(xué)習(xí)計算機網(wǎng)絡(luò)、C 語言和JVM 基礎(chǔ)知識的讀者;需要深入了解網(wǎng)絡(luò)編程的讀者;在工作中遇到網(wǎng)絡(luò)、C 語言或JVM 相關(guān)問題,希望系統(tǒng)學(xué)習(xí)和解決的讀者;需要深入了解計算機底層知識的讀者。
2. 背景知識
本書假設(shè)讀者已具備一定的編程基礎(chǔ)和計算機科學(xué)知識。
最好是已經(jīng)閱讀過《計算之道》第I 卷、第II 卷的讀者,理解本書內(nèi)容將更為輕松。
本書將詳細講解C 語言、計算機網(wǎng)絡(luò)和JVM 的基礎(chǔ)知識,并提供實例和案例來幫助讀者理解和應(yīng)用所學(xué)知識。
3. 如何閱讀本書
本書按照C 語言、計算機網(wǎng)絡(luò)和JVM 的順序組織,每個主題包含多個章節(jié),依次遞進地介紹相關(guān)概念和技術(shù)。每個章節(jié)都以清晰的流程和總結(jié)開頭,幫助讀者理解和記憶所學(xué)內(nèi)容。
讀者可以根據(jù)自己的需求和興趣選擇閱讀順序。如果已經(jīng)熟悉某個主題,可以跳過相應(yīng)章節(jié),直接閱讀感興趣的內(nèi)容。
第1 章 C 語言的推理
在這一章中,你將了解從機器語言到匯編語言,再到C 語言的語言演進過程,以及這些語言出現(xiàn)的原因和存在的缺點。也將了解C 語言的出現(xiàn)如何解決人們對計算機軟件的需求,面向?qū)ο蠛兔嫦蜻^程的思想差異。并將領(lǐng)略學(xué)習(xí)計算機底層知識的魅力和各個編程語言的共性。
第2 章 C 語言的特性和原理
在這一章中,介紹了C 語言特性的底層原理。同時總結(jié)了C 類語言存在的問題。你將了解如何設(shè)計一門新語言,知道Java 語言的出現(xiàn)是為了專注于業(yè)務(wù)需求的開發(fā),你還將了解如何通過底層原理來學(xué)習(xí)不同的編程語言。
第3 章 計算機網(wǎng)絡(luò)推理
在這一章中,介紹了計算機網(wǎng)絡(luò)下三層,同時讓讀者明確知道什么是計算機網(wǎng)絡(luò)協(xié)議,計算機網(wǎng)絡(luò)究竟研究什么。我們使用混沌學(xué)習(xí)推理方法,避免讀者陷入大量名詞堆砌的記憶。
第4 章 傳輸協(xié)議原理
在這一章中,你將了解TCP 是一個無比復(fù)雜的協(xié)議,需要解決網(wǎng)絡(luò)傳輸中的許多問題。這些問題不僅涉及技術(shù)層面,還需要避免漏洞,如果存在漏洞被黑客利用,將會帶來巨大損失。你還將了解TCP 中很多解決方案可以在不同業(yè)務(wù)場景中被借鑒。關(guān)于TCP 這個協(xié)議的細節(jié),推薦閱讀《TCP/IP 詳解 卷1:協(xié)議》。
第5 章 Linux 網(wǎng)絡(luò)包處理源碼分析
在這一章中,深入分析了Linux 網(wǎng)絡(luò)接受數(shù)據(jù)包的全過程。在Linux 操作系統(tǒng)中,最復(fù)雜的模塊就是網(wǎng)絡(luò)模塊。在這里,你將了解Linux 操作系統(tǒng)網(wǎng)絡(luò)收包細節(jié):涉及網(wǎng)卡驅(qū)動、網(wǎng)絡(luò)子系統(tǒng)、協(xié)議棧,以及內(nèi)核ksoftirqd 線程等內(nèi)核組件之間的交互。
第6 章 應(yīng)用層協(xié)議原理
在這一章中,你將了解最常見卻又最容易忽視的HTTP 協(xié)議。從網(wǎng)絡(luò)支付出發(fā),了解HTTPS 如何保證交易安全。你還將了解直播所使用的核心技術(shù)。
第7 章 Java Hello World 底層推理
希望了解虛擬機,首先要了解真實的物理機。在這一章中,首先介紹了C 語言程序Hello World 在真實的物理機下是如何編譯的,編譯后的二進制格式ELF,以及Linux 是如何執(zhí)行ELF 的過程,作為相關(guān)知識背景;谶@些相關(guān)知識背景,我們推理出JVM 的設(shè)計目的。
第8 章 Hotspot JVM 啟動原理
在這一章里,你將了解Hotspot 的啟動過程,以JavaMain()函數(shù)為突破點,開啟JVM源碼的閱讀。你還將了解類加載器,從JVM 虛擬機的角度出發(fā),介紹三層類加載器和雙親委派模型,為深入理解JVM 原理打好基礎(chǔ)。結(jié)合構(gòu)建混沌樹主干和枝葉的方法,將所學(xué)知識進行關(guān)聯(lián)。
4. 勘誤和支持
由于本書不可避免地存在一些疏漏或不夠準確之處,歡迎讀者批評指正。
黃俊
專注于研究Java語言
專注于研究Hotspot
專注于研究Linux內(nèi)核
專注于研究C語言與匯編
專注于研究架構(gòu)設(shè)計
專注于研究多線程并發(fā)處理
專注于研究高效學(xué)習(xí)方式
曾就職于美團、阿里
前新東方業(yè)務(wù)架構(gòu)師
賴志環(huán)
十年游戲及互聯(lián)網(wǎng)應(yīng)用的技術(shù)研發(fā)經(jīng)歷。負責過5000以上注冊用戶,日活躍用戶達800萬,10萬多用戶同時在線,年流水達1億的游戲產(chǎn)品研發(fā)。熟悉技術(shù)研發(fā)的多重領(lǐng)域。自2016年至今創(chuàng)辦深圳帝國互娛網(wǎng)絡(luò)在線有限公司,聯(lián)合創(chuàng)始人負責技術(shù)部。
第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 面向過程和面向?qū)ο?8
1.4 C 語言特性來源 11
1.5 其他編程語言原理推導(dǎo) 12
1.6 編程語言的共性 13
1.7 小結(jié) 15
第2 章 C 語言的特性和原理 17
2.1 對象和類原理 17
2.1.1 C 語言的class 關(guān)鍵字 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 內(nèi)存泄漏和野指針規(guī)避 40
2.5.2 新語言的設(shè)計要求 42
2.5.3 新語言的兩種實現(xiàn)方法 43
2.6 如何通過底層來學(xué)習(xí)不同的編程語言 45
2.7 小結(jié) 48
第3 章 計算機網(wǎng)絡(luò)推理 50
3.1 計算機網(wǎng)絡(luò)的研究內(nèi)容 50
3.2 計算機網(wǎng)絡(luò)協(xié)議 52
3.2.1 什么是協(xié)議 52
3.2.2 誰來制定協(xié)議 53
3.2.3 協(xié)議分層 54
3.3 計算機網(wǎng)絡(luò)地址 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)絡(luò)下三層 61
3.6 小結(jié) 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 小結(jié) 93
第5 章 Linux 網(wǎng)絡(luò)包處理源碼分析 94
5.1 Linux 網(wǎng)絡(luò)收包的總體流程 96
5.2 Linux 啟動的網(wǎng)絡(luò)準備 98
5.2.1 網(wǎng)卡e100 驅(qū)動初始化 99
5.2.2 啟動網(wǎng)卡e100 105
5.2.3 網(wǎng)卡e100 網(wǎng)絡(luò)數(shù)據(jù)發(fā)送隊列初始化 107
5.2.4 網(wǎng)卡e100 網(wǎng)絡(luò)數(shù)據(jù)接收隊列初始化 109
5.2.5 網(wǎng)卡e100 的中斷處理 112
5.2.6 開啟硬中斷 113
5.2.7 軟中斷ksoftirqd 內(nèi)核線程 114
5.2.8 網(wǎng)絡(luò)子系統(tǒng)初始化 121
5.2.9 協(xié)議棧注冊 123
5.3 Linux 接收網(wǎng)絡(luò)數(shù)據(jù) 129
5.3.1 e100 對網(wǎng)絡(luò)數(shù)據(jù)包的存儲 130
5.3.2 硬中斷處理 131
5.3.3 軟中斷處理 132
5.3.4 網(wǎng)絡(luò)層IP 協(xié)議棧處理 143
5.3.5 傳輸層UDP 協(xié)議棧處理 152
5.4 網(wǎng)絡(luò)消息最終歸途 159
5.4.1 激活用戶進程 159
5.4.2 recvfrom 系統(tǒng)調(diào)用 167
5.4.3 Socket 數(shù)據(jù)結(jié)構(gòu) 170
5.4.4 socket 創(chuàng)建 171
5.5 小結(jié) 179
第6 章 應(yīng)用層協(xié)議原理 181
6.1 HTTP 協(xié)議 181
6.1.1 DNS 解析 182
6.1.2 發(fā)送HTTP 請求 183
6.1.3 HTTP 請求的響應(yīng) 184
6.1.4 瀏覽器解析 185
6.1.5 瀏覽器進行頁面渲染 186
6.1.6 一次完整的HTTP 請求小結(jié) 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 直播的技術(shù)組成部分 197
6.3.2 直播的核心技術(shù) 197
6.4 小結(jié) 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í)行文件格式及內(nèi)存映像 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 語言的平臺關(guān)聯(lián)性 207
7.2 Java 的HelloWorld 208
7.3 Hello World 的運行 211
7.4 HelloWorld 的字節(jié)碼文件結(jié)構(gòu) 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 小結(jié) 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 小結(jié) 276