原文的下载地址:http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html
中文版下载地址:深入理解并行编程V1.0 (4.1M)

本书是linux内核大牛paul的力作,和鲁阳同学一起,花了两个月时间进行翻译。
目前没有翻译问答部分,主要是时间不够,也担心不能将这部分翻译准确。
对内核深度发烧的同学可以看看。

本书目录

1. 简介…………………………………………………………………………………………… 14

1.1. 导致并行编程困难的历史原因……………………………………………… 14

1.2. 并行编程的目标…………………………………………………………………… 15

1.2.1. 性能………………………………………………………………………………. 16

1.2.2. 生产率…………………………………………………………………………… 17

1.2.3. 通用性…………………………………………………………………………… 18

1.3. 并行编程的替代方案……………………………………………………………. 20

1.3.1. 顺序应用多实例化…………………………………………………………. 20

1.3.2.使用现有的并行软件……………………………………………………… 21

1.3.3. 性能优化……………………………………………………………………….. 21

1.4. 是什么使并行编程变得复杂?……………………………………………… 22

1.4.1. 工作分割……………………………………………………………………….. 22

1.4.2. 并行访问控制………………………………………………………………… 23

1.4.3. 资源分割和复制…………………………………………………………….. 24

1.4.4. 与硬件交互……………………………………………………………………. 24

1.4.5. 组合使用……………………………………………………………………….. 24

1.4.6. 语言和环境如何对这样的任务进行支持?……………………… 25

1.5. 本书导读……………………………………………………………………………… 25

1.5.1. 小问题…………………………………………………………………………… 25

1.5.2. 随书源码……………………………………………………………………….. 26

2. 硬件的习性………………………………………………………………………………… 28

2.1. 概述…………………………………………………………………………………….. 28

2.1.1. CPU流水线 …………………………………………………………………… 29

2.1.2. 内存引用……………………………………………………………………….. 30

2.1.3. 原子操作……………………………………………………………………….. 31

2.1.4. 内存屏障……………………………………………………………………….. 32

2.1.5. Cache Miss …………………………………………………………………….. 33

2.1.6. I/O操作 ………………………………………………………………………… 34

2.2. 开销…………………………………………………………………………………….. 35

2.2.1. 硬件体系结构………………………………………………………………… 36

2.2.2. 操作的开销……………………………………………………………………. 37

2.3. 硬件的免费午餐? …………………………………………………………………. 38

2.3.1. 3D集成 …………………………………………………………………………. 39

2.3.2. 新材料和新工艺…………………………………………………………….. 39

2.3.3. 专用加速器……………………………………………………………………. 39

2.3.4. 现有的并行软件…………………………………………………………….. 40

2.4. 软件设计Implication ……………………………………………………………. 40

3. 工具…………………………………………………………………………………………… 43

3.1. 脚本语言……………………………………………………………………………… 43

3.2. POSIX多进程 ……………………………………………………………………… 44

3.2.1. POSIX进程创建和撤销 …………………………………………………. 44

3.2.2. POSIX线程的创建和撤销 ……………………………………………… 46

3.2.3. POSIX锁 ………………………………………………………………………. 48

3.2.4. POSIX读写锁 ……………………………………………………………….. 52

3.3. 原子操作……………………………………………………………………………… 55

3.4. Linux内核中类似POSIX的操作 …………………………………………. 56

3.5. 趁手的工具——该如何选择?……………………………………………… 58

4. 计数…………………………………………………………………………………………… 59

4.1. 为什么并发计数不可小看?…………………………………………………. 60

4.2. 统计计数器………………………………………………………………………….. 62

4.2.1. 设计………………………………………………………………………………. 62

4.2.2. 基于数组的实现…………………………………………………………….. 62

4.2.3. 结果一致的实现…………………………………………………………….. 64

4.2.4. 基于每线程变量的实现………………………………………………….. 66

4.2.5. 讨论………………………………………………………………………………. 69

4.3. 近似上限计数器…………………………………………………………………… 69

4.3.1. 设计………………………………………………………………………………. 69

4.3.2. 简单的上限计数器实现………………………………………………….. 70

4.3.3. 关于简单上限计数器的讨论…………………………………………… 76

4.3.4. 近似上限计数器的实现………………………………………………….. 76

4.3.5. 关于近似上限计数器的讨论…………………………………………… 77

4.4. 精确上限计数器…………………………………………………………………… 77

4.4.1. 原子上限计数器的实现………………………………………………….. 77

4.4.2. 关于原子上限计数器的讨论…………………………………………… 86

4.4.3. Signal-Theft上限计数器的设计 ……………………………………… 86

4.4.4. Signal-Theft上限计数器的实现 ……………………………………… 87

4.4.5. Signal-Theft上限计数器讨论 …………………………………………. 94

4.5. 特殊的并行计数器……………………………………………………………….. 95

4.6. 并行计数的讨论…………………………………………………………………… 96

5. 分割和同步设计……………………………………………………………………….. 100

5.1. 分割练习……………………………………………………………………………. 100

5.1.1. 哲学家就餐问题…………………………………………………………… 100

5.1.2. 双端队列……………………………………………………………………… 102

5.1.3. 关于分割问题示例的讨论…………………………………………….. 111

5.2. 设计准则……………………………………………………………………………. 111

5.3. 同步粒度……………………………………………………………………………. 113

5.3.1. 串行程序……………………………………………………………………… 114

5.3.2. 代码锁…………………………………………………………………………. 116

5.3.3. 数据锁…………………………………………………………………………. 117

5.3.4. 数据所有权………………………………………………………………….. 120

5.3.5. 锁粒度与性能………………………………………………………………. 121

5.4. 并行快速路径…………………………………………………………………….. 121

5.4.1. 读写锁…………………………………………………………………………. 122

5.4.2. 层级锁…………………………………………………………………………. 123

5.4.3. 资源分配器缓存…………………………………………………………… 125

5.5. 性能总结……………………………………………………………………………. 131

6. 锁…………………………………………………………………………………………….. 132

6.1. 生存(staying alive) …………………………………………………………. 133

6.1.1. 死锁…………………………………………………………………………….. 133

6.1.2. 活锁…………………………………………………………………………….. 136

6.1.3. 不公平…………………………………………………………………………. 137

6.1.4. 低效率…………………………………………………………………………. 137

6.2. 锁的类型……………………………………………………………………………. 137

6.2.1. 互斥锁…………………………………………………………………………. 138

6.2.2. 读写锁…………………………………………………………………………. 138

6.2.3. Beyond Reader-Writer Locks …………………………………………. 138

6.3. 基于锁的存在担保(existence guarantee) ………………………….. 138

7. 数据所有者………………………………………………………………………………. 140

8. 延迟处理………………………………………………………………………………….. 142

8.1. 屏障…………………………………………………………………………………… 142

8.2. 引用计数……………………………………………………………………………. 142

8.2.1. 引用计数类型的实现……………………………………………………. 143

8.2.2. 支持引用计数的Linux原语 …………………………………………. 150

8.2.3. 计数器优化………………………………………………………………….. 151

8.3. Read-Copy Update(RCU)………………………………………………… 151

8.3.1. RCU基础 ……………………………………………………………………. 151

8.3.2. RCU用法 ……………………………………………………………………. 163

8.3.3. Linux内核中的RCU API……………………………………………… 176

8.3.4. “玩具式”的RCU实现 ……………………………………………… 183

8.3.5. RCU练习 ……………………………………………………………………. 206

9. 使用RCU ………………………………………………………………………………… 207

9.1. RCU和基于每线程变量的统计计数器 ……………………………….. 207

9.1.1. 设计…………………………………………………………………………….. 207

9.1.2. 实现…………………………………………………………………………….. 207

9.1.3. 讨论…………………………………………………………………………….. 211

9.2. RCU和可移除I/O设备的计数器 ……………………………………….. 211

10. 验证:调试及分析……………………………………………………………………. 214

11. 数据结构………………………………………………………………………………….. 216

12. 高级同步………………………………………………………………………………….. 218

12.1. 避免锁……………………………………………………………………………….. 218

12.2. 内存屏障……………………………………………………………………………. 218

12.2.1. 内存序及内存屏障…………………………………………………. 218

12.2.2. 如果B在A后面, 并且C在B后面, 为什么C不在A后面? 220

12.2.3. 变量可以拥有多个值……………………………………………… 221

12.2.4. 能信任什么东西? …………………………………………………… 222

12.2.5. 锁实现回顾……………………………………………………………. 229

12.2.6. 一些简单的规则…………………………………………………….. 230

12.2.7. 抽象内存访问模型…………………………………………………. 230

12.2.8. 设备操作……………………………………………………………….. 233

12.2.9. 保证………………………………………………………………………. 233

12.2.10. 什么是内存屏障? …………………………………………………… 234

12.2.11. 锁约束…………………………………………………………………… 247

12.2.12. 内存屏障示例………………………………………………………… 248

12.2.13. CPU ………………………………………………………………………. 251

12.2.14. 哪里需要内存屏障? ……………………………………………….. 253

12.3. 非阻塞同步………………………………………………………………………… 253

12.3.1. 简单 NBS ……………………………………………………………… 253

12.3.2. 冒险指针……………………………………………………………….. 253

12.3.3. 原子数据结构………………………………………………………… 253

12.3.4. “Macho” NBS………………………………………………………… 253

13. 易于使用………………………………………………………………………………….. 254

13.1. Rusty Scale for API Design ………………………………………………….. 254

13.2. Shaving the Mandelbrot Set ………………………………………………….. 255

14. 时间管理………………………………………………………………………………….. 258

15. 未来的冲突………………………………………………………………………………. 259

15.1. 可交易内存………………………………………………………………………… 259

15.1.1. I/O 操作 ……………………………………………………………….. 260

15.1.2. RPC 操作 ……………………………………………………………… 260

15.1.3. 内存映射操作………………………………………………………… 261

15.1.4. 多线程事务……………………………………………………………. 262

15.1.5. 外部的事务访问…………………………………………………….. 263

15.1.6. 延时………………………………………………………………………. 264

15.1.7. 锁………………………………………………………………………….. 264

15.1.8. 读者-写者锁 ………………………………………………………….. 265

15.1.9. 持续性…………………………………………………………………… 266

TM如何提供类似的持续性功能?……………………………………………………….. 266

15.1.10. 动态链接装载………………………………………………………… 266

15.1.11. 调试………………………………………………………………………. 267

15.1.12. exec() 系统调用…………………………………………………….. 268

15.1.13. RCU ……………………………………………………………………… 268

15.1.14. 讨论………………………………………………………………………. 270

15.2. 共享内存并行编程……………………………………………………………… 270

15.3. 基于任务的并行编程………………………………………………………….. 270

A. 重要问题………………………………………………………………………………….. 271

A.1 “after“的含义是什么? …………………………………………………………. 271

B. 同步原语………………………………………………………………………………….. 277

B.1 初始化……………………………………………………………………………….. 277

B.1.1 smp_init() …………………………………………………………………….. 277

B.2 线程创建、销毁及控制………………………………………………………. 278

B.2.1 create_thread() ……………………………………………………………… 278

B.2.2 smp_thread_id() ……………………………………………………………. 278

B.2.3 for_each_thread() ………………………………………………………….. 278

B.2.4 for_each_running_thread() …………………………………………….. 279

B.2.5 wait_thread() ………………………………………………………………… 279 深入理解并行编程

B.2.6 wait_all_threads() …………………………………………………………. 279

B.2.7 用法示例……………………………………………………………….. 279

B.3 锁………………………………………………………………………………………. 280

B.3.1 spin_lock_init() …………………………………………………………….. 280

B.3.2 spin_lock() …………………………………………………………………… 280

B.3.3 spin_trylock() ……………………………………………………………….. 281

B.3.4 spin_unlock() ……………………………………………………………….. 281

B.3.5 用法示例……………………………………………………………….. 281

B.4 每线程变量………………………………………………………………………… 281

B.4.1 DEFINE_PER_THREAD() ……………………………………………. 282

B.4.2 DECLARE_PER_THREAD() ………………………………………… 282

B.4.3 per_thread() ………………………………………………………………….. 282

B.4.4 __get_thread_var() ………………………………………………………… 282

B.4.5 init_per_thread() …………………………………………………………… 282

B.4.6 用法示例……………………………………………………………….. 282

B.5 性能…………………………………………………………………………………… 283

C. 为什么使用内存屏障………………………………………………………………… 284

C.1 Cache 结构………………………………………………………………………… 284

C.2 缓存一致性协议…………………………………………………………………. 286

C.2.1 MESI 状态 ………………………………………………………………….. 286

C.2.2 MESI 协议消息 …………………………………………………………… 287

C.2.3 MESI状态图 ……………………………………………………………….. 288

C.2.4 MESI 协议示例 …………………………………………………………… 289

C.3 不必要的存储延迟……………………………………………………………… 291

C.3.1 Store Buffers ………………………………………………………………… 291

C.3.2 Store Forwarding ………………………………………………………….. 292

C.3.3 存储缓冲区及内存屏障………………………………………….. 293

C.4 不必要的存储延迟……………………………………………………………… 296

C.4.1 无效队列……………………………………………………………….. 296

C.4.2 使无效队列及使无效应答………………………………………. 296

C.4.3 无效队列及内存屏障……………………………………………… 297

C.5 读和写内存屏障…………………………………………………………………. 300

C.6 内存屏障示例…………………………………………………………………….. 300

C.6.1 乱序体系结构………………………………………………………… 300

C.6.2 示例 1 …………………………………………………………………… 301 深入理解并行编程

C.6.3 示例 2 …………………………………………………………………… 302

C.6.4 示例 3 …………………………………………………………………… 303

C.7 特定CPUs的内存屏障指令 ……………………………………………….. 304

C.7.1 Alpha …………………………………………………………………………… 306

C.7.2 AMD64 ……………………………………………………………………….. 308

C.7.3 ARMv7-A/R ………………………………………………………………… 309

6 ISB();………………………………………………………………………………………………… 309

C.7.4 IA64 ……………………………………………………………………………. 309

C.7.5 PA-RISC ………………………………………………………………………. 310

C.7.6 POWER / Power PC ……………………………………………………… 310

C.7.7 SPARC RMO, PSO, and TSO ………………………………………… 311

C.7.8 x86………………………………………………………………………………. 312

C.7.9 zSeries …………………………………………………………………………. 313

C.8 内存屏障是永恒的? ……………………………………………………………. 313

C.9 对硬件设计者的建议………………………………………………………….. 314

D. RCU实现 ………………………………………………………………………………… 315

D.1 可睡眠 RCU 实现 ……………………………………………………………… 315

D.1.1 SRCU 实现原理 ………………………………………………………….. 316

D.1.2 SRCU API 及用法 ……………………………………………………….. 317

D.1.3 实现………………………………………………………………………. 320

D.1.4 SRCU 概述 …………………………………………………………………. 326

D.2 分级 RCU 概述 ………………………………………………………………… 326

D.2.1 RCU 基础回顾 ……………………………………………………………. 326

D.2.2 经典 RCU 实现概要 ……………………………………………… 327

D.2.3 RCU 迫切要解决的问题 ………………………………………………. 328

D.2.4 可扩展RCU 实现 ………………………………………………….. 329

D.2.5 迈向不成熟的RCU 实现 ……………………………………….. 332

D.2.6 状态机…………………………………………………………………… 334

D.2.7 用例………………………………………………………………………. 335

D.2.8 测试………………………………………………………………………. 340

D.2.9 结论………………………………………………………………………. 345

D.3 分级 RCU代码走查 …………………………………………………………… 346

D.3.1 数据结构及内核参数……………………………………………… 346

D.3.2 外部接口……………………………………………………………….. 354

D.3.3 初始化…………………………………………………………………… 362 深入理解并行编程

D.3.4 CPU 热插拨 ………………………………………………………………… 367

D.3.5 杂项函数……………………………………………………………….. 372

D.3.6 Grace-Period检测函数 …………………………………………………. 373

D.3.7 Dyntick-Idle 函数 ………………………………………………………… 385

D.3.8 强制静止状态………………………………………………………… 390

D.3.9 CPU-延迟检测 …………………………………………………………….. 397

D.3.10 可能的缺陷及变更…………………………………………………. 400

D.4 可抢占 RCU ……………………………………………………………………… 400

D.4.1 RCU概念 ……………………………………………………………………. 401

D.4.2 可抢占RCU算法概述 …………………………………………… 402

D.4.3 验证可抢占 RCU …………………………………………………… 419

E. 形式验证………………………………………………………………………………….. 422

E.1 什么是 Promela 和 Spin? ………………………………………………….. 422

E.2 Promela 示例: 非原子性递增 …………………………………………….. 423

E.3 Promela 示例: 原子递增 ……………………………………………………. 426

E.3.1 组合…………………………………………………………………………….. 427

E.4 如何使用 Promela ……………………………………………………………… 428

E.4.1 Promela 特性 ………………………………………………………………. 428

E.4.2 Promela编程技巧 ………………………………………………………… 429

E.5 Promela 示例: 锁 ………………………………………………………………. 430

E.6 Promela 示例: QRCU …………………………………………………………. 433

E.6.1 运行 QRCU 示例 ……………………………………………………….. 438

E.6.2 到底需要多少读者和写者? …………………………………………… 439

E.6.3 可选方法: 正确性校验 …………………………………………………. 439

E.6.4 可选方法: 更多工具 …………………………………………………….. 440

E.6.5 可选方法: 分而治之 …………………………………………………….. 440

E.7 Promela Parable: dynticks 和可抢占 RCU …………………………… 440

E.7.1 可抢占 RCU 和 dynticks介绍 …………………………………….. 441

E.7.2 验证可抢占RCU和dynticks ………………………………………… 445

E.7.3 回顾…………………………………………………………………………….. 466

E.8 简单的避免形式校验………………………………………………………….. 467

E.8.1 简单Dynticks 接口的状态变量 ……………………………………. 467

E.8.2 进入和退出Dynticks-Idle 模式…………………………………….. 468

E.8.3 从Dynticks-Idle 模式进入NMIs ………………………………….. 469

E.8.4 Interrupts From Dynticks-Idle Mode ……………………………….. 470

E.8.5 检查Dynticks 静止状态 ………………………………………………. 471

E.8.6 讨论…………………………………………………………………………….. 473

E.9 概要…………………………………………………………………………………… 473

F. 问题答案………………………………………………………………………………….. 474

G. 术语表……………………………………………………………………………………… 475

H. 感谢…………………………………………………………………………………………. 476

文章转自 并发编程网-ifeve.com

《深入理解并行编程》中文版相关推荐

  1. 《分布式系统模式》中文版

    <分布式系统模式>(Patterns of Distributed Systems)是 Unmesh Joshi 编写的一系列关于分布式系统实现的文章.这个系列的文章采用模式的格式,介绍了 ...

  2. 分布式系统模式3-Segmented Log

    作者: Unmesh Joshi 译者: java达人 来源: https://martinfowler.com/articles/patterns-of-distributed-systems/ 将 ...

  3. 模式设计概述:代理者模式

    分布式系统模式 分布式相关的模式设计有大概三种模式,分布式系统与集中式系统相比需要完全不同的软件.管道和过滤器模式,微核和代理者模式. 代理者模式 代理者模式体系结构的强制条件是 组件应该能够访问其他 ...

  4. 从MIT的新式无人船,聊聊机器人的“组队打野”模式

    作者:藏狐 来源:脑极体(ID:unity007) 大多数科技爱好者也许都幻想过,未来的海洋角逐,将由智慧型舰艇在海上展开各种作业.对战.探险等,完全不需要人类的参与-- 在现实中,无人船也早已经不是 ...

  5. “软件教父”又开始整理模式了!

    Martin Fowler是谁? 我在之前的文章中写过,他是<重构>.<分析模式>.<企业应用架构模式>.<领域特定语言>等一系列知名书籍的作者,他很少 ...

  6. 有哪些比较流行的 C、C++和Java 的入门级项目?

    学习编程语言除了看书看视频,还需要找一些适合自己的开源项目,本文给大家安排了C.C++.JAVA相关的开源项目,不废话直接开车! 神级编程网站,堪称程序员的充电站,我给你找好了不能错过_程序员编程指南 ...

  7. JSP住宅小区物业管理系统(源代码+开题报告+论文+答辩PPT

    登录 JSP住宅小区物业管理系统(源代码+开题报告+论文+答辩PPT) 2022-12-04 657 ¥ 100 元 点赞 (0)  收藏 立即购买 升级会员 查看演示 遇到问题请联系客服微信:199 ...

  8. JSP住宅小区物业管理系统(源代码+开题报告+论文+答辩PPT)

    详情介绍 小区物业管理毕业设计 (论文) 目 录 摘要------------------------------–1 ABSTRACT---------------------------–2 第1 ...

  9. 超详细的Spring Cloud全面总结2W字(建议收藏)

    来自:FrancisQ 原文:juejin.im/post/6844904007975043079 首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟. 什 ...

  10. Spring Cloud 万字总结!

    作者:FrancisQ 来源:juejin.im/post/5de2553e5188256e885f4fa3 首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然 ...

最新文章

  1. 操作系统面试知识点总结1
  2. Qt for Android (Alpha) 发布
  3. HDU 1425 sort(堆排序)
  4. flask 与layui冲突
  5. Codeforces#371 Div2
  6. java redis快速入门_SpringDataRedis快速入门
  7. JDBC连接本地sqlserver2005的方法
  8. 1012.log4cplus项目应用
  9. Java中long和Long有什么区别(转)
  10. Android 动画的分类
  11. go模块的使用,调用第三方模块方法---go模块的复用方法
  12. Android集成腾讯TBS_X5内核的一些解决方法
  13. win10下 STLINK 驱动不正常 禁用强制验证数字签名
  14. 大师级游戏建模教程:使用Maya和XGen进行角色制作
  15. oracle服务 ora_01033,Oracle ORA-01033 错误的解决办法
  16. SAP报表导出格式设置
  17. vdagent与vdserver
  18. matlab遗传算法外卖配送优化(新的约束条件)【matlab优化算法十六】
  19. EChat(简易聊天项目)二、好友列表实现
  20. 用JASS简单修改魔兽争霸地图

热门文章

  1. 【体系结构】LGWR进程触发机制的理解
  2. 第十三节:使用Lombok简化你的代码
  3. linux安装XtraBackup8
  4. 对PostgreSQL xmin的深入学习
  5. 【bootloader】bootloader启动过程分析
  6. ubuntu14.04 LTS Visual Studio Code 编辑器推荐
  7. Lucene 的索引文件锁原理
  8. 随题而学(二)多维数组转一维数组
  9. Cocos2d之Ref类与内存管理使用详解
  10. 设计每个网站时所追求的5个目标