您找過以下的關鍵字

尚無搜尋紀錄

前言

本書主要說明採用現代C++ 在x86-64 Linux 上撰寫多執行緒TCP 網路服務程式的主流標準技術,這也是我對過去5 年撰寫生產環境下的多執行緒服務端程式的經驗歸納。本書重點說明多執行緒網路服務器的一種IO 模型,即one loopper thread。這是一種適應性強的模型,也是Linux 下以native 語言撰寫使用者態高性能網路程式最成熟的模式,熟練之後可順利地開發各種常見的服務端網路應用程式。本書以muduo 網路函數庫為例,說明這種程式設計模型的使用方法及注意事項。

muduo 是一個以非阻塞IO 和事件驅動為基礎的現代C++ 網路函數庫,原生支援one loop per thread 這種IO 模型。muduo 適合開發Linux 下的針對業務的多執行緒服務端網路應用程式,其中「針對業務的網路程式設計」的定義見附錄A。「現代C++」指的不是C++11 新標準,而是2005 年TR1 發佈之後的C++ 語言和函數庫。與傳統C++ 相比,現代C++ 的變化主要有兩方面:資源管理(見第 1 章)與事件回呼(見第11-24 頁)。

本書不是多執行緒程式設計教學,也不是網路程式設計教學,更不是C++ 教學。讀者應該已經大致讀過《現代作業系統》、《UNIX 環境進階程式設計》、《UNIX 網路程式設計》、《C++ Primer》或與之內容相近的書籍,熟悉基本概念,並熟練 Pthreads 和 Sockets API 的正常用法。本書基本不談C++11,因為目前主流的Linux 服務端發行版本的g++ 版本都還停留在4.4,C++11 進入實用尚需一段時日。

本書適用的硬體環境是主流 x86-64 伺服器,多路多核心CPU、幾十GB 記憶體、GB 乙太網互連。除了第 5 章講診斷記錄檔之外,本書不涉及檔案IO。

本書分為四大部分,第1 部分「C++ 多執行緒系統程式設計」檢查多執行緒下的物件生命期管理、執行緒同步方法、多執行緒與C++ 的結合、高效的多執行緒記錄檔等。第2 部分「muduo 網路函數庫」介紹使用現成的非阻塞網路函數庫撰寫網路應用程式的方法,以及 muduo 的設計與實現。第3 部分「專案實作經驗談」介紹分散式系統的專案化開發方法和C++ 在專案實作中的功能特性取捨。第4 部分「附錄」分享網路程式設計和C++ 語言的學習經驗。

本書的宗旨是貴精不貴多。熟練兩種基本的同步基本操作就可以滿足各種多執行緒同步的功能需求,還能寫出更好用的同步設施。熟練一種處理程序間通訊方式和一種多執行緒網路程式設計模型就足以應對日常開發工作,撰寫執行於公司內網環境的分散式服務系統。(本書不涉及分散式儲存系統,也不涉及UDP。)

術語與排版範例

本書大量使用英文術語,甚至有少量英文引用。設計模式的名字一律用英文, 例如Observer、Reactor、Singleton。在中文術語不夠突出時, 也會使用英文, 例如class、heap、event loop、STL algorithm 等。注意幾個中文C++ 術語:物件實體(instance)、函數多載決議(resolution)、樣板實例化(instantiation)、覆載(override)虛擬函數、反參考(dereference)指標。本書中的英文可數名詞一般不用複數形式,例如兩個 class,6 個 syscall;但有時會用(s) 強調中文名詞是複數。fd 是檔案描述符號(file descriptor)的縮寫。「CPU 數目」一般指的是核心(core)的數目。容量單位kB、MB、GB 表示的位元組數分別為103、106、109,在特別強調準確數值時,會分別用 KiB、MiB、GiB 表示210、220、230 位元組。用諸如 §11.5 表示本書第 11.5 節,第42 行 表示上下文中出現的第 42 行程式。[JCP]、[CC2e] 等是參考文獻,見書末清單。

程式

本書的範例程式以開放原始碼專案的形式發佈在GitHub 上,網址是 http://github.com/ chenshuo/recipes/ 和 http://github.com/chenshuo/muduo/。本書搭配頁面提供全部原始程式碼包裝下載,正文中出現的類似 recipes/thread 的路徑是壓縮檔內的相對路徑,讀者不難找到其對應的GitHub URL。本書參考程式的形式如下,左側數字是檔案的行號,右側的「muduo/base/Types.h」是檔案路

徑1。例如下面這幾行程式是 muduo::string 的 typedef。

15 namespace muduo

16 {

17

18 #ifdef MUDUO_STD_STRING

19 using std::string;

20 #else // !MUDUO_STD_STRING

21 typedef __gnu_cxx::__sso_string string;

22 #endif

本書假設讀者熟悉diff -u 指令的輸出格式,用於表示程式的改動。

本書正文中出現的程式有時為了照顧排版而略有改寫,例如改變縮排規則,去掉單行條件陳述式前後的大括號等。就程式設計風格而論,應以原始程式碼中的程式為準。

作者聯繫方式

電子郵件:giantchen@gmail.com

主頁:http://chenshuo.com/book (包含勘誤表和URL 清單)

微博:http://weibo.com/giantchen

部落格:http://blog.csdn.net/Solstice

程式:http://github.com/chenshuo

豆瓣:http://book.douban.com/subject/20471211