程序員進階之路:緩存、網絡、內存與案例 ( 簡體 字) |
作者:鄧中華 | 類別:1. -> 程式設計 -> 綜合 2. -> 作業系統 -> Linux |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 56472 詢問書籍請說出此書號!【有庫存】 NT售價: 690 元 |
出版日:5/1/2024 |
頁數:328 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121476433 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:我在開發一個高性能服務期間,就想自己設計一個無鎖的多生產者、多消費者隊列。無鎖編程涉及很多緩存和內存屏障的知識,不是一件容易的事情,沒有技術功底是不行的。所以我查了很多資料,深入學習了很多理論知識,弄清楚每個細節,刨根問底,追本溯源,從CAS、內存屏障、緩存一致性協議,再到緩存原理,甚至底層硬件,終于弄明白了無鎖編程的底層實現。然后把學習到的知識匯總整理成了“CPU緩存一致性:從理論到實戰”—這是我在網上發布的第一篇技術文章。這篇文章發布后,獲得了非常多的點贊,我也收獲了很多粉絲。就這樣,我發現了自己的另一面—除了可以自己寫代碼,還可以教別人寫代碼。讀者的認可激發了我想要創作更多的技術文章的熱情。我后來又寫了網絡、TCP、UDP、端口、分布式和相關工作經歷等的文章。
在我工作滿十周年之際,借此契機,我將這些文章整理為“十年碼農內功”系列,例如其中的“十年碼農內功:緩存”。后面我又寫了網絡收發包詳細過程和內存等文章,填補了“十年碼農內功”系列的最后幾塊拼圖。再后來有幾個出版社聯系了我,想要將“十年碼農內功”系列文章出版為圖書,最后我選擇了最早與我聯系的電子工業出版社。將網絡文章變成正式的出版物可不是一件容易的事情,在此期間我做了大量的修改工作來完善本書的內容。
本書內容涉及大量的代碼和Linux命令,希望讀者自己運行其中的代碼和相關的命令,達到學以致用、有的放矢的目的。
本書特色
計算機技術發展飛快、日新月異,很多面試“八股文”可能早已過時。本書基于Linux 6.0及以上版本來講解書中涉及的各個模塊,有助于讀者理解現代Linux內核,掌握實用的技術知識。
網上技術文章的質量參差不齊并且不成體系,還有存在錯誤的情況,就連ChatGPT給出的答案也會有錯誤,導致我們的學習成本比較高。本書詳細地介紹了計算機系統中的核心知識,可以有效降低我們的學習成本。
作為工作十余年的技術老兵,我深刻體會到寫五年業務邏輯和寫十年業務邏輯沒有太大的差異,只不過是對業務的熟練度有差異罷了。本書可以幫助那些想要摘掉“CRUD(增刪改查)Boy”標簽的程序員掌握技術的底層原理。
本書涉及的內容偏底層并且比較“硬核”,更適合有一定基礎的學生和程序員閱讀,從而進階為更高級的軟件開發工程師,打破“天花板”。
全書共有150多張示例圖,圖文并茂,有助于讀者更容易理解本書的內容。同時還提供了大量的實戰和測試代碼,不僅有助于讀者理解理論,還可以對理論進行練習和驗證,達到學以致用和有的放矢的目的。
本書結構
第1章首先介紹存儲體系結構、緩存原理、緩存一致性協議、內存屏障、CAS原理和原子操作等理論知識,然后介紹如何運用這些理論知識實現一個高性能無鎖多生產者、多消費者隊列,該隊列在單生產者、單消費者場景下可以達到600萬QPS。
第2章介紹網絡接口層、網絡層、套接字編程和虛擬網卡等內容,還介紹了一些網絡工具,例如tcpdump和ethtool,以及如何使用這些工具進行網絡分析和調優。
第3章介紹TCP的協議體、有限狀態機、建立/關閉連接的不同階段,以及流量控制(滑動窗口)和擁塞控制(CUBIC算法)。
第4章首先介紹UDP的協議體、特點和應用場景,以及介紹保障可靠傳輸的兩種機制:ACK(消息確認)和FEC(前向糾錯)。
第5章首先通過幾個問題引出地址/端口復用的結論。然后介紹地址復用和端口復用的應用場景。最后介紹了TCP和UDP本來就可以同時綁定同一個端口。
第6章首先介紹網絡在收發數據包之前的準備工作,包括網卡驅動的加載、初始化和網卡的啟動。然后依據Linux 6.0內核源碼詳細介紹數據包從網卡硬件、網絡接口層、網絡層、傳輸層(UDP)、套接字層再到應用層的整個收包流程。
第7章依據Linux 6.0內核源碼詳細介紹數據包從應用層、套接字層、傳輸層(UDP)、網絡層、鄰居子系統、網絡接口層再到網卡硬件的整個發包流程。
第8章首先通過Linux 6.8內核源碼中的物理內存節點、物理內存區域和物理內存頁及實際的物理內存空間布局來介紹物理內存。然后通過Linux 6.8內核源碼中的虛擬內存空間和虛擬內存區域,以及虛擬內存的布局和虛擬內存的申請來介紹虛擬內存。最后通過Linux 6.8內核源碼中的正向與反向映射來介紹物理內存與虛擬內存之間的互為映射關系。本章參考了“bin的技術小屋”的公眾號,這里表示感謝。
第9章主要分享我在實際工作中遇到的兩個難題,以及難題是如何解決的。通過這兩個案例可以看到具體的解題方法,給讀者在解決實際工作中遇到的問題時提供借鑒和啟發。
資源獲取方式
對于書中涉及的所有示例代碼與Linux內核源碼(見書中的“代碼清單”),讀者可以掃描封底“讀者服務”處的二維碼獲取。
勘誤
我在寫作過程中盡力保證內容嚴謹,但我深知在浩瀚的計算機知識中,自己水平有限,無法確保本書內容百分之百正確。因此,真誠地期待讀者的批評和指正。讀者在閱讀本書過程中發現錯誤和不足之處,或者有任何意見和建議,都可以通過關注公眾號“科英”直接與我交流。我會在本書后續版本中及時更正,不斷提高本書的質量和準確性。
致謝
感謝妻子的理解和支持,感謝她鼓勵和包容我占用大量業余時間撰寫本書。感謝父母的養育之恩,感謝兄長在工作和學習方面對我的幫助。最后將本書作為我剛出生孩子的首個禮物。
鄧中華 |
內容簡介:本書主要講解計算機系統中核心的技術知識,涵蓋緩存、內存屏障、無鎖編程、網絡基礎、TCP/UDP、端口復用、網絡收發包流程、物理內存、虛擬內存等內容。本書還分享了實際工作中可能出現的技術難題及解決方案供讀者借鑒。為了使讀者輕松、快速地理解書中晦澀難懂的技術知識,本書作者精心繪制了大量的流程圖、結構圖。為了使讀者更好地理解Linux內核源碼,本書還提供了大量經過注釋的Linux內核源碼供讀者下載。通過閱讀本書,讀者可以輕松、快速地掌握這些技術知識,并通過源碼和書中配圖加強對相關知識的理解。 |
目錄:第1章 緩存 1
1.1 存儲體系結構 1
1.2 緩存一致性協議 4
1.2.1 MESI協議 4
1.2.2 MOESI協議 8
1.2.3 MESIF協議 9
1.3 寫緩存區和無效隊列 9
1.3.1 寫緩沖區的作用 11
1.3.2 無效隊列的作用 11
1.4 內存屏障 11
1.4.1 讀寫屏障 12
1.4.2 單向屏障 12
1.5 x86-TSO 13
1.6 CPU黑盒測試 15
1.6.1 測試核心內是否存在Store Buffer 15
1.6.2 測試轉發(Store Forwarding)是否生效 17
1.6.3 測試StoreStore是否亂序執行 18
1.6.4 測試LoadLoad是否亂序執行 19
1.6.5 測試LoadStore是否亂序執行 19
1.6.6 測試StoreLoad是否亂序執行 20
1.7 CAS原理 20
1.8 原子操作 22
1.8.1 互斥鎖 23
1.8.2 自旋鎖 23
1.8.3 C++原子變量 25
1.8.4 C++內存順序 26
1.9 無鎖隊列 31
1.9.1 設計思路 31
1.9.2 實現細節 32
第2章 網絡 36
2.1 網絡分層 36
2.2 網絡接口層(以太網) 37
2.3 網絡層(IP、ICMP) 39
2.3.1 IP 39
2.3.2 ICMP 43
2.4 套接字編程 47
2.4.1 套接字 47
2.4.2 函數 47
2.4.3 多路復用 49
2.5 虛擬網卡 54
2.5.1 Tun設備 54
2.5.2 創建代碼 55
2.6 網絡抓包 56
2.6.1 tcpdump 56
2.6.2 Wireshark 59
2.7 網絡工具 61
2.7.1 ethtool工具 61
2.7.2 ifconfig工具 65
2.7.3 ip工具 66
2.7.4 nc工具 66
2.8 網卡的特性(Feature) 67
2.8.1 LRO 67
2.8.2 GRO 67
2.8.3 TSO 68
2.8.4 GSO 68
2.9 網絡棧的擴展(Scaling) 69
2.9.1 RSS 69
2.9.2 RPS 71
2.9.3 RFS 72
2.9.4 XPS 73
2.10 硬中斷的負載均衡 74
2.10.1 硬中斷的CPU親和性 74
2.10.2 irqbalance功能 75
第3章 TCP 76
3.1 協議體 76
3.2 有限狀態機 81
3.2.1 netstat 82
3.2.2 ss 82
3.3 準備階段 83
3.4 握手階段 84
3.4.1 三次握手 84
3.4.2 初始化序列號 88
3.5 連接階段 89
3.5.1 重傳機制 90
3.5.2 確認機制 93
3.5.3 亂序恢復機制 94
3.5.4 保活機制 95
3.6 流量控制 97
3.6.1 滑動窗口 97
3.6.2 流量控制過程 99
3.6.3 零窗口 100
3.7 擁塞控制 101
3.7.1 擁塞控制算法 101
3.7.2 CUBIC 102
3.8 揮手階段 109
3.8.1 四次揮手 109
3.8.2 三次揮手 112
3.8.3 同時揮手 113
3.8.4 關閉函數 114
第4章 UDP 117
4.1 協議體 117
4.2 特點 119
4.2.1 無連接性 119
4.2.2 不可靠性 122
4.2.3 面向報文 122
4.2.4 最大交付 124
4.2.5 最小開銷 125
4.3 應用場景 125
4.4 可靠性保障 126
4.4.1 ACK 126
4.4.2 FEC 126
第5章 端口 128
5.1 問題 128
5.2 地址和端口復用的總結 128
5.2.1 兩個選項均關閉 129
5.2.2 僅開啟一個選項 129
5.2.3 僅開啟地址復用選項 130
5.2.4 開啟端口復用選項 131
5.3 地址復用的應用場景 132
5.4 端口復用的應用場景 133
5.4.1 單工作線程 133
5.4.2 多工作線程 137
5.5 TCP和UDP綁定同一端口 138
第6章 收包 139
6.1 網卡的準備過程 139
6.1.1 網卡驅動的加載 140
6.1.2 網卡驅動的初始化 141
6.1.3 啟用網卡 143
6.2 收包過程總覽 145
6.3 網絡接口層 148
6.3.1 網卡收到數據包 149
6.3.2 內核收到硬中斷 149
6.3.3 內核收到軟中斷 150
6.3.4 清理接收隊列 152
6.3.5 GRO 158
6.3.6 RPS 159
6.3.7 數據包進入協議棧之前 161
6.4 網絡層(IP) 168
6.4.1 網絡協議棧入口 169
6.4.2 數據包的流向 171
6.4.3 數據包的轉發 172
6.4.4 數據包進入傳輸層之前 173
6.5 傳輸層(UDP) 174
6.5.1 UDP協議入口 175
6.5.2 數據包的特殊處理 176
6.5.3 將數據包放入接收隊列 178
6.5.4 喚醒等待數據的進程/線程 179
6.6 套接字層 183
6.6.1 創建套接字 183
6.6.2 綁定套接字 188
6.6.3 讀取套接字 189
第7章 發包 195
7.1 發包流程總覽 195
7.2 套接字層 198
7.2.1 send/sendto函數(用戶態) 198
7.2.2 send/sendto系統調用(內核態) 199
7.2.3 選擇發送函數 200
7.2.4 將消息對象遞交到傳輸層 201
7.3 傳輸層(UDP) 202
7.3.1 處理消息對象 203
7.3.2 處理數據包(struct sk_buff) 211
7.4 網絡層(IP) 212
7.4.1 IP層入口函數 213
7.4.2 IPv4的發送函數 214
7.4.3 執行BPF程序 214
7.4.4 數據包的分片 215
7.4.5 將數據包發給鄰居子系統 216
7.5 鄰居子系統 217
7.5.1 確定發送路徑 219
7.5.2 快速發送路徑 220
7.5.3 慢速發送路徑 222
7.6 網絡接口層 225
7.6.1 網絡接口層入口 226
7.6.2 內核選擇發送隊列 229
7.6.3 運行排隊規則 233
7.6.4 將數據包遞交到網卡驅動 235
7.6.5 網卡驅動發包 236
7.6.6 軟中斷處理過程 240
7.6.7 網卡發送完成 241
第8章 內存 244
8.1 物理內存 244
8.1.1 物理內存模型 244
8.1.2 物理內存架構 250
8.1.3 物理內存節點 253
8.1.4 物理內存區域 256
8.1.5 物理內存頁 261
8.1.6 物理內存布局 266
8.1.7 物理內存硬件 269
8.2 虛擬內存 270
8.2.1 虛擬內存布局 270
8.2.2 虛擬內存空間 279
8.2.3 虛擬內存區域 288
8.2.4 虛擬內存申請 290
8.3 內存映射 301
8.3.1 正向映射 301
8.3.2 反向映射 307
第9章 案例 310
9.1 偽內存泄漏排查 310
9.1.1 背景 310
9.1.2 分析 310
9.1.3 定位 311
9.2 周期性事故處理 312
9.2.1 背景 312
9.2.2 猜想(大膽假設) 312
9.2.3 定位(小心求證) 313
9.2.4 總結 316 |
序: |