産品特色
編輯推薦
騰訊公司資深研發工程師多年後颱開發經驗總結,獲騰訊、Facebook、微軟、阿裏、百度多位資深技術專傢高度認可。
完整勾勒後颱開發技術能力體係,多維度講解瞭成為一名後颱開發工程師所需掌握的核心技術、開發工具和實踐方法,後颱工程師修煉必讀!
內容簡介
因為後颱開發所需要的技術廣泛而堅深,要成為一名後颱開發工程師門檻很高,所以相關人纔比較緊缺。作者是在騰訊工作多年的後颱開發工程師,不僅技術精湛,而且在處理大量實際業務的過程中積纍瞭豐富的開發經驗。在這本書中,她不僅首次為後颱開發工程師勾勒齣瞭完整的知識能力體係結構圖,而且還對後颱開發工程師所需要掌握的大量復雜的技術知識進行瞭提煉、剝離和整閤,專注於成為一名後颱開發工程師所需掌握的核心技術、開發工具和實踐方法,大幅度降低後颱開發工程師的學習麯綫。本書的內容獲得瞭來自騰訊、Facebook、微軟、阿裏、百度的多位資深技術專傢的高度認可。
全書一共13章,在邏輯上分為六大部分:
第一部分(第1~3章)介紹瞭編程語言方麵的知識,包括常用語法、類與常用STL的使用;
第二部分(第4~5章)介紹瞭編譯原理和調試方法相關的知識,編譯原理包括編譯與鏈接的具體過程、Makefile的編寫、目標文件的內容與處理目標文件相關工具的使用,調試方法主要介紹瞭strace、gdb、top、ps與valgrind工具的使用等;
第三部分(第6~8章)介紹瞭網絡相關的知識,包括TCP協議的關鍵知識點和TCPserver的實現,網絡IO模型和select、poll與epoll三個重要函數的使用,還有ping、tcpdump、netstat和lsof這四個網絡分析工具的使用;
第四部分(第9~11章)主要是多綫程、進程和進程間通信相關的知識,包括多綫程的使用、多綫程的同步和重入問題,進程方麵有父子進程、僵死進程、守護進程和進程間通訊的方式;
第五部分(第12章)主要是HTTP協議的介紹與使用、CGI的設計原理、實現和FASTCGI的簡單介紹;第六部分(第13章)通過常用類庫JsonCPP和Protobuf的使用,演示如何使用第三方庫。
作者簡介
徐曉鑫,騰訊資深軟件研發工程師,先後在騰訊遊戲之洛剋王國、QQ會員、QQ秀等多個項目從事研發工作,精通後颱開發的各種技術,實戰經驗豐富。
精彩書評
後颱開發是一個“曆史悠久”的領域,同是也是一個沉澱深厚,高技術價值的領域。本書清晰、嚴謹、務實的風格顯示齣曉鑫對該領域知識的深刻理解。
——張子興Facebook對外支付項目主程,美國加州MenloPark
每一位從事後颱開發的專業人士都需要一本《後颱開發:核心技術與應用實踐》。對每一位想要認真從事該領域工作的人來說,這是一本絕對必讀的書籍。
——彭可競微軟軟件工程師,美國華盛頓州Redmond
《後颱開發:核心技術與應用實踐》是作者多年後颱開發、架構和研究的精華。本書用通俗的文字、詳盡的示例代碼,結閤實際工作中的案例,講述瞭後颱開發方方麵麵的知識,內容豐富。對於從事後颱開發的人員,這是一本很好的由淺入深的學習書籍。
——周樂阿裏巴巴資深算法工程師,北京望京
使用C++語言進行後颱開發有一定的門檻,本書可以很好的幫助你跨過這個“門檻”。
——暢晉百度大數據高級測試工程師,北京上地
目錄
序
緒論
第1章 C++編程常用技術 1
1.1 第一個C++程序 1
1.2 函數 3
1.3 數組 6
1.4 指針 8
1.5 引用 12
1.6 結構體、公用體、枚舉 14
1.6.1 結構體、共用體、枚舉的概念 14
1.6.2 結構體、共用體在內存單元占用字節數的計算 18
1.7 預處理 20
1.8 本章小結 25
第2章 麵嚮對象的C++ 26
2.1 類與對象 26
2.2 繼承與派生 49
2.3 類的多態 57
2.4 本章小結 64
第3章 常用STL的使用 65
3.1 STL是什麼 65
3.2 string 66
3.3 vector 77
3.3.1 vector是什麼 77
3.3.2 vector的查增刪 78
3.3.3 vector的內存管理與效率 86
3.3.4 Vector類的簡單實現 90
3.4 map 96
3.4.1 map是什麼 96
3.4.2 map的查增刪 96
3.4.3 map的原理 109
3.5 set 111
3.5.1 set是什麼 111
3.5.2 set的查增刪 112
3.6 本章小結 116
第4章 編譯 117
4.1 編譯與鏈接 117
4.2 makefile的撰寫 131
4.3 目標文件 135
4.3.1 ELF的文件類型 135
4.3.2 鏈接視圖下的ELF內容 136
4.3.3 執行視圖下的ELF內容 142
4.3.4 閱讀ELF文件的工具——readelf 144
4.3.5 獲得二進製文件裏符號的工具——nm 144
4.3.6 減少目標文件大小的工具——strip 146
4.4 本章小結 147
第5章 調試 148
5.1 strace 148
5.2 gdb 156
5.3 top 164
5.4 ps 165
5.5 Valgrind 168
5.5.1 Valgrind概述 168
5.5.2 Linux程序內存空間布局 170
5.5.3 內存檢查原理 175
5.5.4 Valgrind安裝 176
5.5.5 Valgrind使用 177
5.6 本章小結 187
第6章 TCP協議 188
6.1 TCP協議 188
6.1.1 網絡模型 188
6.1.2 TCP頭部 191
6.1.3 TCP狀態流轉 193
6.1.4 TCP超時重傳 196
6.1.5 TCP滑動窗口 200
6.1.6 TCP擁塞控製 202
6.2 TCP網絡編程API 205
6.3 實現一個TCP server 211
6.4 TCP協議選項 215
6.5 網絡字節序與主機序 233
6.6 封包和解包 233
6.7 本章小結 247
第7章 網絡IO模型 248
7.1 4種網絡IO模型 248
7.2 select 256
7.3 poll 267
7.4 epoll 277
7.5 本章小結 289
第8章 網絡分析工具 290
8.1 ping 290
8.2 tcpdump 292
8.3 netstat 294
8.4 lsof 296
8.5 本章小結 298
第9章 多綫程 299
9.1 多綫程是什麼 300
9.2 多綫程的創建與結束 301
9.3 綫程的屬性 307
9.4 多綫程同步 312
9.5 多綫程重入 332
9.6 本章小結 333
第10章 進程 334
10.1 程序與進程 334
10.2 進程的創建與結束 335
10.3 僵屍進程 342
10.4 守護進程 347
10.5 本章小結 351
第11章 進程間通信 352
11.1 管道 352
11.2 消息隊列 358
11.3 共享內存 362
11.4 信號量 368
11.5 ipcs命令 373
11.6 本章小結 374
第12章 HTTP協議 375
12.1 HTTP協議工作流程 375
12.2 HTTP協議結構 376
12.3 HTTPS 383
12.4 CGI 386
12.5 FastCGI 397
12.6 本章小結 398
第13章 常用類庫 399
13.1 JSON 400
13.2 Protobuf 405
13.3 本章小結 409
前言/序言
Preface 序
C++可能是計算機曆史上最早被發明的高級程序語言,同時也是當今最活躍的程序設計語言之一。C++很強大,強大到你可以使用它做任何層麵的開發;C++也很脆弱,脆弱到需要程序員自己去控製內存迴收,一個不小心就會使整個程序Core Dump。C++語言的創始人Bjarne Stroustrup曾私下承認,為瞭提高C++程序員的薪水和地位,在設計C++編譯器版本過程中有意地增加瞭C++語言的難度,使C++更偏嚮於資深程序員的使用習慣,提高學習門檻,從而增加C++程序員的身價。學習麯綫的增加並不是沒有任何迴報的,在服務端後颱開發、處理多並發的海量網絡請求方麵,C++語言有天然的優勢。因此,當應用的用戶量、並發量迅速增長,達到一定量級之後,後端服務的技術架構都會轉變為Linux C++。
要做一名優秀的使用C++進行後颱開發的程序員,隻掌握C++語言是遠遠不夠的,還需要掌握如何進行編譯、鏈接、調試,如何使用網絡協議、IO模型和一些常用的類庫,等等。我曾經麵試過不少後颱開發程序員,他們往往很重視語言本身,但是對一些語言之外的東西理解不夠透徹,影響瞭他們的技術發展。我也讀過不少相關方麵的技術書籍,往往都過多地停留在語言層麵,忽略瞭實際開發工作中需要用到的知識。
曉鑫在騰訊從事開發工作多年,有豐富的後颱開發經驗,她從實際的後颱開發經驗齣發,講解瞭後颱開發中需要用到的方方麵麵的知識。從C++語言齣發,又不止於C++語言,本書可以說是一本Linux C++後颱開發的實戰典範。當知道曉鑫在寫這麼一本書的時候,我真心為國內的眾多開發者感到高興。如果讀者有意願成為一名從事Linux後颱開發的程序員,本書無疑是一本最佳的參考書籍。
研發是一項講究實戰的工作,一切不從實際工作齣發的技術書籍都是紙上談兵,沒有實際意義。一本優秀的技術書籍應該是這樣的:當讀者按照書中的內容進行實操的時候,讀者寫的每一行代碼都是有價值的,能夠在實際工作中派上用場。本書恰好做到瞭這一點。這是一位技術書籍作者對讀者的起碼誠意。
軟件工程師是一種需要堅定、踏實、精益求精的“工匠精神”的職業,心浮氣躁、得過且過的態度不可能把代碼寫好。老一輩的人說“字如其人”,在軟件領域,我們同樣可以說“代碼如其人”,一個人的行事風格和為人態度都會體現到他所寫的代碼上麵。按照曉鑫的書去學習,讀者可以潛移默化地學習到她多年後颱開發所煉就的“工匠精神”。我想,相對於所學習到的知識,這於一個工程師來說更為重要。
黃世飛
騰訊雲平颱技術總監
Introduction 緒 論
0.1 什麼是後颱開發
聽到“後颱開發”這個詞,估計讀者心中都或多或少會有一些自己的感性認識,這種認識可能有一些差彆,但估計大部分人都有這麼一種看法:“後颱開發”是編寫一些用戶看不見的程序,也就是非界麵的程序,既不是網頁,也不是App,更不是桌麵程序,因為這些都是用戶看得見的(被稱為“前颱開發”)。這種感性認識在一定程度上是正確的,但是它不夠具體,也不夠全麵。
我們這裏所說的“後颱開發”的確是用戶“看不見”的部分,但是還有很多界麵性的程序是給企業內部人員使用的,這些雖然是界麵程序,但是對於最終用戶來說也是“看不見”的。舉個例子,開發一個電子商務網站,提供給客戶進行商品購買的網頁是用戶看得見的,不屬於“後颱”,但是電商網站內部員工使用的“用戶管理係統”,“訂單管理係統”等,也是用戶看不見的,但它們不屬於本書中所指的“後颱”。在某些場閤,或者某些人的習慣中,這些內部使用的係統也叫“後颱”,這幾種說法都沒有錯,希望讀者在聽到的時候,知道說話人具體指的是什麼。
本書介紹的“後颱開發”指的是“服務端的網絡程序開發”,從功能上可以具體描述為:服務器收到客戶端發來的請求數據,解析請求數據後處理,最後返迴結果,如圖0-1所示。
圖0-1 後颱開發的步驟
這裏的SERVER就是本書所指的“後颱程序”,或者“服務器”。SERVER接收請求的方式既可以是通過TCP請求包,也可以是HTTP請求包(其實也是TCP連接)。如果是TCP請求,二進製的格式會常見一些;如果是HTTP方式的請求,請求包的格式一般是JSON或者XML,或者自定義的ASCII文本。解析請求包的方式自然是與請求包的格式相對應的,接收到的是什麼格式的包,就用對應的格式解析(如果是自定義的格式,就按照自定義的方式去解析)。“處理請求”這一步是後颱程序的具體業務邏輯的體現。很多封裝好的後颱框架會把其他三步都做好,但是這一步還是需要開發者自己去實現,因為隻有開發者自己清楚,程序是要去做“登錄”還是去做“注冊”的事情。“輸齣迴復包”和“接收請求包”是對應的,一般來說,收到的是JSON,那麼迴復的也是JSON,收到的是XML,那麼發送的也是XML,其他格式也是一樣的。這四個步驟是所有後颱程序都會有的,無論使用什麼語言去實現,都可以看到這四個步驟的影子。
CLIENT指的是嚮SERVER發起請求,並接收SERVER迴復的一方,通常稱為“客戶端”。既然後颱程序是通過TCP或者HTTP接收和迴復消息的,那麼隻要是能夠發起TCP或者HTTP連接的都可以作為客戶端,可以是瀏覽器、PC端的程序、安卓應用、IOS應用,等等。
0.2 時間就是金錢,效率就是生命
上世紀80年代,在改革開放初期的深圳蛇口,為瞭加快蛇口港的建設,一塊“時間就是金錢,效率就是生命”的巨幅標語矗立在蛇口工業區的馬路邊(如圖0-2所示),拉開瞭特區建設的序幕。
圖0-2 1981年矗立在深圳蛇口工業區的巨幅標語
其實這個口號後麵還有兩句:“安全就是法律,顧客就是皇帝”,這四句加一起,簡直就是當今互聯網時代科技公司安身立命的根本。互聯網最講究效率並且一切都從用戶體驗齣發。在騰訊、百度和阿裏這樣的互聯網公司裏,每一次的版本發布都是和時間在賽跑。各種以效率為核心的開發團隊閤作模式被創造:敏捷開發、極限編程、SCRUM、結對編程,雙周迭代,等等。
寫下這些文字的時候是我在騰訊工作的第五個年頭,這五年讓我對效率有瞭更深刻的認識。還是一個學生的時候,和大傢一樣,我也曾一字不落地讀過《UNIX環境高級編程》,《UNIX環境網絡編程》一二三捲,《TCP/IP詳解》一二三捲,《C++ Primer》等書籍,這些都是非常經典的開發書籍。它們的共同特點是大而全,不漏掉任何一個知識點,並且每個知識點都講得非常詳細。但在實際的開發工作中,可能用到的知識點隻有20%,其他的80%則很少用到。這也是我寫這本書的初衷:用最短的篇幅,講解實際後颱開發中用到的核心知識點,讓讀者可以快速進入到實際的開發工作中。
也許有讀者會覺得這很急功近利,不利於組建完整的知識體係。其實,軟件開發是一門講究實操的技術,知道多少並不重要,重要的是能夠用好多少。如果把一本經典書籍讀3遍,但是沒有寫過一行代碼,那可以認為是沒有讀。邊寫代碼邊讀書纔是最好的學習方式,在讀一本技術書籍的時候,最好讓自己快速進入寫代碼的狀態,一邊寫代碼,一邊通讀書籍,在具體需要用到書上某個技術點的時候,再迴頭仔細閱讀相關的章節。在這個循環往復的過程中,纔能把書上的知識點轉化為自己的知識點。完成多個這樣的循環後,再迴過頭來審視自己已經掌握的知識點,把一些沒有掌握的知識點搞清楚。這樣的學習過程實際上更有利於完善自己的知識體係。
0.3 後颱開發的知識體係
接下來簡單介紹一下後颱開發的知識體係,也就是說,要完整掌握後颱開發,需要掌握哪些知識點,這些知識點也是本書會講解到的知識點。圖0-3展示瞭對後颱開發知識體係一個比較全麵的梳理。
以上這六部分知識點會是本書將會覆蓋的內容。與專門介紹某一類知識的書籍不同,比如《C++ Primer》介紹C++的方方麵麵,《UNIX環境編程》介紹UNIX環境編程的方方麵麵,本書從“實戰”的角度齣發,介紹“後颱開發”需要用到的知識和工具。讀完本書,讀者可能不會對C++精通,不會對Linux精通,也不會對TCP/IP精通,但是卻可以學會如何進行“後颱開發”,這些“精通”可以一個個慢慢補全。
圖0-3 後颱開發工程師技術能力體係圖
細心的讀者可能會發現,編程語言和編輯器隻是其中的一小部分,要把後颱開發做好,需要掌握的東西比想象中的要多。同時,這些知識點既有一些純理解性的內容,也有一些工具性的東西。這也是程序開發的最大特點,既要掌握理論的東西,也要掌握相應的工具,這樣纔能把理論的知識用起來。在實際開發中,這些工具性的知識可能更重要,因為理論是腦子裏想的,但工具産生的東西纔是真正的産齣,纔是開發者最終需要的。
0.4 如何閱讀本書
本書以C++為編程語言,講述後颱開發的核心技術與應用實踐。全書共13章,在邏輯上分為以下六部分:
第一部分為第1~3章,主要是編程語言方麵的知識,包括函數、函數重載、函數模闆、數組、指針、引用、結構體和預處理的使用;麵嚮對象的介紹,包括類的使用、繼承與派生和類的多態;常用STL的介紹,包括string、vector、map和set的使用方法與原理。如果讀者已經對C++非常瞭解,可以跳過這部分,也可以配閤《C++ Primer》一起閱讀。
第二部分為第4~5章,主要是編譯原理和調試方法相關的知識。編譯原理相關知識包含編譯與鏈接的具體過程,makefile的編寫、目標文件的內容與處理目標文件相關工具的使用;調試方法相關內容主要介紹瞭用strace分析係統調用、用gdb調試進程與分析coredump文件、用top命令分析係統負載情況、用ps命令查看係統進程和用valgrind工具分析進程的內存使用情況等。
第三部分為第6~8章,主要是網絡相關的知識,包括TCP協議的關鍵知識點和TCP server的實現,網絡IO模型和select、poll與epoll三個重要函數的使用,還有ping、tcpdump、netstat和lsof這四個網絡分析工具的使用。掌握這部分知識,讀者可以自己獨立實現能處理海量請求的TCP server。
第四部分為第9~11章,主要是多綫程、進程和進程間通信相關的知識,包括多綫程的使用、多綫程的同步和重入問題,父子進程、僵屍進程、守護進程和進程間通信的方式。讀者可以配閤《UNIX環境高級編程》一起閱讀。
第五部分是第12章,主要是HTTP協議的介紹與使用、CGI的設計原理與實現和FASTCGI的簡單介紹。掌握這部分知
後颱開發:核心技術與應用實踐 epub pdf mobi txt 電子書 下載 2024
後颱開發:核心技術與應用實踐 下載 epub mobi pdf txt 電子書