從工程師到系統架構師之路(用muduo C++開發網路多執行緒應用程式) | 拾書所

從工程師到系統架構師之路(用muduo C++開發網路多執行緒應用程式)

$ 531 元 原價 590
內容簡介


本書專注於簡單容易了解的程式碼,以及最接近C語言的語法,並且大量應用多執行緒的思路,開發出來的非阻塞式(Non-blocking)網路程式庫,比同級產品快了20%,程式碼卻少了50%,充份展現C++的小而美且快。除了C++之外,本書亦充份介紹目前Scale out網路架構的概念,讓你不但可快速學會C++的網路開發,更可了解目前最新的雲端趨勢。
想學好C++就從全球第一個華人開發的頂級C++網路程式庫Muduo開始。本書主要說明採用現代C++ 在x86-64 Linux 上撰寫多執行緒TCP 網路服務程式的主流標準技術,重點說明多執行緒網路服務器的一種IO 模型,即one loopper thread。這是一種適應性強的模型,也是Linux 下以native 語言撰寫使用者態高性能網路程式最成熟的模式,熟練之後可順利地開發各種常見的服務端網路應用程式。本書以muduo 網路函數庫為例,說明這種程式設計模型的使用方法及注意事項。
C++學習時間長,一旦上手,開發出程式碼的超高速度是Java、C#等其它語言無法比較的。

作者簡介


陳碩,北京師範大學碩士,擅長C++多執行緒網路程式設計和即時分散式系統架構。曾在摩根史丹利IT部門工作5年,從事即時外匯交易系統開發。現在在美國加州矽谷某互聯網大公司工作,從事大規模分散式系統的可靠性工程。

內容目錄


第1 部分 C++ 多執行緒系統程式設計
Chapter 01 符合執行緒安全的物件生命期管理
1.1 當解構函數遇到多執行緒
1.1.1 符合執行緒安全的定義
1.1.2 MutexLock 與 MutexLockGuard
1.1.3 一個符合執行緒安全的 Counter 範例
1.2 物件的建立很簡單
1.3 銷毀太難
1.3.1 mutex 不是辦法
1.3.2 作為資料成員的 mutex 不能保護解構
1.4 符合執行緒安全的 Observer 有多難
1.5 原始指標有何不妥
1.6 神器 shared_ptr/weak_ptr
1.7 插曲:系統地避免各種指標錯誤
1.8 應用到 Observer 上
1.9 再論 shared_ptr 的符合執行緒安全
1.10 shared_ptr 技術與陷阱
1.11 物件集區
1.11.1 enable_shared_from_this
1.11.2 弱回呼
1.12 替代方案
1.13 心得與小結
1.14 Observer 之謬
Chapter 02 執行緒同步精要
2.1 互斥器(mutex)
2.1.1 只使用非遞迴的 mutex
2.1.2 鎖死
2.2 條件變數(condition variable)
2.3 不要用讀寫鎖和號誌
2.4 封裝 MutexLock、MutexLockGuard、Condition
2.5 符合執行緒安全的 Singleton 實現
2.6 sleep(3) 不是同步基本操作
2.7 歸納與總結
2.8 借 shared_ptr 實現copy-on-write
Chapter 02 多執行緒伺服器的適用場合與常用程式設計模型
3.1 處理程序與執行緒
3.2 單執行緒伺服器的常用程式設計模型
3.3 多執行緒伺服器的常用程式設計模型
3.3.1 one loop per thread
3.3.2 執行緒池
3.3.3 推薦模式
3.4 處理程序間通訊只用TCP
3.5 多執行緒伺服器的適用場合
3.5.1 必須用單執行緒的場合
3.5.2 單執行緒程式的優缺點
3.5.3 適用多執行緒程式的場景
3.6 「多執行緒伺服器的適用場合」例釋與答疑
Chapter 04 C++ 多執行緒系統程式設計精要
4.1 基本執行緒基本操作的選用
4.2 C/C++系統函數庫的符合執行緒安全性
4.3 Linux 上的執行緒標識
4.4 執行緒的建立與銷毀的守則
4.4.1 pthread_cancel 與C++
4.4.2 exit(3) 在C++ 中不是符合執行緒安全的
4.5 善用__thread 關鍵字
4.6 多執行緒與IO
4.7 用RAII 包裝檔案描述符號
4.8 RAII 與fork()
4.9 多執行緒與fork()
4.10 多執行緒與signal
4.11 Linux 新增系統呼叫的啟示
Chapter 05 高效的多執行緒記錄檔
5.1 功能需求
5.2 效能需求
5.3 多執行緒非同步記錄檔
5.4 其他方案
第2 部分 muduo 網路函數庫
Chapter 06 muduo 網路函數庫簡介
6.1 由來
6.2 安裝
6.3 目錄結構
6.3.1 程式結構
6.3.2 實例
6.3.3 執行緒模型
6.4 使用教學
6.4.1 TCP 網路程式設計本質論
6.4.2 echo 服務的實現
6.4.3 七步實現finger 服務
6.5 效能評測
6.5.1 muduo 與 Boost.Asio、libevent2 的輸送量比較
6.5.2 比較 muduo 與 libevent2 的事件處理效率
6.5.3 muduo 與 Nginx 的輸送量比較
6.5.4 muduo 與 ZeroMQ 的延遲比較
6.6 詳解muduo 多執行緒模型
6.6.1 數獨求解伺服器
6.6.2 常見的平行處理網路服務程式設計方案
Chapter 07 muduo 程式設計範例
7.1 五個簡單TCP 範例
7.2 檔案傳輸
7.3 Boost.Asio 的聊天伺服器
7.3.1 TCP 分派封包
7.3.2 訊息格式
7.3.3 轉碼器 LengthHeaderCodec
7.3.4 服務端的實現
7.3.5 用戶端的實現
7.4 muduo Buffer 類別的設計與使用
7.4.1 muduo 的 IO 模型
7.4.2 為什麼 non-blocking 網路程式設計中應用層 buffer 是必需的
7.4.3 Buffer 的功能需求
7.4.4 Buffer 的資料結構
7.4.5 Buffer 的操作
7.4.6 其他設計方案
7.4.7 效能是不是問題
7.5 一種自動反射訊息類型的Protobuf 網路傳輸方案
7.5.1 網路程式設計中使用 Protobuf 的兩個先決條件
7.5.2 根據 type name 反射自動建立 Message 物件
7.5.3 Protobuf 傳輸格式
7.6 在muduo 中實現Protobuf 轉碼器與訊息分發器
7.6.1 什麼是轉碼器(codec)
7.6.2 實現 ProtobufCodec
7.6.3 訊息分發器(dispatcher)有什麼用
7.6.4 ProtobufCodec 與 ProtobufDispatcher 的綜合運用
7.6.5 ProtobufDispatcher 的兩種實現
7.6.6 ProtobufCodec 和 ProtobufDispatcher 有何意義
7.7 限制伺服器的最大平行處理連接數
7.7.1 為什麼要限制平行處理連接數
7.7.2 在 muduo 中限制平行處理連接數
7.8 計時器
7.8.1 程式中的時間
7.8.2 Linux 時間函數
7.8.3 muduo 的計時器介面
7.8.4 Boost.Asio Timer 範例
7.8.5 Java Netty 範例
7.9 測量兩台機器的網路延遲和時間差
7.10 用timing wheel 踢掉空閒連接
7.10.1 timing wheel 原理
7.10.2 程式實現與改進
7.11 簡單的訊息廣播服務
7.12 「串並轉換」連接伺服器及其自動化測試
7.13 socks4a 代理伺服器
7.13.1 TCP 中繼器
7.13.2 socks4a 代理伺服器
7.13.3 N:1 與 1:N 連接轉發
7.14 短網址服務
7.15 與其他函數庫整合
7.15.1 UDNS
7.15.2 c-ares DNS
7.15.3 curl
7.15.4 更多
Chapter 08 muduo 網路函數庫設計與實現
8.0 什麼都不做的EventLoop
8.1 Reactor 的關鍵結構
8.1.1 Channel class
8.1.2 Poller class
8.1.3 EventLoop 的改動
8.2 TimerQueue 計時器
8.2.1 TimerQueue class
8.2.2 EventLoop 的改動
8.3 EventLoop::runInLoop() 函數
8.3.1 加強 TimerQueue 的符合執行緒安全性
8.3.2 EventLoopThread class
8.4 實現TCP 網路函數庫
8.5 TcpServer 接受新連接
8.5.1 TcpServer class
8.5.2 TcpConnection class
8.6 TcpConnection 中斷連接
8.7 Buffer 讀取資料
8.7.1 TcpConnection 使用 Buffer 作為輸入緩衝
8.7.2 Buffer::readFd()
8.8 TcpConnection 發送資料
8.9 增強TcpConnection
8.9.1 SIGPIPE
8.9.2 TCP No Delay 和 TCP keepalive
8.9.3 WriteCompleteCallback 和 HighWaterMarkCallback
8.10 多執行緒TcpServer
8.11 Connector
8.12 TcpClient
8.13 epoll
8.14 測試程式一覽
第3 部分 專案實作經驗談
Chapter 09 分散式系統專案實作
9.1 我們在技術浪潮中的位置
9.1.1 分散式系統的本質困難
9.1.2 分散式系統是個險惡的問題
9.2 分散式系統的可用性淺說
9.2.1 分散式系統的軟體不要求 7×24 可靠
9.2.2 「能隨時重新啟動處理程序」作為程式設計目標
9.3 分散式系統中心跳協定的設計
9.4 分散式系統中的處理程序標識
9.4.1 錯誤做法
9.4.2 正確做法
9.4.3 TCP 協定的啟示
9.5 建構易於維護的分散式程式
9.6 為系統演化做準備
9.6.1 可擴充的訊息格式
9.6.2 反面教材:ICE 的訊息包裝格式
9.7 分散式程式的自動化回歸測試
9.7.1 單元測試的能與不能
9.7.2 分散式系統測試的要點
9.7.3 分散式系統的抽象觀點
9.7.4 一種自動化的回歸測試方案
9.7.5 其他用處
9.8 分散式系統部署、監控與處理程序管理的幾重境界
9.8.1 境界1:全手動操作
9.8.2 境界2:使用零散的自動化指令稿和協力廠商元件
9.8.3 境界3:自製機群管理系統,集中化設定
9.8.4 境界4:機群管理與 naming service 結合
Chapter 10 C++ 編譯連結模型精要
10.1 C 語言的編譯模型及其成因
10.1.1 為什麼C 語言需要前置處理
10.1.2 C 語言的編譯模型
10.2 C++的編譯模型
10.2.1 單遍編譯

Brand Slider