深入理解并行编程
深入理解并行编程
编辑
Paul E. McKenney
Linux Technology Center
IBM Beaverton
paulmck@linux.vnet.ibm.com
2011-02-12
翻译
谢宝友(xie.baoyou172958@zte.com.cn,scxby@163.com)
鲁阳(luyang.co@gmail.com)
陈渝(wilbur512@gmail.com)
深入理解并行编程
译者简介
谢宝友:
毕业于四川省税务学校税收专业,现供职于中兴
通讯操½系统团队,对操½系统内核有较强的兴趣。专职于操
½系统内核已经有四年时间。目标是利用十年时间,成为一名
真正的“内核菜鸟”。个人主页是:
http://xiebaoyou.blog.chinaunix.net。
主要工½是对
Linux
进行分析,解决遇到的标准内核故障;并向项目组提出
应用程序优化措½。也从头编写过自主知识产权的操½系统。
鲁阳:2009 年硕士毕业于成½电子科技大学,后加入
中兴通讯操½系统团队。
不玩
Linux
则已,
一玩就深度上瘾,
“熟读唐诗三百首,
不会½诗也会吟” 每日攻读内核不辍,
,
对
Linux
内核内存管理子系统有较深刻的认识。邮箱
luyang.co@gmail.com。
主要工½是分析
Linux
内核代码,
为中兴
Embsys Linux
内核开发包括调度、
内存管理、AMP 支持和编译框架在内的定制功½,参与过中兴自主知识产权操
½系统(非
Linux)的实现。
陈渝:2009 年从成½电子科技大学计算机专业毕业后,
加入中兴通讯操½系统团队。主要负责中兴定制
linux
系统的
各种
bug shooting,性½调优等。熟悉 mips
架构,对
kexec
有
研究,参与过自主产权操½系统的
mips
架构实现。
wilbur512@gmail.com
深入理解并行编程
法律声明
这代表½者的观点,并不一定代表雇主的观点。
IBM、zSeries
和
Power PC
是½际商用机器公司在美½、其他½家(或者兼
而有之)的商标或者注册商标。
Linux
是
Linus Torvalds
的注册商标。
i386
是
Intel
公司或者它在美½、其他½家(或者兼而有之)的子公司的注
册商标。
其他公司、产品以及服务名称也许是某些公司的商标或者服务标记。
本文档中,非源代码文本和图像遵循
Creative Commons Attribution-Share
Alike 3.0 United States license (http://creativecommons.org/licenses/by-sa/3.0/us/)条
款。简而言之,只要这些内容出于½者之手,您就可以出于任½目的½用本文档
中的内容:个人目的、商业目的或者其他目的。同样的,文档也可以被修改,并
且派生工½及翻译也是可以的。
只要这些修改及派生工½以原始文档中的非源代
码及图像的方式,并且以相同的授权条款提供给公众。
源代码涉及几个版本的
GPL(http://www.gnu.org/licenses/gpl-2.0.html)
。这
些代码中,有一部分来自于
Linux
内核,它们仅仅遵循
GPLv2。详细的授权条款
请参见
git
代码示例目½
(git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/perfbook.git)
,它们包含在每
一个文件的注释头中。如果您不½确认特定代码的授权条款,则应½假设它仅仅
遵循
GPLv2。
© 2005-2011 by Paul E. McKenney
深入理解并行编程
1.
简介.........................................................................................................
14
1.1.
1.2.
导致并行编程困难的历史原因......................................................
14
并行编程的目标..............................................................................
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.
3.
3.1.
3.2.
½件设计
Implication ...................................................................... 40
脚本语言..........................................................................................
43
POSIX
多进程
................................................................................. 44
3.2.1. POSIX
进程创建和撤销
.......................................................... 44
3.2.2. POSIX
线程的创建和撤销
...................................................... 46
3.2.3. POSIX
锁
.................................................................................. 48
3.2.4. POSIX
读写锁
.......................................................................... 52
3.3.
3.4.
3.5.
4.
4.1.
4.2.
原子操½..........................................................................................
55
Linux
内核中类似
POSIX
的操½
................................................. 56
趁手的工具——该如½选择?......................................................
58
为什么并发计数不可小看?..........................................................
60
统计计数器......................................................................................
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.
4.6.
5.
特殊的并行计数器..........................................................................
95
并行计数的讨论..............................................................................
96
工具.........................................................................................................
43
计数.........................................................................................................
59
分割和同步设计...................................................................................
100
评论