|
java自学网(www.javazx.com)-java论坛,java电子书推荐:《多核应用编程实战》
' h. H# R- m2 I6 ]9 [java电子书推荐理由:本书的口号是:一书在手,别无他求,全面、深度探讨多核应用开发!让你一书在手,别无他求!弱化编程语言基础知识,从更高层次考量如何编写功能正确、性能优良、可扩展至多核的应用程序代码。本书是一本全面实用的多核应用编程指南,旨在介绍如何编写功能正确、性能优越且适合扩展为在多个CPU核心的系统运行的应用程序。, {) Y/ n0 i- ^& T K
, _* F7 i- W' Q* ]& W
% h4 G, O- V. N1 S t
作者:(美)戈夫 著,郭晴霞 译. p) e, [+ l) X1 O/ }
出版社:人民邮电出版社
( {/ X" u( m3 p# J出版时间:2013-06' n9 |8 q& W9 k
, j( i. A$ H. W
. F9 X+ P8 N% Q0 g
' q- Y9 {7 l& w% D+ n& i
' d. b; ~4 l. _1 F/ }" R7 g/ ~ H1 L+ f* Q
java电子书目录:9 i3 u3 ?4 Z6 q/ f3 W2 [5 `! |. H
7 g0 _7 X8 h' j6 Q$ R
6 j4 M+ S2 z8 Q9 y% O; s y第1章 硬件、进程和线程
) y. |/ X& t' X7 ?: ]1.1 计算机的内部结构. s+ j( M, g, h
1.2 多核处理器的缘起3 h# [4 H; h9 P( d& f! d
1.2.1 在单芯片上支持多线程
: k2 y d1 R, `7 d5 s9 j1.2.2 通过处理器核心流水线作业提高指令发出率
$ v: x6 _( }& K* W4 E1.2.3 使用缓存保存最近使用的数据# s. K1 X+ [& K
1.2.4 用虚拟内存存储数据
" w* H8 e5 a* S1 x! W ~1.2.5 从虚拟地址转换到物理地址, ?! v5 _3 G" E
1.3 多处理器系统的特征9 i! z ?0 r0 ^
1.4 源代码到汇编语言的转换
I4 n) _' _. B) l1.4.1 32位与64位代码的性能 z/ A; L7 P( C7 N/ k
1.4.2 确保内存操作的正确顺序
% m r+ W2 k; S! k% H0 f! c. F1.4.3 进程和线程的差异
% B9 [$ C5 v0 F4 P+ B' d0 P+ B* }+ U1.5 小结6 K; F( E6 z/ u0 [
9 x' O9 w8 ~, ?8 I! y3 y第2章 高性能编码8 P% I3 c6 U; T) W. E& ]2 F
2.1 定义性能& V* f+ o- l& d8 } J
2.2 了解算法复杂度
1 N ~& U, e* d& z2.2.1 算法复杂度的示例: U, ?6 x9 A! O7 X1 q; l
2.2.2 算法复杂度的重要性
: U' a- n7 ^1 R1 ?& s) e$ a' a7 N2.2.3 谨慎运用算法复杂度' ?6 ~ F) U% Y. B- Y
2.3 结构如何影响性能( f+ O0 m2 R' f% z0 L* g) i" j
2.3.1 在源代码和生成结构上权衡性能和便利性
2 I2 J/ u$ \+ F2 p2.3.2 利用库结构化应用程序
9 K: Q: I: j1 C$ `2.3.3 数据结构对性能的影响; I8 T. V. W9 X2 ` D, G z5 q
2.4 编译器的作用; \5 }4 T- h$ D9 w
2.4.1 两种编译器优化3 m/ b& N) [6 e
2.4.2 选择合适的编译器选项
1 h. X" a( i, Z2.4.3 如何用跨文件优化提高性能7 \5 w; n, d Z# J( D! g @7 J
2.4.4 使用配置文件反馈9 ?% D6 s8 X, u" {7 }; R
2.4.5 潜在的指针别名会如何抑制编译器优化
# e" }2 c7 y0 g3 D2.5 通过分析确定占用时间的地方
; }1 k' K- ^- _# l8 B5 l- y2.6 怎样避免手动优化4 R3 z( v0 i+ c" T
2.7 从设计角度看性能 X n: v( E* c
2.8 小结6 ?. i/ |" c6 \7 d* k
# h1 [# y+ s$ v, Y4 i; ?2 V4 Z第3章 识别并行机会; k7 t" T2 E9 T% I
3.1 使用多进程提高系统工作效率
/ \0 f7 k# n* x3.2 多用户使用一个系统
. v$ u/ B, m6 A: S2 \3.3 通过整合提高机器工作效率
}: K: g1 ^3 ^9 i/ {5 d! p3.3.1 用容器隔离共享一个系统的应用程序
0 h; Q( r" C+ E* y$ W# h3.3.2 使用虚拟机监控程序托管多个操作系统
+ G) k1 u) h/ o) C4 I. g5 k# t/ ~3.4 采用并行机制提高单个任务的性能
) L5 h/ P: g3 V3.4.1 理解并行应用程序: ?6 P: D' l! M6 N' O" F8 J
3.4.2 并行如何影响算法的选择
& n( h- @( o( H6 ?+ B. b% \3.4.3 Amdahl定律
2 S, F# w" T! Y3 z& j, Q3.4.4 确定最大实际线程数9 {6 i, z9 t1 z
3.4.5 同步成本怎样降低扩展性
; j, K6 X. f3 |% I3.5 并行模式/ s" Q/ }9 E: ]* k. a
3.5.1 使用SIMD指令的数据并行
' d& \# y- H. n% h3.5.2 通过进程或线程实现并行化
6 @" X6 t6 R# L3.5.3 多个独立任务0 p" P z* A& S9 B. ~! ]7 t
3.5.4 多个松散耦合的任务1 k9 d9 j7 Q) U, h' S' } h
3.5.5 相同任务的多个副本9 W7 l7 `9 b9 `8 Q% [7 P% ^
3.5.6 单个任务拆分到多个线程
/ i! p" a7 t1 F; T3.5.7 使用流水线任务完成某个事项" e- J A4 @5 ]7 `+ q# N, Q
3.5.8 将工作分配给客户端和服务器" I/ w; }1 I, B' {/ _( W
3.5.9 将责任划分给生产者和消费者8 z' [" K" d+ M) N- ~
3.5.10 结合多种并行化策略0 R- F, C. X8 P: n# ]3 g
3.6 依赖关系对并行运行代码能力的影响* v) \" c5 E# J9 q8 {0 M) o
3.6.1 反依赖和输出依赖% m' A9 b7 Z. e8 l
3.6.2 通过推测打破依赖
! M! U5 |5 A; \* A3.6.3 关键路径
Q) k% Z+ U8 Q3 R3.7 发现并行机会' q: R" N% M) D8 A9 S
3.8 小结% E5 A: L3 \$ l* N$ O
9 P4 ~3 D$ E% z) Y3 F
第4章 同步和数据共享
6 g1 F6 i3 [# N2 C+ D4.1 数据争用( r+ p6 g# f( \0 C' {
4.1.1 使用工具检测数据争用
0 z, V. b7 q* r- M4.1.2 避免数据争用
Q: q1 j" L7 W- b9 l1 ?4.2 同步原语
" ?1 y7 h6 o& t- }" k1 u3 @4.2.1 互斥量和临界区8 ~: \) e& P8 ^
4.2.2 自旋锁+ @! @" `" ?" b4 K3 V* Q
4.2.3 信号量
5 e1 C3 |4 @1 M4.2.4 读写锁( b2 e' G7 Z, V: O$ A
4.2.5 屏障9 g! }7 O6 g- J3 |# v1 r
4.2.6 原子操作和无锁代码
8 }! r( x6 U! N/ n4.3 死锁和活锁4 J. X! B' g+ g( M) _8 R
4.4 线程和进程间的通信3 G4 M2 A1 R1 K8 m- h% {/ @
4.4.1 内存、共享内存和内存映射文件
0 B9 |4 A1 w6 S4 z* _4.4.2 条件变量
; W" m _4 m5 q- s4.4.3 信号和事件
6 c5 v% i/ P/ P# k. r& a4.4.4 消息队列
: L8 X' ]. ^* G0 S [# ~6 {, R( v4.4.5 命名管道
( @8 h# n7 ^) r* K4.4.6 通过网络栈进行通信
7 K% D: T7 `3 X2 M) H' [+ w4.4.7 线程之间共享数据的其他方法 ?. E( Y' s4 q3 A, X2 B1 r' V. x
4.5 存储线程私有数据* {8 G5 t/ ^9 l1 g5 X- B7 |7 y
4.6 小结# q! M3 M8 u( p2 J; v; _
% g; c7 ]5 S% z" N+ V o- ]# b( N
第5章 使用POSIX线程
* E& C" U9 E& ~1 L5.1 创建线程( \7 v t y; F' i: ]7 D
5.1.1 线程终止
# {! t" W7 E2 u+ `4 W5.1.2 用子线程接收和传递数据
2 o' u5 L% O0 l P$ `5.1.3 分离线程9 ], z4 U+ f; z5 R8 ]4 H! b
5.1.4 设置pthread的属性
1 u" x3 W2 w% d7 b8 h6 }: s" t& |. B5.2 编译多线程代码
' N$ @1 I. ~( w2 L: P& c5.3 进程终止3 X0 G" } _& p8 Y' F/ i, C
5.4 线程之间共享数据% j" w9 O, G5 D& t k6 j8 `
5.4.1 使用互斥锁保护访问
W& a; a/ I; o/ \$ W& \5.4.2 互斥锁属性9 K7 O/ p7 ]4 q* Q3 c* G
5.4.3 使用自旋锁
0 \6 T2 p# d( u# D' p" J" @5.4.4 读写锁5 X8 r: x) `) d
5.4.5 屏障" B% O6 Z) C8 T0 J. \3 o( N
5.4.6 信号量# E; m- L6 q6 Q7 q( c% w6 S4 P
5.4.7 条件变量
% [1 p( K& A: R# b6 ?5.5 变量和内存
& R$ G+ \+ r4 V% W5.6 多进程编程
1 A' F8 Q5 v1 ?5.6.1 在进程之间共享内存7 B6 \( A3 {" V5 @4 V$ ~( O# v( J1 q
5.6.2 在进程之间共享信号量0 m- n: Q5 [) q; b( [7 W7 T. X- O
5.6.3 消息队列/ P R6 g2 p( v/ R1 H
5.6.4 管道和命名管道
2 A& _7 S% ~, p$ {5.6.5 使用信号与进程通信
# c6 d5 ]4 O# w5.7 套接字
4 S: Y7 g# @( }5 \+ {! V ?5.8 可重入代码和编译器标志8 l3 ^5 k* ], K6 M5 L* P9 t' A
5.9 小结) R* v5 k8 t6 f( U5 P
% \4 G- ` B8 H; d# c6 x6 E
第6章 Windows线程
& q* w% D/ z) s/ I- W6.1 创建Windows本机线程, E( I5 v$ K6 T* e# s5 j
6.1.1 终止线程
4 K4 ?7 |6 v f: o/ _6 ^) z6.1.2 创建和重新启动挂起的线程 l9 |7 a0 A! }& B6 |3 v1 w2 W( H
6.1.3 使用内核资源的句柄( k) t$ i, a5 g
6.2 同步和资源共享的方式
9 |. D& r: J# `1 X# D+ R6.2.1 线程间需要同步的一个例子
8 Q+ q7 j9 n/ p6 ?2 L# X M6.2.2 保护对临界区代码的访问
% g% F `% d. g6.2.3 用互斥量保护代码段
+ ~8 P' m6 q) X6.2.4 轻量级读写锁
1 {: f/ s1 k/ \( a$ c# Y! y2 a6 B6.2.5 信号量% [3 n0 \2 A; N, ]
6.2.6 条件变量$ }* O! S+ Y3 Y! z
6.2.7 向其他线程或进程发出事件完成的信号
2 Y- P- {5 R9 ~6 z# r6.3 Windows中的宽字符串处理2 }, K1 M \! S# m
6.4 创建进程0 t7 S0 N% w& ?" @
6.4.1 在进程之间共享内存$ a, |0 j+ G4 L% \& O
6.4.2 在子进程中继承句柄
7 ]$ ~/ z" W- j% l6 p' E6.4.3 互斥量命名及其在进程间的共享4 J7 c7 R+ K% J' l
6.4.4 用管道通信
( Q4 k' H0 p; F4 o- g6.4.5 用套接字进行通信
+ r& p/ ~5 {: C) _3 O' U2 W" Z6.5 变量的原子更新
4 a: } e; K r' ^* F, P) x6.6 分配线程本地存储
" Q$ z9 o# E- k. `6.7 设置线程的优先级
; w& Y3 `4 {5 U z4 Q5 Y6.8 小结% `: d5 _- b- ?8 r2 p
; C" j" t6 }5 H0 F
第7章 自动并行化和OpenMP
/ V2 w1 c8 N1 y6 b' R5 \7.1 使用自动并行化产生并行代码
. }4 x- W; K) k* {7.1.1 识别和并行约简
U3 w% n$ l0 r% ]9 ?) u1 V) {7.1.2 对包含调用的代码进行自动并行化% I2 z9 _ |( u- Y6 \
7.1.3 协助编译器实现代码的自动并行化, l3 Z2 c9 f4 S6 @. P
7.2 使用OpenMP生成并行应用程序" m2 N( Q+ k+ ^
7.2.1 使用OpenMP并行化循环" V2 |/ q9 z: x
7.2.2 OpenMP应用程序的运行时行为: A% A1 j8 x/ x$ ?7 j7 J4 L# M
7.2.3 OpenMP并行区域中的变量作用域5 m4 d' O- s6 R7 K% y' B' n, j
7.2.4 使用OpenMP并行化约简
8 {: h' U; X' W" b% N3 M7 H0 z7.2.5 在并行区域外访问私有数据
: U- O+ ~* d& o0 v) B3 |7.2.6 使用调度改进工作分配
) w9 g- n' f- ~: k; v! | U7.2.7 用并行段完成独立工作7 {/ [' o' Z ]: u0 x6 G$ {
7.2.8 嵌套并行
5 @ K) O2 }# I' G& f' y/ q7.2.9 使用OpenMP动态定义并行任务
3 c6 D* M3 q9 V' a7.2.10 保持数据对线程私有
, o: P' U. U0 u: Z2 X/ u7.2.11 控制OpenMP运行时环境; G- j5 j* F0 S
7.2.12 等待工作完成( S3 K, I( R$ I# g6 T, `8 I
7.2.13 限制执行代码区域的线程
2 |6 L+ j, j# K: b4 Q; L$ V7.3 确保并行区域的代码按顺序执行* s1 z! r9 s- x2 @
7.4 折叠循环改进工作负荷均衡5 t! \# b4 Y2 k" ~; B% D
7.5 强制实现内存一致性, x8 d [. o5 [4 Z. I% k b, z
7.6 并行化示例0 c8 F/ [: D, p& v" U
7.7 小结0 s2 k& ]8 X+ T2 @; `9 _" i- M
. I) C- s. A' f1 n7 }第8章 手工编码的同步和共享
( N6 D" G+ p6 _0 L8.1 原子操作; t- m, M, [' V: R2 ^
8.1.1 用比较和交换指令构成更复杂的原子操作2 g+ ]- {2 D; R* F
8.1.2 强制实现内存排序以确保正确操作1 ?4 a1 K, k: s" q2 w# |
8.1.3 编译器对内存排序指令的支持" h+ G# ^, C$ S e" ~9 S
8.1.4 编译器对操作的重新排序
4 O- @0 M1 B: t8.1.5 易失变量$ g; L: Q5 n2 Q. t
8.2 操作系统提供的原子操作
5 C/ Z" k) a/ e9 |- |8.3 无锁算法
4 X" U1 w- y' c3 l. w. }8.3.1 Dekker算法3 p% f! R; H; C' m" J
8.3.2 带循环缓存的生产者/消费者
4 J& \- ^# Q7 z- E# s8.3.3 扩展到多个消费者或生产者
$ \% I2 G9 T2 @$ L5 I8.3.4 将生产者/消费者扩展到多个线程
& m9 }3 c5 w/ M$ y8.3.5 更改生产者/消费者代码为使用原子操作
. T, M$ s; g: [* h: V4 X8.3.6 ABA问题
9 H' F* P5 J8 M- s8.4 小结
( ^3 T8 U) k$ k& o) U. j8 p0 ^5 w# H
8 w- _" N% C7 ~! e第9章 基于多核处理器的扩展
/ Y" {. C! B/ R7 p2 V) M5 o: Q9.1 对应用程序扩展的限制
) o. b/ ?9 O. S8 ]0 K0 S p% Z9.1.1 串行代码对性能的限制
O0 P7 F* Q4 J. Q7 l! K1 Y, @6 H/ v9.1.2 超线性扩展$ h, N# r' G z- y X3 c
9.1.3 工作负荷不均衡9 Z% N$ i9 p: @5 J3 j3 U
9.1.4 热锁
' ]& \7 J( y% h8 g# Z9.1.5 库代码扩展
& N6 V& T7 u$ Q9.1.6 工作量不足0 S' \( } [) g- Y
9.1.7 算法限制. R; v* a( Y' n, `) |6 T. \" q1 e
9.2 扩展的硬件限制
. x4 y3 z: o# N' m- f9.2.1 核心之间的带宽共享+ z1 f% }8 r5 ~' i9 C
9.2.2 伪共享
: V) T( B0 d+ V, u9.2.3 缓存冲突和容量
0 B" S; u G- L u# ]5 K9.2.4 流水线资源匮乏# q( x8 q8 k1 Q
9.3 操作系统对扩展性的限制: z/ m) @4 I5 M; N
9.3.1 过度订阅
( w: J# y2 a q" v3 S3 l7 H9.3.2 使用处理器绑定改善内存局部性: S% G9 @9 Z4 [' f. N; G' k+ n
9.3.3 优先级反转
2 x. S/ x& r P4 h, p% n9.4 多核处理器和扩展
; X. ]! x; v" \1 z# P9.5 小结
7 U- i8 P0 e9 l* @' z* h# U
8 X2 _ I: N/ a/ p5 e% ]第10章 其他并行技术4 ^- K+ ]0 _6 r# z5 v
10.1 基于GPU的运算& Q7 d9 }1 q0 g' a
10.2 语言扩展) o4 X) `- G$ J1 Y) A1 B/ A
10.2.1 线程构建模块
6 x0 i: d; S, P; j! Q10.2.2 Cilk++5 o- u% q# \3 L* Q2 C
10.2.3 GrandCentralDispatch
4 {; L4 E0 `) t# l10.2.4 为未来C和C++标准提议的可能功能
* Q* z3 G# l* L& [10.2.5 微软的C++/CLI9 k( g$ s9 f$ }$ m* i+ v9 ?: _
10.3 其他语言7 u2 s; L# H" M5 _8 Z0 l, y- ^
10.4 集群技术
( J r6 I; E. u* M8 z/ o4 h10.4.1 MPI
% K0 E3 s! B( x& T: K10.4.2 以MapReduce作为扩展策略8 i3 }$ Y2 \% |0 d6 c
10.4.3 网格
: j7 A1 f& ]; R! i5 k10.5 事务性内存' @. `+ W4 l8 l7 P7 L- I
10.6 向量化
# I b0 g* v0 b1 H# N+ g! y& K! Q# f10.7 小结$ _8 ?6 Q6 R; H( p4 i
' l# ^- `0 s- s5 m/ m
第11章 结束语5 L' B/ S0 X8 @1 L3 s& T7 T
11.1 编写并行应用程序- Z, }: D4 W6 P( \" C! W2 Y* M9 \
11.1.1 识别任务
' ?; r! H! Q5 |# h I11.1.2 估算性能提升& ]9 V2 k! I2 u! n0 }, i" c
11.1.3 确定依赖关系
' e1 b6 u, \8 x' p3 R11.1.4 数据争用和互斥锁扩展限制
1 r! ^& J6 [& P3 t2 s11.1.5 锁的粒度$ j5 t% p# h* _" D# m
11.2 多核处理器上的并行代码3 Z! E0 b$ U4 c- ~
11.3 并行化的未来
! v+ O. v+ r- s: N1 B% ?( X( M: |1 r. p& a2 ~! `0 T
/ \! f/ u+ `8 J4 y. w5 ?8 H5 G百度网盘下载地址链接(百度云)下载地址:java自学网(javazx.com)多核应用编程实战 高清 电子书 PDF.zip【密码回帖可见】
7 B/ ]5 G+ [7 n( a% r6 s4 g5 _* h+ p% T+ M
8 ]/ j/ E( `( t: O3 \$ b
x! ]) P( ]6 z7 |: F& L; s' V0 ]% |4 z8 A
|
|