第 1 章 從編程語言到可執(zhí)行程序,這是怎么一回事 / 1
1.1 假如你來發(fā)明編程語言 / 2
1.1.1 創(chuàng)世紀: CPU 是個聰明的笨蛋 / 3
1.1.2 匯編語言出現(xiàn)了 / 3
1.1.3 底層的細節(jié) vs 高層的抽象 / 4
1.1.4 套路滿滿:高級編程語言的雛形 / 6
1.1.5 《盜夢空間》與遞歸:代碼的本質 / 7
1.1.6 讓計算機理解遞歸 / 9
1.1.7 優(yōu)秀的翻譯官:編譯器 / 9
1.1.8 解釋型語言的誕生 / 10
1.2 編譯器是如何工作的 / 12
1.2.1 編譯器就是一個普通程序,沒什么大不了的 / 12
1.2.2 提取出每一個符號 / 13
1.2.3 token 想表達什么含義 / 14
1.2.4 語法樹是不是合理的 / 14
1.2.5 根據語法樹生成中間代碼 / 15
1.2.6 代碼生成 / 15
1.3 鏈接器不能說的秘密 / 16
1.3.1 鏈接器是如何工作的 / 17
1.3.2 符號決議:供給與需求 / 18
1.3.3 靜態(tài)庫、動態(tài)庫與可執(zhí)行文件 / 20
1.3.4 動態(tài)庫有哪些優(yōu)勢及劣勢 / 25
1.3.5 重定位:確定符號運行時地址 / 27
1.3.6 虛擬內存與程序內存布局 / 29
1.4 為什么抽象在計算機科學中如此重要 / 32
1.4.1 編程與抽象 / 32
1.4.2 系統(tǒng)設計與抽象 / 33
1.5 總結 / 34
第 2 章 程序運行起來了,可我對其一無所知 / 35
2.1 從根源上理解操作系統(tǒng)、進程與線程 / 36
2.1.1 一切要從 CPU 說起 / 36
2.1.2 從 CPU 到操作系統(tǒng) / 37
2.1.3 進程很好,但還不夠方便 / 40
2.1.4 從進程演變到線程 / 41
2.1.5 多線程與內存布局 / 44
2.1.6 線程的使用場景 / 44
2.1.7 線程池是如何工作的 / 45
2.1.8 線程池中線程的數(shù)量 / 46
2.2 線程間到底共享了哪些進程資源 / 47
2.2.1 線程私有資源 / 47
2.2.2 代碼區(qū):任何函數(shù)都可放到線程中執(zhí)行 / 49
2.2.3 數(shù)據區(qū):任何線程均可訪問數(shù)據區(qū)變量 / 49
2.2.4 堆區(qū):指針是關鍵 / 50
2.2.5 棧區(qū):公共的私有數(shù)據 / 50
2.2.6 動態(tài)鏈接庫與文件 / 52
2.2.7 線程局部存儲: TLS / 53
2.3 線程安全代碼到底是怎么編寫的 / 55
2.3.1 自由與約束 / 55
2.3.2 什么是線程安全 / 56
2.3.3 線程的私有資源與共享資源 / 57
2.3.4 只使用線程私有資源 / 58
2.3.5 線程私有資源 + 函數(shù)參數(shù) / 58
2.3.6 使用全局變量 / 60
2.3.7 線程局部存儲 / 61
2.3.8 函數(shù)返回值 / 62
2.3.9 調用非線程安全代碼 / 63
2.3.10 如何實現(xiàn)線程安全代碼 / 64
2.4 程序員應如何理解協(xié)程 / 65
2.4.1 普通的函數(shù) / 65
2.4.2 從普通函數(shù)到協(xié)程 / 66
2.4.3 協(xié)程的圖形化解釋 / 68
2.4.4 函數(shù)只是協(xié)程的一種特例 / 69
2.4.5 協(xié)程的歷史 / 69
2.4.6 協(xié)程是如何實現(xiàn)的 / 70
2.5 徹底理解回調函數(shù) / 71
2.5.1 一切要從這樣的需求說起 / 72
2.5.2 為什么需要回調 / 73
2.5.3 異步回調 / 74
2.5.4 異步回調帶來新的編程思維 / 75
2.5.5 回調函數(shù)的定義 / 77
2.5.6 兩種回調類型 / 78
2.5.7 異步回調的問題:回調地獄 / 79
2.6 徹底理解同步與異步 / 80
2.6.1 辛苦的程序員 / 80
2.6.2 打電話與發(fā)郵件 / 81
2.6.3 同步調用 / 83
2.6.4 異步調用 / 84
2.6.5 同步、異步在網絡服務器中的應用 / 86
2.7 哦!對了,還有阻塞與非阻塞 / 91
2.7.1 阻塞與非阻塞 / 92
2.7.2 阻塞的核心問題: I/O / 92
2.7.3 非阻塞與異步 I/O / 93
2.7.4 一個類比:點比薩 / 94
2.7.5 同步與阻塞 / 95
2.7.6 異步與非阻塞 / 96
2.8 融會貫通:高并發(fā)、高性能服務器是如何實現(xiàn)的 / 97
2.8.1 多進程 / 97
2.8.2 多線程 / 98
2.8.3 事件循環(huán)與事件驅動 / 99
2.8.4 問題 1 :事件來源與 I/O 多路復用 / 100
2.8.5 問題 2:事件循環(huán)與多線程 / 101
2.8.6 咖啡館是如何運作的: Reactor 模式 / 102
2.8.7 事件循環(huán)與 I/O / 103
2.8.8 異步與回調函數(shù) / 103
2.8.9 協(xié)程:以同步的方式進行異步編程 / 106
2.8.10 CPU、線程與協(xié)程 / 107
2.9 計算機系統(tǒng)漫游:從數(shù)據、代碼、回調、閉包到容器、虛擬機 / 108
2.9.1 代碼、數(shù)據、變量與指針 / 108
2.9.2 回調函數(shù)與閉包 / 110
2.9.3 容器與虛擬機技術 / 112
2.10 總結 / 114
第 3 章 底層?就從內存這個儲物柜開始吧 / 115
3.1 內存的本質、指針及引用 / 116
3.1.1 內存的本質是什么?儲物柜、比特、字節(jié)與對象 / 116
3.1.2 從內存到變量:變量意味著什么 / 117
3.1.3 從變量到指針:如何理解指針 / 120
3.1.4 指針的威力與破壞性:能力與責任 / 122
3.1.5 從指針到引用:隱藏內存地址 / 123
3.2 進程在內存中是什么樣子的 / 124
3.2.1 虛擬內存:眼見未必為實 / 125
3.2.2 頁與頁表:從虛幻到現(xiàn)實 / 125
3.3 棧區(qū):函數(shù)調用是如何實現(xiàn)的 / 127
3.3.1 程序員的好幫手:函數(shù) / 128
3.3.2 函數(shù)調用的活動軌跡:棧 / 128
3.3.3 棧幀與棧區(qū):以宏觀的角度看 / 130
3.3.4 函數(shù)跳轉與返回是如何實現(xiàn)的 / 131
3.3.5 參數(shù)傳遞與返回值是如何實現(xiàn)的 / 133
3.3.6 局部變量在哪里 / 134
3.3.7 寄存器的保存與恢復 / 134
3.3.8 Big Picture:我們在哪里 / 134
3.4 堆區(qū):內存動態(tài)分配是如何實現(xiàn)的 / 136
3.4.1 為什么需要堆區(qū) / 136
3.4.2 自己動手實現(xiàn)一個 malloc 內存分配器 / 137
3.4.3 從停車場到內存管理 / 138
3.4.4 管理空閑內存塊 / 139
3.4.5 跟蹤內存分配狀態(tài) / 141
3.4.6 怎樣選擇空閑內存塊:分配策略 / 142
3.4.7 分配內存 / 144
3.4.8 釋放內存 / 146
3.4.9 高效合并空閑內存塊 / 149
3.5 申請內存時底層發(fā)生了什么 / 150
3.5.1 三界與 CPU 運行狀態(tài) / 150
3.5.2 內核態(tài)與用戶態(tài) / 151
3.5.3 傳送門:系統(tǒng)調用 / 152
3.5.4 標準庫:屏蔽系統(tǒng)差異 / 153
3.5.5 堆區(qū)內存不夠了怎么辦 / 154
3.5.6 向操作系統(tǒng)申請內存: brk / 155
3.5.7 冰山之下:虛擬內存才是終極 BOSS / 156
3.5.8 關于分配內存完整的故事 / 156
3.6 高性能服務器內存池是如何實現(xiàn)的 / 157
3.6.1 內存池 vs 通用內存分配器 / 158
3.6.2 內存池技術原理 / 158
3.6.3 實現(xiàn)一個極簡內存池 / 159
3.6.4 實現(xiàn)一個稍復雜的內存池 / 160
3.6.5 內存池的線程安全問題 / 161
3.7 與內存相關的經典 bug / 162
3.7.1 返回指向局部變量的指針 / 163
3.7.2 錯誤地理解指針運算 / 163
3.7.3 解引用有問題的指針 / 164
3.7.4 讀取未被初始化的內存 / 165
3.7.5 引用已被釋放的內存 / 166
3.7.6 數(shù)組下標是從 0 開始的 / 167
3.7.7 棧溢出 / 167
3.7.8 內存泄漏 / 168
3.8 為什么 SSD 不能被當成內存用 / 169
3.8.1 內存讀寫與硬盤讀寫的區(qū)別 / 169
3.8.2 虛擬內存的限制 / 171
3.8.3 SSD 的使用壽命問題 / 171
3.9 總結 / 171
第 4 章 從晶體管到 CPU,誰能比我更重要 / 173
4.1 你管這破玩意叫 CPU / 174
4.1.1 偉大的發(fā)明 / 174
4.1.2 與、或、非: AND 、OR、NOT / 174
4.1.3 道生一、一生二、二生三、三生萬物 / 175
4.1.4 計算能力是怎么來的 / 175
4.1.5 神奇的記憶能力 / 176
4.1.6 寄存器與內存的誕生 / 177
4.1.7 硬件還是軟件?通用設備 / 178
4.1.8 硬件的基本功:機器指令 / 179
4.1.9 軟件與硬件的接口:指令集 / 179
4.1.10 指揮家,讓我們演奏一曲