買這商品的人也買了...
-
Debug Hacks 除錯駭客 -- 極致除錯的技巧與工具$580$458 -
$294Python 數據分析基礎教程-NumPy 學習指南, 2/e (NumPy Beginner's Guide, 2/e) -
C++ 並行程式設計實戰手冊 (C++ Concurrency in Action: Practical Multithreading)$680$537 -
精通 Linux 內核網絡 (Linux Kernel Networking: Implementation and Theory)$594$564 -
$330程序員面試寶典, 5/e -
有趣的二進制 (軟件安全與逆向分析)$234$222 -
$234自製搜尋引擎 -
$458C語言接口與實現 創建可重用軟件的技術 -
$414實戰 Java 高並發程序設計 -
Kubernetes 使用指南$490$387 -
Vim 實用技巧, 2/e (Practical Vim : Edit Text at the Speed of Thought, 2/e)$354$336 -
$594HTTPS 權威指南:在服務器和 Web 應用上部署 SSL/TLS 和 PKI -
$414Linux 性能優化 (Optimizing Linux Performance: A Hands-On Guide to Linux Performance Tools) -
$450視覺 SLAM 十四講:從理論到實踐 -
王者歸來:和大師一起動手--撰寫一個完整的作業系統$860$731 -
寫程式前就該懂的演算法 ─ 資料分析與程式設計人員必學的邏輯思考術 (Grokking Algorithms: An illustrated guide for programmers and other curious people)$390$195 -
$177Java 多線程編程實戰指南 (設計模式篇) -
概率機器人 (Probabilistic robotics)$594$564 -
$805奔跑吧 Linux 內核 -
$294基於免疫計算的機器學習方法及應用 -
$330自己動手寫神經網絡 -
單元測試的藝術, 2/e (The Art of Unit Testing: with examples in C#, 2/e)$650$507 -
R 資料科學 (R for Data Science)$780$616 -
$354Linux 二進制分析 -
R 錦囊妙計, 2/e (R Cookbook, 2/e)$880$695
商品描述
本書首先以霍金提出的兩個理論物理限制為引子,解釋了多核並行計算興起的原因,並從硬件的角度闡述並行編程的難題。接著,本書以常見的計數器為例,探討其不同的實現方法及適用場景。在這些實現方法中,除了介紹常見的鎖以外,本書還重點介紹了RCU的使用及其原理,以及實現RCU的基礎:內存屏障。最後,本書還介紹了並行軟件的驗證,以及並行實時計算等內容。本書適合於對並行編程有興趣的大學生、研究生,以及需要對項目進行深度性能優化的軟硬件工程師,特別值得一提的是,本書對操作系統內核工程師也很有價值。
作者簡介
作者:(美)Paul E.Mckenney (保羅·E·麥肯尼)譯者:謝寶友
Paul是IBM Linux技術中心的傑出工程師,目前專註於高性能、可擴放性、實時響應和能源效率的挑戰,在無線電和因特網協議、系統管理、商務應用和實時系統方面有頗多成績。
謝寶友,畢業於四川省稅務學校稅收專業,現供職於中興微電子操作系統團隊,對操作系統內核有較強的興趣。專職於操作系統內核已經有八年時間。目標是利用十年時間,成為一名真正的“內核菜鳥”。個人主頁是http://xiebaoyou.blog.chinaunix.net。魯陽,2009年畢業於成都電子科技大學,曾供職於中興通訊操作系統部門和騰訊移動瀏覽器部門,後赴美留學,目前供職於分佈式內存數據庫(distributedin-memorydatabase)公司VoltDB。8年時間從系統內核做到上層應用,目標是做一名真正的“全棧工程師”。
目錄大綱
目錄
第1章如何使用本書1
1.1路線圖1
1.2小問題2
1.3除本書之外的選擇3
1.4示例源代碼4
1.5這本書屬於誰4
第2章簡介6
2.1導致並行編程困難的歷史原因6
2.2並行編程的目標7
2.2.1性能8
2.2.2生產率9
2.2.3通用性9
2.3並行編程的替代方案11
2.3.1串行應用的多個實例11
2.3.2使用現有的並行軟件11
2.3.3性能優化12
2.4是什麼使並行編程變得複雜12
2.4.1分割任務13
2.4.2並行訪問控制13
2.4.3資源分割和復制14
2.4.4與硬件的交互14
2.4.5組合使用14
2.4.6語言和環境如何支持這些任務14
2.5本章的討論15
第3章硬件和它的習慣16
3.1概述16
3.1.1流水線CPU 16
3.1.2內存引用17
3.1.3原子操作18
3.1 .4內存屏障19
3.1.5高速緩存未命中19
3.1.6 I/O操作19
3.2開銷20
3.2.1硬件體系結構20
3.2.2操作的開銷21
3.3硬件的免費午餐23
3.3.1 3D集成23
3.3.2新材料和新工藝24
3.3.3是光,不是電子24
3.3.4專用加 器24
3.3.5現有的並行軟件25
3.4對軟件設計的啟示25
第4章辦事的傢夥27
4.1腳本語言27
4.2 POSIX多進程28
4.2.1 POSIX進程創建和銷毀28
4.2.2 POSIX線程創建和銷毀30
4.2.3 POSIX鎖31
4.2.4 POSIX讀/寫鎖34
4.3原子操作37
4.4 Linux內核中類似POSIX的操作38
4.5如何選擇趁手的工具39
第5章計數40
5.1為什麼並發計數不可小看41
5.2統計計數器42
5.2.1設計43
5.2.2基於數組的實現43
5.2.3最終結果一致的實現44
5.2.4基於每線程變量的實現46
5.2.5本節討論48
5.3近似上限計數器48
5.3. 1設計48
5.3.2簡單的上限計數實現50
5.3.3關於簡單上限計數的討論55
5.3.4近似上限計數器的實現55
5.3.5關於近似上限計數器的討論55
5.4精確上限計數56
5.4.1原子上限計數的實現56
5.4.2關於原子上限計數的討論62
5.4.3 Signal-Theft上限計數的設計62
5.4.4 Signal-Theft上限計數的實現63
5.4.5關於Signal-Theft上限計數的討論68
5.5 殊場合的並行計數68
5.6關於並行計數的討論69
5.6.1並行計數的性能70
5.6.2並行計數的專門化71
5.6.3從並行計數中學到什麼71
第6章對分割和同步的設計73
6.1分割練習73
6.1.1哲學家就餐問題73
6.1.2雙端隊列75
6.1.3關於分割問題示例的討論81
6.2設計準則82
6.3同步粒度83
6.3.1串行程序84
6.3.2代碼鎖85
6.3.3數據鎖86
6.3.4數據所有權88
6.3.5鎖粒度與性能88
6.4並行快速路徑90
6.4.1讀/寫鎖91
6.4.2層次鎖91
6.4.3資源分配器緩存92
6.5分割之外97
6.5.1使用工作隊列的迷宮問題並行解法97
6.5.2另一種迷宮問題的並行解法100
6.5.3性能比較I 102
6.5.4另一種迷宮問題的串行解法104
6.5.5性能比較II 104
6.5.6未來展望與本節總結105
6.6分割、並行化與優化106
第7章鎖107
7.1努力活著108
7.1.1死鎖108
7.1.2活鎖與飢餓114
7.1.3不公平的鎖116
7.1.4低效率的鎖117
7.2鎖的類型117
7.2.1互斥鎖117
7.2.2讀/寫鎖118
7.2.3讀/寫鎖之外118
7.2.4範圍鎖119
7.3鎖在實現中的問題121
7.3.1基於原子交換的互斥鎖實現示例121
7.3.2互斥鎖的其他實現122
7.4基於鎖的存在保證124
7.5鎖:是英雄還是惡棍125
7.5.1應用程序中的鎖:英雄125
7.5.2並行庫中的鎖:只是一個工具126
7.5.3並行化串行庫時的鎖:惡棍128
7.6總結130
第8章數據所有權131
8.1多進程131
8.2部分數據所有權和pthread線程庫132
8.3函數輸送132
8.4指派線程132
8.5私有化133
8.6數據所有權的其他用途133
第9章延後處理134
9.1引用計數134
9.1.1各種引用計數的實現135
9.1.2危險指針140
9.1.3支持引用計數的Linux原語141
9.1.4計數優化142
9.2順序鎖142
9.3讀-複製-修改(RCU) 145
9.3.1 RCU介紹145
9.3.2 RCU基礎147
9.3.3 RCU用法155
9.3.4 Linux內核中的RCU API 166
9.3.5 “玩具式”的RCU實現171
9.3.6 RCU練習188
9.4如何選擇188
9.5更新端怎麼辦190
第10 數據結構191
10.1從例子入手191
10.2可分割的數據結構192
10.2.1哈希表的設計192
10.2.2哈希表的實現192
10.2.3哈希表的性能195
10.3讀側重的數據結構197
10.3 .1受RCU保護的哈希表的實現197
10.3.2受RCU保護的哈希表的性能199
10.3.3對受RCU保護的哈希表的討論201
10.4不可分割的數據結構201
10.4.1可擴展哈希表的設計202
10.4.2可擴展哈希表的實現203
10.4.3可擴展哈希表的討論210
10.4.4其他可擴展的哈希表211
10.5其他數據結構214
10.6微優化214
10.6 .1實例化215
10.6.2比特與字節215
10.6.3硬件層面的考慮216
10.7總結217
第11章驗證218
11.1簡介218
11.1.1 BUG來自於何處218
11.1.2所需的心態220
11.1 .3應該何時開始驗證221
11.1.4開源之路221
11.2跟蹤222
11.3斷言223
11.4靜態分析224
11.5代碼走查224
11.5.1審查224
11.5.2走查225
11.5.3自查225
11.6機率及海森堡BUG 227
11.6.1離散測試統計228
11.6.2濫用離 散測試統計229
11.6.3持續測試統計229
11.6.4定位海森堡BUG 232
11.7性能評估235
11.7.1性能基準236
11.7.2剖析236
11.7.3差分分析237
11.7.4微基準237
11.7.5隔離237
11.7.6檢測乾擾238
11.8總結242
第12章形式驗證244
12.1通用目的的狀態空間搜索244
12.1.1 Promela和Spin 244
12.1.2如何使用Promela 249
12.1.3 Promela示例:鎖251
12.1.4 Promela示例: QRCU 254
12.1.5 Promela初試牛刀:dynticks和可搶占RCU 260
12.1.6驗證可搶占RCU和dynticks 264
12.2特定目的的狀態空間搜索288
12.2.1解析Litmus測試289
12.2.2 Litmus測試意味著什麼290
12.2.3運行Litmus測試291
12.2.4 PPCMEM討論292
12.3公理方法293
12.4 SAT求解器294
12.5總結295
第13章綜合應用296
13.1計數難題296
13.1.1對更新進行計數296
13.1.2對查找進行計數296
13.2使用RCU拯救並行軟件性能297
13.2.1 RCU和基於每CPU變量的統計計數297
13.2.2 RCU及可插拔I/O設備的計數器300
13.2.3數組及 長度300
13.2.4相關聯的字段301
13.3散列難題302
13.3.1相關聯的數據元素302
13.3.2更新友好的哈希表遍歷303
第14章高級同步304
14.1避免鎖304
14.2內存屏障304
14.2 .1內存序及內存屏障305
14.2.2如果B在A後面,並且C在B後面,為什麼C不在A後面306
14.2.3變量可以擁有多個值
