|
java自学网(www.javazx.com)-java论坛,java电子书推荐:《多核应用编程实战》( S6 K" ^7 V) L: _' l. c" g" t
java电子书推荐理由:本书的口号是:一书在手,别无他求,全面、深度探讨多核应用开发!让你一书在手,别无他求!弱化编程语言基础知识,从更高层次考量如何编写功能正确、性能优良、可扩展至多核的应用程序代码。本书是一本全面实用的多核应用编程指南,旨在介绍如何编写功能正确、性能优越且适合扩展为在多个CPU核心的系统运行的应用程序。
5 h Z7 b% R& o/ x9 i
1 M( n6 K! x/ H: {7 m7 W' |
2 u0 x4 O+ a8 \$ L: h作者:(美)戈夫 著,郭晴霞 译9 S0 ^- a1 ~9 l8 c" w7 y6 Q v3 h
出版社:人民邮电出版社) _4 ^5 n. G% t* L
出版时间:2013-069 v* o4 g" B& R- M
" n ? J: T! x4 P, R- m9 B4 Q
- S4 n0 O3 q; N9 @
3 e% {* J+ o2 d5 g, O# E p0 Y
% [" }! X( N# @- E: h% z* w5 |7 z3 [! S, H
java电子书目录:! g1 s7 x; ^6 Q& I8 O/ Z
# N2 [+ B* j7 V" ? `
9 L* O; K3 L' I$ C7 ]第1章 硬件、进程和线程# z" R8 L }, H! P+ J: u! W
1.1 计算机的内部结构
2 D0 f9 h0 w8 \" I* ~7 e1.2 多核处理器的缘起
7 L0 L: Y% L _: V+ s S/ n1.2.1 在单芯片上支持多线程
3 a$ p7 ?0 o6 N8 D; S1.2.2 通过处理器核心流水线作业提高指令发出率 ~3 N1 @4 }- o0 [
1.2.3 使用缓存保存最近使用的数据
7 O" z$ w) Q5 y+ b- m1.2.4 用虚拟内存存储数据
. [' j# `1 _, o1 U1.2.5 从虚拟地址转换到物理地址
8 s6 i' e, g! M" Y2 }0 }; N1.3 多处理器系统的特征3 ?( g7 m! R D6 t s( _/ \1 m
1.4 源代码到汇编语言的转换- V' }7 n/ A n8 x( d0 d
1.4.1 32位与64位代码的性能0 `3 b7 U3 x, _; [) Z3 q
1.4.2 确保内存操作的正确顺序6 T7 f- G2 f: g5 K
1.4.3 进程和线程的差异+ J" n- a% d6 Y
1.5 小结
6 {3 U: M& \- H% A* [ w1 g6 o8 a# U/ J% C
第2章 高性能编码3 c2 t: e# k- J# Z( {) k
2.1 定义性能
0 D4 y! v |; h$ L! m8 u8 f& `2.2 了解算法复杂度9 l$ Q( R) S: v. F) {: ? j0 S, c
2.2.1 算法复杂度的示例
3 g+ q, l- h$ d/ j- |. F, U% R! ~2.2.2 算法复杂度的重要性2 ^5 W/ K* t3 O9 Y8 \+ R2 L, |$ x
2.2.3 谨慎运用算法复杂度
" q! j' Z* J. {$ Z2.3 结构如何影响性能
0 D r5 z* N& _7 K, A2.3.1 在源代码和生成结构上权衡性能和便利性# v/ Y9 I& b% u
2.3.2 利用库结构化应用程序* }7 C7 J1 l1 S) z# f; p/ n: F; b% A8 z
2.3.3 数据结构对性能的影响
- Z3 \* z7 g: C/ _* J' O* ]8 a2.4 编译器的作用
6 s4 p: p; a! f- g; w2.4.1 两种编译器优化
T. N" f( y( k' d% p2.4.2 选择合适的编译器选项* O' k$ _. g$ m/ ]9 \* A
2.4.3 如何用跨文件优化提高性能. }0 ?# G. k: _0 N7 a5 J* d
2.4.4 使用配置文件反馈
( z- c! a2 l" I# G0 t) \# O2.4.5 潜在的指针别名会如何抑制编译器优化/ ]7 V8 A A# k; i. h9 s4 S
2.5 通过分析确定占用时间的地方
" H7 N+ i1 E! q2.6 怎样避免手动优化; }6 K, \4 q1 `# V
2.7 从设计角度看性能7 w; j6 Z' Z1 J+ J D# u
2.8 小结6 ~6 ^( n6 r! V! m; q$ o
8 i6 r1 y1 r3 x: j: J3 _( V
第3章 识别并行机会
9 f) a' E5 c% @( S3.1 使用多进程提高系统工作效率$ C5 H: `# W$ U# k) y2 Q. {
3.2 多用户使用一个系统, f" V3 U, E5 {! {) z8 f6 ^
3.3 通过整合提高机器工作效率
4 ?6 V# E d! c3.3.1 用容器隔离共享一个系统的应用程序
: w: l2 ?5 D; B) D3.3.2 使用虚拟机监控程序托管多个操作系统1 g% e' W8 R/ L6 V! @$ ~2 r
3.4 采用并行机制提高单个任务的性能" l P5 o" N, P. [3 r7 b: Y
3.4.1 理解并行应用程序
; V: ]( Z o5 L. P l9 `2 V. Z1 g3.4.2 并行如何影响算法的选择0 _ O$ j: q* {" w3 @' J- S8 x
3.4.3 Amdahl定律6 \5 |+ R3 [1 W& n( f
3.4.4 确定最大实际线程数
6 B0 A$ c/ F4 u+ C! ^; s) I3.4.5 同步成本怎样降低扩展性
* W, i! h8 P' ?- p4 h3 R3.5 并行模式
( j0 q& `3 K g0 E) N, @7 G3.5.1 使用SIMD指令的数据并行3 \: \ j- ?) P5 Y$ e
3.5.2 通过进程或线程实现并行化, L) R+ r" x- L- [, n
3.5.3 多个独立任务. ^# D4 [3 r' |
3.5.4 多个松散耦合的任务3 A7 A" W4 W6 _* P
3.5.5 相同任务的多个副本
8 ?8 q% R1 O7 v& o6 ?: @3.5.6 单个任务拆分到多个线程
: \: M% p$ q0 S, j9 Y+ |) Y3.5.7 使用流水线任务完成某个事项6 Z$ W2 ~ o+ w4 ~2 g+ A, E X/ T
3.5.8 将工作分配给客户端和服务器
` q, b" B) a3 y9 r% S: X% t6 ^3.5.9 将责任划分给生产者和消费者
. U6 g2 J) B" P* p/ O* \3.5.10 结合多种并行化策略
0 V) F+ y0 `! I9 i2 `$ e. e9 b8 q0 U3.6 依赖关系对并行运行代码能力的影响
3 v4 D h9 j# {% z3.6.1 反依赖和输出依赖
$ l" V; o8 W) y3.6.2 通过推测打破依赖
. f Q! [6 f% |+ r, ?3.6.3 关键路径* C5 V1 B$ U: M; j3 A
3.7 发现并行机会
. P1 f- ]4 @; ~. ]% F% r. }3.8 小结6 z# o4 P: g; V' B1 h
1 h1 x5 }) L$ ]4 U
第4章 同步和数据共享2 i$ d1 ]( H: @$ @
4.1 数据争用
( h. r; e6 `8 Z; h: o4.1.1 使用工具检测数据争用
8 B" |, E& `. U8 r7 O0 i4.1.2 避免数据争用! M8 u9 \8 _1 h% J
4.2 同步原语4 z/ f; J8 s$ a, s7 q: m! D+ i
4.2.1 互斥量和临界区
- f! m7 I2 q$ r8 a( T4.2.2 自旋锁/ |; S. ]& U H; k
4.2.3 信号量( s+ ]; s7 N/ H" E- H- y; M" C$ g
4.2.4 读写锁
7 @$ }1 y+ J0 I c4.2.5 屏障
: ~9 x6 S1 S* S: J( d4.2.6 原子操作和无锁代码
& Q- G/ F9 x, o* i6 T4.3 死锁和活锁
9 V- l3 O; F" r' l: N# p: D9 i6 _5 |4.4 线程和进程间的通信
, c, f: c# S/ S4.4.1 内存、共享内存和内存映射文件
) r5 D! A0 b( ^4.4.2 条件变量# P0 |; H; B x- X! X( B8 A! C: M3 F) R
4.4.3 信号和事件
8 s. C! N* r S. z7 e/ g6 r4.4.4 消息队列- y; S. D! B8 j4 {8 A8 \% L6 ^# T1 X
4.4.5 命名管道
) e% z& V, S, M: V4.4.6 通过网络栈进行通信 f7 r$ U9 d5 L( E' F
4.4.7 线程之间共享数据的其他方法
0 V) |$ o. }9 ]. M$ X% M% Z# q8 @6 F4.5 存储线程私有数据
% U2 L, E+ F3 c, Z f4.6 小结5 g \$ i) d% i4 ^+ X( y
: a" E% D, I- G. O2 |第5章 使用POSIX线程
7 y, _0 N2 n; g! M5.1 创建线程5 }1 X; z+ b; m/ w, ~
5.1.1 线程终止) u+ |& ^0 }) ]' W4 L/ L
5.1.2 用子线程接收和传递数据$ L0 D" W8 `) U- h
5.1.3 分离线程
6 n- {. l2 N8 I2 j5.1.4 设置pthread的属性
* K# f6 k( z2 [% k2 }5.2 编译多线程代码. Z% y8 d( A( f9 l
5.3 进程终止/ x: V1 U7 z! A. i1 E& E4 |+ ]
5.4 线程之间共享数据# x+ P0 L. R2 Q; b( ^/ ?$ G
5.4.1 使用互斥锁保护访问' ^8 h; ?* Y( l
5.4.2 互斥锁属性% G2 H8 r& j Q. |; V; {
5.4.3 使用自旋锁# R( j' u' s; X* h4 x$ l# d7 D
5.4.4 读写锁3 D) }* D, L# ]: I# t
5.4.5 屏障4 W W2 U% ?, S
5.4.6 信号量
: i% G7 |1 |$ L) |7 P0 x' Z5.4.7 条件变量
* p5 W$ J4 _4 Z, g) x! {9 Y1 _) F5 A5.5 变量和内存+ N# A& Z+ F- [) ~4 S$ d7 B
5.6 多进程编程
7 w5 ?0 I# h5 K0 P5.6.1 在进程之间共享内存7 h* t. I9 f e1 z; E8 N4 ?
5.6.2 在进程之间共享信号量: i) _' d' v2 z- u: T
5.6.3 消息队列; }; B- g7 B$ e. X( V6 c6 U, i, e
5.6.4 管道和命名管道
* h% b5 h, K d) Y" a5.6.5 使用信号与进程通信" y# ?# u5 y0 f
5.7 套接字
7 C$ B! x O% _: {9 f) b+ |5.8 可重入代码和编译器标志
$ `+ c" f6 a. i! F- ]+ _5.9 小结6 Q# s" I6 J; G( ^
: a8 u5 w8 s4 F4 b) A第6章 Windows线程, l l9 @# Y0 }
6.1 创建Windows本机线程
, K0 x, N: N) s6.1.1 终止线程6 t. {& X! z* c' q5 r$ V* f
6.1.2 创建和重新启动挂起的线程9 `1 X+ Y5 |) ~0 `1 D% r6 v
6.1.3 使用内核资源的句柄- \4 m L8 u+ J/ |0 g2 o" R6 `. @8 e
6.2 同步和资源共享的方式3 O7 @1 p; W" S" }8 f
6.2.1 线程间需要同步的一个例子; c: \: ]0 [0 y) `1 z" f9 `! }: I
6.2.2 保护对临界区代码的访问
- f- p* C8 R, a; p. H& k6.2.3 用互斥量保护代码段# r9 s, d- f9 }: a
6.2.4 轻量级读写锁; O+ r! V* I# ~+ L; k& i
6.2.5 信号量
4 m: V. ]0 _' F6.2.6 条件变量
/ j% H) v( D; k; E5 R6 u+ i; d6.2.7 向其他线程或进程发出事件完成的信号& X/ O5 U6 L. N7 W0 @" a
6.3 Windows中的宽字符串处理8 S( @8 Z% a3 w% Y8 w
6.4 创建进程
0 N: ~+ G }7 R, O4 G, M1 K; a i6.4.1 在进程之间共享内存
- T1 `$ {3 @4 ~ k" _, B% ~6.4.2 在子进程中继承句柄3 v! ^* s" J( Q0 I
6.4.3 互斥量命名及其在进程间的共享6 r. V e+ y, o9 C: C' @# R7 ]+ }, ~
6.4.4 用管道通信
/ j- Q% A- n, N2 f5 [3 U" y$ }, V6.4.5 用套接字进行通信
* ^2 D; \# \3 `1 U/ M! \' Y6.5 变量的原子更新9 Y f- V% Q8 X* l% k& Z( b
6.6 分配线程本地存储5 k3 u! H! J& d
6.7 设置线程的优先级
, ]0 J( b* V9 ~6 u- }- u6 v( i6.8 小结
! w. O% G0 o, t! \' |% y* O0 U! K% o4 u3 c9 R
第7章 自动并行化和OpenMP) s5 f6 Z6 Q9 a, D& }+ e ?
7.1 使用自动并行化产生并行代码
- S* v4 s* x. j- {1 i! I, ]5 _ P7.1.1 识别和并行约简! k0 k# o3 Z. [9 B' D3 X/ P' _4 A
7.1.2 对包含调用的代码进行自动并行化6 ?2 h1 x; v& ^
7.1.3 协助编译器实现代码的自动并行化
5 n* Q' t2 ]3 W7 y5 [. ]2 X$ k7.2 使用OpenMP生成并行应用程序5 Q# m" R, v! f0 B( J5 B
7.2.1 使用OpenMP并行化循环6 T- V5 I! x! G7 V* m
7.2.2 OpenMP应用程序的运行时行为
0 t- [# E' |2 r, ^2 [- G6 z7.2.3 OpenMP并行区域中的变量作用域' O1 J1 E H, D$ @. I0 Q
7.2.4 使用OpenMP并行化约简
* ~" Q' j9 z; U% t+ @+ p& l8 f8 @. L' U5 c7.2.5 在并行区域外访问私有数据4 w0 m* {( ~( P: D1 D. M9 y
7.2.6 使用调度改进工作分配
* N0 X7 X. p6 r% J. t/ j7.2.7 用并行段完成独立工作0 t) u9 t2 `- S/ m* B, e
7.2.8 嵌套并行4 X; i/ f2 ~! M9 W' s: Y& m
7.2.9 使用OpenMP动态定义并行任务
5 F/ Y5 C6 b% k: {& T7.2.10 保持数据对线程私有% V( U: p7 Y; L+ ?1 S5 @! W$ j: F
7.2.11 控制OpenMP运行时环境9 Z4 i; O D. Q, \$ z3 J" k0 u
7.2.12 等待工作完成
8 u7 H& {- s7 W5 u: d6 b7.2.13 限制执行代码区域的线程$ O3 e% k/ I4 Y! g: H: z
7.3 确保并行区域的代码按顺序执行
& y8 |: f1 o- B7.4 折叠循环改进工作负荷均衡; m3 O" \1 R3 C8 x( d7 }
7.5 强制实现内存一致性
! T8 u( @3 N4 \, s( H7.6 并行化示例
9 F; h1 T; I+ ]& `& p ]+ I7.7 小结
/ c1 |, J7 i0 T) x" c% V3 i" l/ S. x! a. z+ P2 \3 [* w5 n" y- x# S: ]
第8章 手工编码的同步和共享
5 I- ^, C' o2 O: L4 _8.1 原子操作; G% |3 J: [! t7 P8 b7 Q v; D: M
8.1.1 用比较和交换指令构成更复杂的原子操作
, t3 j% G% m- s. m8.1.2 强制实现内存排序以确保正确操作
: d. \: U4 E2 w& l4 f/ S" y8.1.3 编译器对内存排序指令的支持9 O, d7 W1 O2 I/ g' G! r
8.1.4 编译器对操作的重新排序
. _1 W: C" V% j8.1.5 易失变量
* w* g5 E6 Y" g4 `" p' K8.2 操作系统提供的原子操作
% m; P/ G( M1 H8.3 无锁算法
6 _6 d" K& H8 H: Z+ c" W8.3.1 Dekker算法
( D9 E8 V$ n6 M1 u9 |( d8.3.2 带循环缓存的生产者/消费者
3 V) h- |* A! h- l2 `5 q! o3 p; w8.3.3 扩展到多个消费者或生产者/ T) f/ U7 i: `6 G% p# ?
8.3.4 将生产者/消费者扩展到多个线程) `. {1 {( L% G# L3 F
8.3.5 更改生产者/消费者代码为使用原子操作
8 d1 k+ U" b& \8 g; ~8.3.6 ABA问题
) x5 t; C" \: Z6 L' S8.4 小结/ l& n5 Z* c. h8 d6 Q# J/ E6 ^: p
) V$ a6 ~' L/ {
第9章 基于多核处理器的扩展" `, f1 A2 w& p* f8 R2 i1 S P# m: @
9.1 对应用程序扩展的限制1 n2 g9 A/ a" E
9.1.1 串行代码对性能的限制
+ p) c9 G/ {. K4 _8 @9.1.2 超线性扩展0 C$ e" }$ j9 `9 g4 P& S
9.1.3 工作负荷不均衡 M o# m, I1 V/ M4 W
9.1.4 热锁
' d# h1 y0 h8 w: V( ~# e7 L9.1.5 库代码扩展
6 ]% X: z8 M8 U9.1.6 工作量不足
: P: \( y$ m7 c, x( W7 |: s1 Y* q9.1.7 算法限制
" p5 p- ^$ M7 V# l) U9.2 扩展的硬件限制- V) I4 D$ B* x1 {# C% ~
9.2.1 核心之间的带宽共享! V) O9 x5 R, v+ ^" k: x
9.2.2 伪共享
: u: b* R; f3 ?# e3 S* E9.2.3 缓存冲突和容量
( x/ }8 B+ j' M' w9.2.4 流水线资源匮乏% f+ o* m/ a# X M$ \
9.3 操作系统对扩展性的限制) U9 [, ]; x5 t6 \; {' H
9.3.1 过度订阅) a1 o s: Y& i( y- y+ J- M
9.3.2 使用处理器绑定改善内存局部性; @ A: `% B* }+ |! {5 Y
9.3.3 优先级反转
7 R5 K2 _# i6 v9.4 多核处理器和扩展, d; {" m0 o( N
9.5 小结, Z- g- m' \6 A7 d8 w
! M: T) K) R( e4 s# u1 r) p
第10章 其他并行技术3 z" E, h9 p3 b4 C6 y9 v4 d; |% M
10.1 基于GPU的运算% v1 _) `+ Z) @; D; O+ A% S* g
10.2 语言扩展$ w/ T% u" I* t* e
10.2.1 线程构建模块1 Y! ]5 i2 X! N5 }9 Q& Q
10.2.2 Cilk++
$ N# f8 g9 P. [2 ^. _* T: |10.2.3 GrandCentralDispatch
) Y. @* X5 W4 B2 r$ G: p10.2.4 为未来C和C++标准提议的可能功能* o9 K# `. \! O8 S* m
10.2.5 微软的C++/CLI2 Q& |. k; v; z' H f9 ~2 c* E
10.3 其他语言/ p) k7 L9 L& J8 ~& O: D% s. A
10.4 集群技术. ]5 H3 [/ v5 b S. ]9 n
10.4.1 MPI/ r/ h7 K% g4 f" }. O0 N
10.4.2 以MapReduce作为扩展策略
4 L8 |2 m" d+ K/ V& |3 b3 l; w5 H10.4.3 网格
# L6 f1 W0 q# X8 m! p0 m, f' m10.5 事务性内存
. I6 O% Z" S+ k$ \3 ` x* N10.6 向量化
1 H' u j/ f7 X7 l& ~10.7 小结9 ]" B; H* f$ q9 y% q- s
8 m; N0 M* [( r第11章 结束语
9 S8 a9 m( q# G. Q! N6 ~11.1 编写并行应用程序. K, g1 `# {: r7 @* b' l
11.1.1 识别任务
5 n, e4 {6 `' F- t11.1.2 估算性能提升/ t8 P5 p: V% f* c5 T
11.1.3 确定依赖关系; b, C! z. k9 I- s4 ~
11.1.4 数据争用和互斥锁扩展限制
3 |- p+ u# p0 L: w+ U1 z11.1.5 锁的粒度4 @/ T* B/ v H) P
11.2 多核处理器上的并行代码
, k1 d) s' o' u8 u0 z; v& S1 E+ n. z11.3 并行化的未来& n& z9 h& R0 V( E
3 T/ K5 s& U% u3 o% v& T' j, v4 m( h8 S% P6 T1 c8 J: D# q4 |6 y
百度网盘下载地址链接(百度云)下载地址:java自学网(javazx.com)多核应用编程实战 高清 电子书 PDF.zip【密码回帖可见】0 ?3 S! _. Z; D$ [, d4 e
' j D6 @: g( h- c3 \
! n+ P+ q; [& Y2 Y7 ?! D7 z1 @* `1 Q) S5 `- c
5 d) k% n4 D0 b
|
|