第1部分基礎知識
1多核計算概述
1.1多核CPU概述
1.1.1多核計算將成為發展趨勢
1.1.2多核CPU硬件架構介紹
1.1.3多核給程序員帶來的機遇和挑戰
1.2多核編程會遇到那些問題
1.2.1並發性問題
1.2.2CPU饑餓問題
1.2.3任務的分解與調度問題
1.2.4加速比性能問題
1.2.5節能環保問題
1.2.6擴展性問題
1.3多核編程與單核多線程編程的區別
1.3.1鎖競爭導致的串行化的區別
1.3.2線程分解與執行的區別
1.3.3CPU核負載平衡的區別
1.3.4任務調度策略的區別
1.3.5CPUCache存取的區別(偽***享問題)
1.3.6任務優先級搶占的區別
1.3.7串行計算與並行及分布式計算的區別
1.4多核編程與多機分布式編程的區別
1.4.1***享存儲與分布式存儲的區別
1.4.2分布式計算的區別
1.4.3編程環境上的區別
1.5加速比系數
1.5.1阿姆達爾定律
1.5.2Gustafson定律
1.5.3阿姆達爾定律和Gustafson定律的等價性
1.5.4Karp-Flatt度量
1.5.5實際情況中影響加速比系數的因素
1.5.6並行計算開銷情況下的加速比
1.6鎖競爭問題及對加速比的影響
1.6.1線程粒度因子與鎖粒度因子
1.6.2鎖競爭的性能情況
1.6.3集中式鎖競爭中的加速比分析
1.6.4隨機鎖競爭中的加速比分析
1.6.5分布式鎖競爭的加速比分析
1.6.6無鎖編程的加速比分析
1.7負載平衡問題對加速比的影響
1.7.1影響負載平衡的主要因素
1.7.2負載平衡的評價指標
1.7.3負載平衡情況下的加速比
1.8參考文獻
2多線程編程基礎
2.1多線程編程基本概念
2.1.1線程
2.1.2鎖
2.1.3各種系統中常用的鎖操作及信號量操作函數
2.1.4用C++實現鎖的自動釋放
2.1.5原子操作
2.1.6鎖與原子操作的區別
2.1.7有鎖計算、無鎖計算與本地計算的概念
2.2各種鎖性能比較
2.2.1各種鎖在單線程情況下的性能
2.2.2各種鎖在多線程集中式鎖競爭情況下的性能
2.2.3各種鎖在多線程分布式鎖競爭情況下的性能
2.3讀寫鎖算法
2.3.1讀寫鎖概念的引出
2.3.2讀寫鎖算法的分析和實現
2.3.3讀寫鎖的編碼實現
2.4多線程退出算法
2.4.1單個子線程退出算法
2.4.2多個線程訪問***享資源時的退出
2.4.3有鎖的多線程資源釋放退出算法實現
2.4.4無鎖的退出算法
2.4.5多線程退出算法的使用
2.5參考文獻
3OpenMP程序設計
3.1OpenMP基本概念
3.1.1fork/join並行執行模式的概念
3.1.2內存模型
3.1.3性能例子
3.1.4編譯器對OpenMP的支持
3.2OpenMP編程模型
3.2.1OpenMP編譯指導語句格式
3.2.2OpenMP主要命令
3.2.3OpenMP主要子句
3.2.4OpenMP主要庫函數
3.3線程創建與工作分攤
3.3.1parallel命令
3.3.2for和parallelfor命令
3.3.3if子句(條件執行並行)
3.3.4動態設置並行循環的線程數量
3.3.5循環並行化的問題
3.3.6sections和section命令
3.3.7single命令
3.3.8master命令
3.4數據處理
3.4.1private子句
3.4.2firstprivate子句
3.4.3lastprivate子句
3.4.4threadprivate子句
3.4.5shared子句
3.4.6default子句
3.4.7reduction子句
3.4.8copyin子句
3.4.9copyprivate子句
3.5任務調度
3.5.1Schedule子句用法
3.5.2靜態調度(static)
3.5.3動態調度(dynamic)
3.5.4guided調度(guided)
3.5.5runtime調度(rumtime)
3.5.6任務調度與偽***享問題
3.6線程間的同步
3.6.1barrier命令
3.6.2critical命令
3.6.3atomic命令
3.6.4ordered命令和子句
3.6.5nowait子句
3.6.6flush命令
3.7OpenMP庫函數詳解
3.7.1執行環境函數
3.7.2鎖操作函數
3.7.3時間操作函數
3.8OpenMP環境變量
3.8.1OMP_DYNAMIC
3.8.2OMP_NUM_THREADS
3.8.3OMP_NESTED
3.8.4OMP_SCHEDULE
3.9OpenMP內部控制變量及相關流程
3.9.1內部控制變量
3.9.2任務調度流程
3.9.3線程數量決定流程
3.10參考文獻
第2部份基礎數據結構與算法
4數組
4.1棧
4.1.1棧的基本概念
4.1.2棧的編碼實現
4.1.3多線程棧的實現
4.2對數組進行快速排序
4.2.1排序算法介紹
4.2.2串行快速排序基本思想
4.2.3串行快速排序的代碼實現
4.2.4非遞歸的快速排序算法
4.2.5快速排序算法的復雜度分析
4.3對數組進行查找
4.3.1順序查找
4.3.2二分查找
4.4實例:用數組管理壹個HOOK功能
4.4.1單個函數的HOOK實現
4.4.2多個函數的HOOK實現
4.4.3HOOK功能的應用簡介
4.4.4HOOK使用的註意事項
4.5參考文獻
5鏈表
5.1單向鏈表
5.1.1存儲表示
5.1.2接口設計
5.1.3添加節點到鏈表頭部
5.1.4基本功能編碼實現
5.2單向鏈表的排序
5.2.1插入排序
5.2.2歸並插入排序
5.3雙向鏈表
5.3.1雙向鏈表的基本概念
5.3.2雙向鏈表的設計
5.3.3雙向鏈表的操作接口
5.3.4雙向鏈表的編碼實現
5.4鏈表的逐個節點遍歷
5.4.1逐個節點遍歷基本概念
5.4.2逐個節點遍歷編碼實現
5.5多線程遍歷算法
5.5.1多線程鏈表的設計和編碼實現
5.5.2多線程鏈表的4種遍歷方案
5.5.3多個線程同時遍歷的情況
5.6實例:使用鏈表管理短信息系統的CACHE
5.6.1短信息系統的CACHE管理基本概念
5.6.2短信息系統的發送和接收分析
5.6.3短信息系統CACHE管理的編碼實現
6哈希表
6.1哈希表
6.1.1哈希表的基本概念
6.1.2哈希表的索引方法
6.1.3哈希表的沖突解決方法
6.1.4哈希表基本操作的源代碼
6.2哈希鏈表
6.2.1哈希表和數組、鏈表的效率比較
6.2.2時間效率和空間效率的關系
6.2.3哈希鏈表的基本概念
6.2.4哈希鏈表的操作
6.2.5哈希鏈表的編碼實現
6.3實例:WebServer的動態CACHE文件管理
6.3.1WebServer的動態CACHE文件管理基本概念
6.3.2CACHE文件管理功能的設計
6.3.3CACHE文件管理功能的編碼實現
6.4參考文獻
7普通樹與二叉樹
7.1普通樹
7.1.1普通樹的描述方法
7.1.2樹的操作接口設計
7.1.3樹的遍歷算法
7.1.4樹的編碼實現
7.1.5使用樹的遍歷算法來實現Xcopy功能
7.2二叉樹
7.2.1二叉樹的基本概念
7.2.2二叉樹的樹梢及二叉樹的高度
7.2.3二叉樹的描述方法
7.3二叉排序樹
7.3.1二叉排序樹的基本概念
7.3.2二叉排序樹的查找
7.3.3二叉排序樹的插入
7.3.4二叉排序樹的刪除
7.3.5二叉排序樹的遍歷
7.3.6二叉排序樹的旋轉操作
8AVL搜索樹
8.1AVL搜索樹的基本概念
8.2AVL搜索樹的插入
8.2.1插入操作需要考慮的問題
8.2.2不存在不平衡節點的情況分析
8.2.3不平衡A節點的情況分析
8.2.4存在不平衡節點的四種情況分析
8.2.5LL型不平衡情況的調整
8.2.6LR型不平衡情況的調整
8.2.7插入操作的偽代碼描述
8.3AVL搜索樹的刪除
8.3.1A節點的確定
8.3.2幾種不平衡情況的分析
8.3.3L0型調整分析
8.3.4L-1型調整分析
8.3.5L1型調整分析
8.3.6刪除操作的偽代碼描述
8.4負載平衡的AVL樹
8.4.1基本概念的引出
8.4.2插入操作中負載因子的調整
8.4.3刪除操作中負載因子的調整
8.4.4L0和L-1型調整分析
8.4.5L1型調整分析
8.5AVL樹的源代碼
8.5.1數據結構定義
8.5.2創建、釋放、查找等操作
8.5.3旋轉操作函數
8.5.4插入操作函數
8.5.5刪除操作函數
8.6參考文獻
9復合二叉樹
9.1哈希紅黑樹
9.1.1哈希紅黑樹的基本概念
9.1.1哈希紅黑樹的查找
9.1.3哈希紅黑樹的插入
9.1.4哈希紅黑樹的刪除
9.1.5哈希紅黑樹的釋放
9.1.6哈希紅黑樹的遍歷
9.1.7哈希紅黑樹的編碼實現
9.1.8哈希紅黑樹的效率分析
9.2哈希AVL樹
9.2.1哈希AVL樹的基本概念
9.2.2哈希AVL樹的查找
9.2.3哈希AVL樹的插入
9.2.4哈希AVL樹的刪除
9.2.5哈希AVL樹的釋放
9.2.6哈希AVL樹的遍歷
9.2.7哈希AVL樹的編碼實現
9.3復合數據結構的分類
9.4抗DoS/DdoS攻擊的實例
9.4.1DoS/DdoS攻擊的概念
9.4.2常見DoS/DdoS攻擊手段及防範策略
9.4.3抗DoS/DdoS攻擊的實現
9.4.4抗DoS/DdoS攻擊的編碼實現
9.5參考文獻
第3部分並行計算
10並行程序設計模式
10.1基本概念
10.1.1強並行計算與弱並行計算
10.1.2並行程序設計模式的基本思路
10.2模式數據分解模式
10.3分治模式
10.3.1子問題求解時的負載平衡問題
10.3.2子問題的解的合並可能引起的串行化問題
10.4流水線模式
10.5任務並行模式
10.6任務調度模式
10.6.1任務圖調度模式
10.6.2動態任務調度模式
11並行搜索
11.1並行順序搜索
11.1.1並行搜索指定數據
11.1.2並行搜索最大數
11.1.3終止檢測算法
11.2串行Dijkstra最短路徑搜索
11.2.1Dijkstra最短路徑算法的描述
11.2.2Dijkstra最短路徑算法的過程圖解
11.2.3偽代碼描述
11.2.4算法流程圖
11.2.5C/C++代碼實現
11.3並行最短路徑算法
11.3.1Dijkstra算法的並行化
11.3.2並行Dijkstra算法的代碼實現
11.3.3其他並行最短路徑算法的介紹和分析
11.4參考文獻
12並行排序
12.1並行排序概述
12.2冒泡排序
12.2.1串行冒泡排序
12.2.2奇偶排序
12.3快速排序
12.3.1串行快速排序基本思想
12.3.2串行快速排序的代碼實現
12.3.3快速排序並行化方法
12.3.4開源項目mcstl中的並行快速排序
12.3.5基於任務竊取的快速排序
12.4並行歸並排序
12.4.1串行歸並算法
12.4.2Cole並行歸並算法
12.4.3並行快速歸並排序
12.5基數排序
12.5.1串行鏈式基數排序
12.5.2串行數組基數排序
12.5.3壹步到位的分層排序
12.5.4負載平衡的並行基數排序
12.5.5分區的並行基數排序
13並行數值計算
13.1多核並行數值計算面臨的問題
13.1.1Cache的命中率問題
13.1.2偽***享問題
13.2求和及前綴求和
13.3矩陣相加
13.4矩陣相乘
13.4.1基本概念
13.4.2串行算法
13.4.3並行算法
13.5矩陣向量相乘
13.6並行隨機數生成
13.7參考文獻
第4部分***享資源分布式計算
14分布式計算設計模式
14.1基本概念
14.1.1***享資源的計算分解
14.1.2***享資源計算的負載均衡問題
14.1.3***享資源計算的算法設計思路與方法
14.2線程分組競爭模式
14.2.1標準的線程分組競爭模式
14.2.2線程分組競爭模式的變種
14.3線程隨機競爭模式
14.3.1基本概念
14.3.2加速比性能的保證
14.4數據本地化模式
14.4.1取得比單核多線程更好的性能
14.4.2數據本地化模式
14.4.3優缺點分析
14.5分布式數據結構設計
14.5.1復合數據結構設計方法
14.5.2分布式數據結構設計
14.5.3分布式數據結構主要問題
14.6參考文獻
15分布式隊列
15.1串行隊列
15.1.1簡單環形隊列
15.1.2STL中的Deque
15.1.3動態環形隊列
15.2隊列池
15.2.1***享隊列
15.2.2消息隊列
15.2.3隊列池
15.2.4隊列池的幾種實現方案
15.2.5隊列池的使用實例
15.3帶本地計算的分布式隊列
15.3.1基本思想
15.3.2本地化隊列的實現
15.3.3任務偷取隊列的實現
15.3.4分布式隊列的實現
15.3.5線程池CThreadPool的實現
15.3.6線程池CThreadPool的代碼實現
15.3.7CDistributedQueue源代碼
15.3.8CDistributedQueue的使用實例
16分布式查找
16.1多核中查找的問題與主要思路
16.2靜態負載平衡的二級查找結構設計
16.2.1二級查找結構設計
16.2.2分布式哈希AVL樹
16.2.3分布式順序AVL樹
16.3動態負載平衡的多級查找結構設計
16.3.1分布式查找中的負載平衡問題
16.3.2多級查找結構設計方法
16.3.3多級查找表的查找算法
16.3.4多級查找表的插入操作算法
16.3.5多級查找表的刪除操作算法
16.3.6多級順序表
16.3.7多級索引AVL樹
16.3.8分布式哈希多級AVL樹
16.3.9分布式順序多級AVL樹
16.4多核環境中查找算法的選用方法
16.5動態WebCache設計實例
17分布式內存管理
17.1多核內存管理的基本思想
17.1.1內存管理方面的需求
17.1.2多核系統中的內存管理思路
17.2等尺寸內存管理
17.2.1Freelist內存管理基本概念
17.2.2Freelist編碼實現
17.2.3FreeLists內存管理
17.3Intel開源項目TBB中的內存管理
17.3.1偽***享問題
17.3.2Cache對齊的內存管理
17.3.3數據結構
17.3.4將內存管理器映射到線程
17.3.5分配和釋放算法
17.3.6線程退出時的內存回收
17.4搶奪式內存管理算法
17.4.1算法基本思想
17.4.2碎片重組回收利用技術
17.4.3搶奪式算法的詳細算法流程
17.4.4代碼實現
17.5偽***享問題的深入分析
17.5.1內存釋放時的偽***享問題
17.5.2偽***享問題的概率分析
17.5.3用戶程序使用內存過程中的偽***享問題
17.5.4分布式內存管理的進壹步改進措施
17.6參考文獻
第5部分任務分解與調度
18任務圖分解與調度
18.1任務分解與調度的問題
18.1.1使用OpenMP調度的問題
18.1.2任務圖調度模型
18.1.3任務圖調度算法簡介
18.2任務組調度算法
18.2.1基本思路
18.2.2任務組調度算法
18.2.3算法流程圖
18.2.4數據結構與接口設計
18.2.5代碼實現
18.2.6任務組調度的應用分析
18.2.7誤差下降調度算法
18.3任務圖調度算法
18.3.1任務圖的分層算法
18.3.2分層算法過程圖解
18.3.3數據結構和接口設計
18.3.4分層算法的代碼實現
18.3.5任務調度器的代碼實現
18.3.6實例:任務圖調度器的使用
18.4手工任務分解的原則和方法
18.4.1任務間負載均衡的影響因素
18.4.2任務分解原則和方法
18.5參考文獻
19動態任務分解與調度
19.1動態任務分解的兩種類型
19.2非嵌套型動態任務調度
19.2.1網絡服務器軟件中的任務調度
19.2.2使用分布式隊列的調度方法
19.2.3CTaskScheduler的設計
19.2.4CTaskScheduler的代碼實現
19.3嵌套型動態任務調度
19.3.1基本思想
19.3.2CNestTaskScheduler的設計
19.3.3CNestTaskScheduler的代碼實現
19.3.4CNestTaskScheduler使用方法
19.4實例:用任務調度器實現parallel_for
19.4.1parallel_for的實現
19.4.2用parallel_for進行並行快速排序
19.4.3用parallel_for進行並行歸並
19.5參考文獻
20Lock-Free編程基礎
20.1Lock-Free編程基本概念和問題
20.1.1CAS原子操作
20.1.2ABA問題
20.1.3ABA問題的解決方法
20.1.4內存刪除問題
20.1.5數據競爭問題
20.2Lock-Free的隊列
20.2.1無鎖隊列的鏈式實現方法
20.2.2串行實現方法
20.2.3出隊操作的Lock-Free實現
20.2.4進隊操作的Lock-Free實現
20.2.5CLockFreeQueue的實現代碼
20.3Lock-Free程序的問題分析
20.4參考文獻
附錄1本書代碼和CAPI開源項目源文件對照表
附錄2多核編程的四層境界