商品详情
书名:深入解析计算机系统
定价:179.8
ISBN:9787115638151
作者:[美]苏珊娜·J. 马修斯(Suzanne J. Matthews) 蒂亚·纽霍尔(Tia Newhall) 凯文·C. 韦布(Kevin C. Web
版次:第1版
出版时间:2026-01
内容提要:
计算机系统是计算机专业的常见课程,也是学习编程过程中的重要学习内容。本书是计算机系统的入门图书,介绍了现代计算机系统的主要硬件和软件。本书按抽象层次设置各章节,从常用于编写操作系统的 C 语言基础知识逐步衍生,先介绍现代计算机的组成、结构、操作系统原理、汇编语言,再介绍各种计算机体系结构的代码优化方法、使用共享内存实现并行计算、多核 CPU环境下的内存管理等。 本书适合作为计算机系统相关课程的教材,也适合有编程基础的人阅读。
作者简介:
苏珊娜·J. 马修斯,西点军校计算机科学副教授。 蒂亚·纽霍尔,斯沃斯莫尔学院计算机科学教授。 凯文·C. 韦布,斯沃斯莫尔学院计算机科学副教授。
目录:
第 1 章 靠近 C,靠近 C,靠近美丽的 C 1
1.1 开始使用 C 编程 2
1.1.1 编译和运行 C 程序 4
1.1.2 C 类型 6
1.2 输入和输出(函数 printf 和 scanf) 9
1.2.1 printf 函数 9
1.2.2 scanf 函数 11
1.3 条件和循环 13
1.3.1 C 中的布尔值 15
1.3.2 C 中的循环 16
1.4 函数 20
1.5 数组和字符串 25
1.5.1 数组介绍 25
1.5.2 数组访问方法 27
1.5.3 数组和函数 28
1.5.4 C 字符串和字符串库介绍 30
1.6 结构体 31
1.6.1 定义结构体类型 32
1.6.2 声明结构体类型的变量 32
1.6.3 访问字段值 33
1.6.4 向函数传递结构体 36
1.7 总结 39
第 2 章 深入理解 C 语言 40
2.1 程序内存的组成部分和作用域 40
2.2 C 指针变量 43
2.3 指针与函数 46
2.4 动态内存分配 48
2.4.1 堆内存 48
2.4.2 函数 malloc 和 free 49
2.4.3 动态分配数组和字符串 50
2.4.4 指向堆内存和函数的指针 52
2.5 C 中的数组 53
2.5.1 一维数组 53
2.5.2 二维数组 56
2.6 C 字符串和字符串库 62
2.6.1 C 语言对静态分配字符串(char 数组)的支持 62
2.6.2 动态分配字符串 63
2.6.3 用于操作 C 字符串和字符的库 64
2.7 C 结构体 71
2.7.1 复习 C 结构体类型 71
2.7.2 指针和结构体 73
2.7.3 结构体中的指针字段 74
2.7.4 结构体数组 76
2.7.5 自引用结构体 77
2.8 C 中的 I/O(标准 I/O 和文件 I/O) 79
2.8.1 标准 I/O 79
2.8.2 文件 I/O 83
2.8.3 在 C 程序中使用文本文件 83
2.8.4 stdio.h 中的标准 I/O 和文件 I/O 函数 84
2.9 C 语言的一些*特性 87
2.9.1 switch 语句 87
2.9.2 命令行参数 89
2.9.3 void *类型及类型转换 90
2.9.4 指针运算 91
2.9.5 C 库的使用、编译和链接 95
2.9.6 编写和使用自己的 C 库 100
2.9.7 编译 C 源文件为汇编代码,以及编译并链接汇编代码 104
2.10 总结 107
第 3 章 C 调试工具 108
3.1 使用 GDB 调试程序 108
3.1.1 GDB 入门 109
3.1.2 GDB 会话示例 110
3.2 GDB 命令详情 118
3.2.1 GDB 常用快捷键 118
3.2.2 常用 GDB 命令 118
3.3 利用 Valgrind 调试内存 124
3.3.1 堆内存访问错误示例 125
3.3.2 如何使用 Memcheck 调试工具 127
3.4 GDB *功能 129
3.4.1 GDB 和 make 命令 129
3.4.2 将 GDB 附加到正在运行的进程 129
3.4.3 跟踪分叉进程 130
3.4.4 信号控制 131
3.4.5 DDD 设置和 bug 修复 131
3.5 调试汇编代码 131
3.5.1 使用 GDB 检查二进制代码 132
3.5.2 在汇编代码级别使用 DDD 进行调试 133
3.5.3 GDB 汇编代码调试命令和示例 134
3.5.4 汇编调试常用命令快速摘要 135
3.6 使用 GDB 调试多线程程序 135
3.6.1 GDB 和线程 136
3.6.2 GDB 线程特定命令 136
3.6.3 示例 137
3.7 总结 139
第 4 章 二进制与数据表示法 140
4.1 基数和无符号数 142
4.1.1 十进制数 142
4.1.2 无符号二进制数 143
4.1.3 十六进制 144
4.1.4 存储限制 145
4.2 数制转换 146
4.2.1 二进制和十六进制之间的转换 146
4.2.2 转换为十进制 147
4.2.3 从十进制转换 147
4.3 有符号二进制数 149
4.3.1 原码 149
4.3.2 补码 150
4.4 二进制算术运算 153
4.4.1 加法 153
4.4.2 减法 155
4.4.3 乘法和除法 155
4.5 溢出 156
4.5.1 用里程表作类比 156
4.5.2 二进制溢出 157
4.5.3 溢出总结 160
4.5.4 溢出后果 160
4.6 位运算符 161
4.6.1 按位与(AND) 161
4.6.2 按位或(OR) 162
4.6.3 按位异或(XOR) 163
4.6.4 按位非(NOT) 163
4.6.5 移位 164
4.7 整数字节序 165
4.8 二进制中的实数 167
4.8.1 定点数表示法 167
4.8.2 浮点数表示法 168
4.8.3 舍入结果 169
4.9 总结 169
第 5 章 冯 诺依曼计算机体系结构 171
5.1 现代计算机体系结构的起源 172
5.1.1 图灵机 173
5.1.2 早期电子计算机 173
5.1.3 冯·诺依曼知道些什么 175
5.2 冯 诺依曼体系结构 175
5.2.1 CPU 176
5.2.2 运算器 176
5.2.3 控制器 176
5.2.4 存储器 176
5.2.5 输入/输出(I/O)设备 177
5.2.6 冯·诺依曼计算机的运行:执行程序 177
5.3 逻辑门 179
5.3.1 基础逻辑门 179
5.3.2 其他逻辑门 180
5.4 电路 181
5.4.1 算术/逻辑电路 182
5.4.2 控制电路 186
5.4.3 存储电路 190
5.4.4 RS 锁存器 190
5.5 构建处理器:将它们放在一起 193
5.5.1 ALU 193
5.5.2 寄存器堆 195
5.5.3 CPU 196
5.6 处理器执行程序指令 197
5.6.1 时钟驱动程序指令的执行 200
5.6.2 将它们放在一起:完整计算机中的 CPU 201
5.7 流水线:让 CPU 更快 202
5.8 *流水线指令注意事项 204
5.8.1 流水线注意事项:数据冒险 204
5.8.2 流水线冒险:控制冒险 205
5.9 展望未来:现代 CPU 技术 207
5.9.1 指令级并行 207
5.9.2 多核和硬件多线程 208
5.9.3 一些处理器示例 210
5.10 总结 210
第 6 章 C 语言底层:深入理解汇编 212
6.1 学习汇编的好处 212
6.2 你将在接下来的章节中学到什么 214
第 7 章 64 位 x86(x86-64)汇编 215
7.1 x86-64 汇编基础知识 216
7.1.1 寄存器 217
7.1.2 *寄存器符号 217
7.1.3 指令结构 218
7.1.4 操作数示例 219
7.1.5 指令后缀 220
7.2 常见指令 220
7.3 算术指令 226
7.3.1 移位指令 226
7.3.2 位指令 227
7.3.3 加载有效地址指令 228
7.4 条件和循环 228
7.4.1 预备知识 228
7.4.2 汇编中的 if 语句 232
7.4.3 汇编中的循环语句 237
7.5 汇编中的函数 242
7.5.1 函数参数 243
7.5.2 通过示例进行追踪 243
7.5.3 通过 main 函数进行追踪 245
7.6 递归函数 257
7.7 数组 259
7.8 矩阵 261
7.8.1 连续二维数组 262
7.8.2 非连续矩阵 264
7.9 汇编中的结构体 267
7.10 真实世界:缓存区溢出 270
7.10.1 缓存区溢出*案例 270
7.10.2 初步探索:猜谜游戏 271
7.10.3 进一步了解(在C 环境下) 272
7.10.4 缓存区溢出:*尝试 275
7.10.5 更聪明的缓存区溢出:再次尝试 276
7.10.6 缓存区溢出防御 278
第 8 章 32 位 x86(IA32)汇编 281
8.1 IA32 汇编基础知识 282
8.1.1 寄存器 283
8.1.2 *寄存器符号 283
8.1.3 指令结构 284
8.1.4 操作数示例 284
8.1.5 指令后缀 285
8.2 常见指令 286
8.3 算术指令 291
8.3.1 移位指令 291
8.3.2 位指令 292
8.3.3 加载有效地址指令 292
8.4 条件和循环 293
8.4.1 预备知识 293
8.4.2 汇编中的 if 语句 296
8.4.3 汇编中的循环语句 301
8.5 汇编中的函数 305
8.5.1 通过示例进行追踪 307
8.5.2 通过 main 函数进行追踪 308
8.6 递归函数 322
8.7 数组 323
8.8 矩阵 326
8.8.1 连续二维数组 327
8.8.2 非连续矩阵 328
8.9 汇编中的结构体 331
8.10 真实世界:缓存区溢出 334
8.10.1 缓存区溢出*案例 334
8.10.2 初步探索:猜谜游戏 334
8.10.3 进一步了解(在C 环境下) 336
8.10.4 缓存区溢出:*尝试 338
8.10.5 更聪明的缓存区溢出:再次尝试 340
8.10.6 缓存区溢出防御 341
第 9 章 ARM 汇编 345
9.1 ARM 汇编基础知识 346
9.1.1 寄存器 347
9.1.2 *寄存器符号 347
9.1.3 指令结构 348
9.1.4 操作数示例 348
9.2 常见指令 349
9.3 算术指令 354
9.3.1 移位指令 355
9.3.2 位指令 356
9.4 条件和循环 356
9.4.1 预备知识 356
9.4.2 汇编中的 if 语句 360
9.4.3 汇编中的循环语句 365
9.5 汇编中的函数 370
9.5.1 函数参数 372
9.5.2 通过示例进行追踪 372
9.5.3 通过 main 函数进行追踪 373
9.6 递归函数 385
9.7 数组 387
9.8 矩阵 390
9.8.1 连续二维数组 391
9.8.2 非连续矩阵 393
9.9 汇编中的结构体 395
9.10 真实世界:缓存区溢出 398
9.10.1 缓存区溢出*案例 399
9.10.2 初步探索:猜谜游戏 399
9.10.3 进一步了解(在C 环境下) 400
9.10.4 缓存区溢出:*尝试 403
9.10.5 更聪明的缓存区溢出:再次尝试 404
9.10.6 缓存区溢出防御 406
第 10 章 汇编要点 409
10.1 共同特点 409
10.2 进一步阅读 410
第 11 章 存储和内存层次结构 411
11.1 内存层次结构 412
11.2 存储设备 413
11.2.1 主存储设备 414
11.2.2 辅助存储设备 415
11.3 局部性 417
11.3.1 代码中的局部性示例 418
11.3.2 从局部性到缓存 419
11.3.3 时间局部性 420
11.3.4 空间局部性 421
11.4 CPU 缓存 421
11.4.1 直接映射缓存 422
11.4.2 缓存未命中和关联设计 429
11.4.3 集合关联缓存 430
11.5 缓存分析和 Valgrind 434
11.5.1 理论分析和基准测试 436
11.5.2 现实世界中的缓存分析:Cachegrind 437
11.6 展望未来:多核处理器上的缓存 439
11.6.1 缓存一致性 441
11.6.2 MSI 协议 441
11.6.3 实现缓存一致性协议 443
11.6.4 有关多核缓存的更多信息 443
11.7 总结 444
第 12 章 代码优化 445
12.1 优化之前:了解编译器 445
12.1.1 编译器已经做了什么 445
12.1.2 编译器无法始终完成的任务:学习代码优化的好处 447
12.1.3 与编译器合作:一个示例程序 450
12.2 代码优化第 一步:代码分析 451
12.2.1 使用Callgrind 进行性能分析 453
12.2.2 循环不变代码移动 455
12.3 其他编译器优化技术:循环展开和函数内联 457
12.3.1 函数内联 457
12.3.2 循环展开 458
12.4 内存注意事项 460
12.4.1 循环交换 460
12.4.2 用于改进局部性的其他一些编译器优化技术:循环裂变和融合 461
12.4.3 使用 Massif 进行内存分析 463
12.5 总结 465
第 13 章 操作系统 467
13.1 操作系统的工作原理及运行方式 468
13.1.1 操作系统的引导过程 469
13.1.2 让操作系统执行任务:中断和陷阱 469
13.2 进程 472
13.2.1 多道程序设计和上下文切换 472
13.2.2 进程状态 473
13.2.3 创建(和销毁)进程 475
13.2.4 退出和等待 480
13.3 虚拟内存 482
13.3.1 内存地址 484
13.3.2 虚拟地址到物理地址的转换 485
13.3.3 分页 486
13.3.4 内存效率 492
13.4 进程间通信 494
13.4.1 信号 495
13.4.2 消息传递 499
13.4.3 共享内存 500
13.5 总结 501
第 14 章 在多核时代利用共享内存 503
14.1 编程多核系统 505
14.1.1 多核系统对进程执行的影响 505
14.1.2 使用线程加速进程执行 506
14.2 编写你的第 一个多线程程序 508
14.2.1 创建和加入线程 509
14.2.2 线程函数 511
14.2.3 运行代码 511
14.2.4 重新审视标量乘法 512
14.2.5 改进标量乘法:传递多个参数 514
14.3 线程同步 515
14.3.1 互斥 521
14.3.2 信号量 528
14.3.3 其他同步机制 529
14.4 并行程序的性能测量 534
14.4.1 并行程序性能测量基础 534
14.4.2 并行程序性能测量进阶 537
14.5 缓存一致性和虚假共享 538
14.5.1 多核系统中的缓存 539
14.5.2 虚假共享 540
14.5.3 解决虚假共享 542
14.6 线程* 543
14.7 OpenMP 中的隐式线程 547
14.7.1 常用编译指示 548
14.7.2 为 OpenMP 增添趣味 548
14.7.3 一个更复杂的示例:OpenMP 中的 CountSort 算法 550
14.7.4 了解更多关于 OpenMP 的知识 552
14.8 总结 552
第 15 章 展望:其他并行系统和并行编程模型 554
15.1 异构计算:硬件加速器、GPGPU 计算和 CUDA 555
15.1.1 硬件加速器 555
15.1.2 GPU 体系结构简介 556
15.1.3 GPGPU 计算 557
15.1.4 CUDA 557
15.1.5 其他 GPGPU 编程语言 561
15.2 分布式内存系统、消息传递和MPI 561
15.2.1 并行和分布式处理模型 563
15.2.2 通信协议 563
15.2.3 消息传递接口 564
15.2.4 MPI Hello World 564
15.2.5 MPI 标量乘法 566
15.2.6 分布式内存系统面临的挑战 572
15.3 迈向百亿亿次计算:云计算、大数据和计算科学的未来 572
15.3.1 云计算 574
15.3.2 MapReduce 575
15.3.3 展望未来:机遇与挑战 579
定价:179.8
ISBN:9787115638151
作者:[美]苏珊娜·J. 马修斯(Suzanne J. Matthews) 蒂亚·纽霍尔(Tia Newhall) 凯文·C. 韦布(Kevin C. Web
版次:第1版
出版时间:2026-01
内容提要:
计算机系统是计算机专业的常见课程,也是学习编程过程中的重要学习内容。本书是计算机系统的入门图书,介绍了现代计算机系统的主要硬件和软件。本书按抽象层次设置各章节,从常用于编写操作系统的 C 语言基础知识逐步衍生,先介绍现代计算机的组成、结构、操作系统原理、汇编语言,再介绍各种计算机体系结构的代码优化方法、使用共享内存实现并行计算、多核 CPU环境下的内存管理等。 本书适合作为计算机系统相关课程的教材,也适合有编程基础的人阅读。
作者简介:
苏珊娜·J. 马修斯,西点军校计算机科学副教授。 蒂亚·纽霍尔,斯沃斯莫尔学院计算机科学教授。 凯文·C. 韦布,斯沃斯莫尔学院计算机科学副教授。
目录:
第 1 章 靠近 C,靠近 C,靠近美丽的 C 1
1.1 开始使用 C 编程 2
1.1.1 编译和运行 C 程序 4
1.1.2 C 类型 6
1.2 输入和输出(函数 printf 和 scanf) 9
1.2.1 printf 函数 9
1.2.2 scanf 函数 11
1.3 条件和循环 13
1.3.1 C 中的布尔值 15
1.3.2 C 中的循环 16
1.4 函数 20
1.5 数组和字符串 25
1.5.1 数组介绍 25
1.5.2 数组访问方法 27
1.5.3 数组和函数 28
1.5.4 C 字符串和字符串库介绍 30
1.6 结构体 31
1.6.1 定义结构体类型 32
1.6.2 声明结构体类型的变量 32
1.6.3 访问字段值 33
1.6.4 向函数传递结构体 36
1.7 总结 39
第 2 章 深入理解 C 语言 40
2.1 程序内存的组成部分和作用域 40
2.2 C 指针变量 43
2.3 指针与函数 46
2.4 动态内存分配 48
2.4.1 堆内存 48
2.4.2 函数 malloc 和 free 49
2.4.3 动态分配数组和字符串 50
2.4.4 指向堆内存和函数的指针 52
2.5 C 中的数组 53
2.5.1 一维数组 53
2.5.2 二维数组 56
2.6 C 字符串和字符串库 62
2.6.1 C 语言对静态分配字符串(char 数组)的支持 62
2.6.2 动态分配字符串 63
2.6.3 用于操作 C 字符串和字符的库 64
2.7 C 结构体 71
2.7.1 复习 C 结构体类型 71
2.7.2 指针和结构体 73
2.7.3 结构体中的指针字段 74
2.7.4 结构体数组 76
2.7.5 自引用结构体 77
2.8 C 中的 I/O(标准 I/O 和文件 I/O) 79
2.8.1 标准 I/O 79
2.8.2 文件 I/O 83
2.8.3 在 C 程序中使用文本文件 83
2.8.4 stdio.h 中的标准 I/O 和文件 I/O 函数 84
2.9 C 语言的一些*特性 87
2.9.1 switch 语句 87
2.9.2 命令行参数 89
2.9.3 void *类型及类型转换 90
2.9.4 指针运算 91
2.9.5 C 库的使用、编译和链接 95
2.9.6 编写和使用自己的 C 库 100
2.9.7 编译 C 源文件为汇编代码,以及编译并链接汇编代码 104
2.10 总结 107
第 3 章 C 调试工具 108
3.1 使用 GDB 调试程序 108
3.1.1 GDB 入门 109
3.1.2 GDB 会话示例 110
3.2 GDB 命令详情 118
3.2.1 GDB 常用快捷键 118
3.2.2 常用 GDB 命令 118
3.3 利用 Valgrind 调试内存 124
3.3.1 堆内存访问错误示例 125
3.3.2 如何使用 Memcheck 调试工具 127
3.4 GDB *功能 129
3.4.1 GDB 和 make 命令 129
3.4.2 将 GDB 附加到正在运行的进程 129
3.4.3 跟踪分叉进程 130
3.4.4 信号控制 131
3.4.5 DDD 设置和 bug 修复 131
3.5 调试汇编代码 131
3.5.1 使用 GDB 检查二进制代码 132
3.5.2 在汇编代码级别使用 DDD 进行调试 133
3.5.3 GDB 汇编代码调试命令和示例 134
3.5.4 汇编调试常用命令快速摘要 135
3.6 使用 GDB 调试多线程程序 135
3.6.1 GDB 和线程 136
3.6.2 GDB 线程特定命令 136
3.6.3 示例 137
3.7 总结 139
第 4 章 二进制与数据表示法 140
4.1 基数和无符号数 142
4.1.1 十进制数 142
4.1.2 无符号二进制数 143
4.1.3 十六进制 144
4.1.4 存储限制 145
4.2 数制转换 146
4.2.1 二进制和十六进制之间的转换 146
4.2.2 转换为十进制 147
4.2.3 从十进制转换 147
4.3 有符号二进制数 149
4.3.1 原码 149
4.3.2 补码 150
4.4 二进制算术运算 153
4.4.1 加法 153
4.4.2 减法 155
4.4.3 乘法和除法 155
4.5 溢出 156
4.5.1 用里程表作类比 156
4.5.2 二进制溢出 157
4.5.3 溢出总结 160
4.5.4 溢出后果 160
4.6 位运算符 161
4.6.1 按位与(AND) 161
4.6.2 按位或(OR) 162
4.6.3 按位异或(XOR) 163
4.6.4 按位非(NOT) 163
4.6.5 移位 164
4.7 整数字节序 165
4.8 二进制中的实数 167
4.8.1 定点数表示法 167
4.8.2 浮点数表示法 168
4.8.3 舍入结果 169
4.9 总结 169
第 5 章 冯 诺依曼计算机体系结构 171
5.1 现代计算机体系结构的起源 172
5.1.1 图灵机 173
5.1.2 早期电子计算机 173
5.1.3 冯·诺依曼知道些什么 175
5.2 冯 诺依曼体系结构 175
5.2.1 CPU 176
5.2.2 运算器 176
5.2.3 控制器 176
5.2.4 存储器 176
5.2.5 输入/输出(I/O)设备 177
5.2.6 冯·诺依曼计算机的运行:执行程序 177
5.3 逻辑门 179
5.3.1 基础逻辑门 179
5.3.2 其他逻辑门 180
5.4 电路 181
5.4.1 算术/逻辑电路 182
5.4.2 控制电路 186
5.4.3 存储电路 190
5.4.4 RS 锁存器 190
5.5 构建处理器:将它们放在一起 193
5.5.1 ALU 193
5.5.2 寄存器堆 195
5.5.3 CPU 196
5.6 处理器执行程序指令 197
5.6.1 时钟驱动程序指令的执行 200
5.6.2 将它们放在一起:完整计算机中的 CPU 201
5.7 流水线:让 CPU 更快 202
5.8 *流水线指令注意事项 204
5.8.1 流水线注意事项:数据冒险 204
5.8.2 流水线冒险:控制冒险 205
5.9 展望未来:现代 CPU 技术 207
5.9.1 指令级并行 207
5.9.2 多核和硬件多线程 208
5.9.3 一些处理器示例 210
5.10 总结 210
第 6 章 C 语言底层:深入理解汇编 212
6.1 学习汇编的好处 212
6.2 你将在接下来的章节中学到什么 214
第 7 章 64 位 x86(x86-64)汇编 215
7.1 x86-64 汇编基础知识 216
7.1.1 寄存器 217
7.1.2 *寄存器符号 217
7.1.3 指令结构 218
7.1.4 操作数示例 219
7.1.5 指令后缀 220
7.2 常见指令 220
7.3 算术指令 226
7.3.1 移位指令 226
7.3.2 位指令 227
7.3.3 加载有效地址指令 228
7.4 条件和循环 228
7.4.1 预备知识 228
7.4.2 汇编中的 if 语句 232
7.4.3 汇编中的循环语句 237
7.5 汇编中的函数 242
7.5.1 函数参数 243
7.5.2 通过示例进行追踪 243
7.5.3 通过 main 函数进行追踪 245
7.6 递归函数 257
7.7 数组 259
7.8 矩阵 261
7.8.1 连续二维数组 262
7.8.2 非连续矩阵 264
7.9 汇编中的结构体 267
7.10 真实世界:缓存区溢出 270
7.10.1 缓存区溢出*案例 270
7.10.2 初步探索:猜谜游戏 271
7.10.3 进一步了解(在C 环境下) 272
7.10.4 缓存区溢出:*尝试 275
7.10.5 更聪明的缓存区溢出:再次尝试 276
7.10.6 缓存区溢出防御 278
第 8 章 32 位 x86(IA32)汇编 281
8.1 IA32 汇编基础知识 282
8.1.1 寄存器 283
8.1.2 *寄存器符号 283
8.1.3 指令结构 284
8.1.4 操作数示例 284
8.1.5 指令后缀 285
8.2 常见指令 286
8.3 算术指令 291
8.3.1 移位指令 291
8.3.2 位指令 292
8.3.3 加载有效地址指令 292
8.4 条件和循环 293
8.4.1 预备知识 293
8.4.2 汇编中的 if 语句 296
8.4.3 汇编中的循环语句 301
8.5 汇编中的函数 305
8.5.1 通过示例进行追踪 307
8.5.2 通过 main 函数进行追踪 308
8.6 递归函数 322
8.7 数组 323
8.8 矩阵 326
8.8.1 连续二维数组 327
8.8.2 非连续矩阵 328
8.9 汇编中的结构体 331
8.10 真实世界:缓存区溢出 334
8.10.1 缓存区溢出*案例 334
8.10.2 初步探索:猜谜游戏 334
8.10.3 进一步了解(在C 环境下) 336
8.10.4 缓存区溢出:*尝试 338
8.10.5 更聪明的缓存区溢出:再次尝试 340
8.10.6 缓存区溢出防御 341
第 9 章 ARM 汇编 345
9.1 ARM 汇编基础知识 346
9.1.1 寄存器 347
9.1.2 *寄存器符号 347
9.1.3 指令结构 348
9.1.4 操作数示例 348
9.2 常见指令 349
9.3 算术指令 354
9.3.1 移位指令 355
9.3.2 位指令 356
9.4 条件和循环 356
9.4.1 预备知识 356
9.4.2 汇编中的 if 语句 360
9.4.3 汇编中的循环语句 365
9.5 汇编中的函数 370
9.5.1 函数参数 372
9.5.2 通过示例进行追踪 372
9.5.3 通过 main 函数进行追踪 373
9.6 递归函数 385
9.7 数组 387
9.8 矩阵 390
9.8.1 连续二维数组 391
9.8.2 非连续矩阵 393
9.9 汇编中的结构体 395
9.10 真实世界:缓存区溢出 398
9.10.1 缓存区溢出*案例 399
9.10.2 初步探索:猜谜游戏 399
9.10.3 进一步了解(在C 环境下) 400
9.10.4 缓存区溢出:*尝试 403
9.10.5 更聪明的缓存区溢出:再次尝试 404
9.10.6 缓存区溢出防御 406
第 10 章 汇编要点 409
10.1 共同特点 409
10.2 进一步阅读 410
第 11 章 存储和内存层次结构 411
11.1 内存层次结构 412
11.2 存储设备 413
11.2.1 主存储设备 414
11.2.2 辅助存储设备 415
11.3 局部性 417
11.3.1 代码中的局部性示例 418
11.3.2 从局部性到缓存 419
11.3.3 时间局部性 420
11.3.4 空间局部性 421
11.4 CPU 缓存 421
11.4.1 直接映射缓存 422
11.4.2 缓存未命中和关联设计 429
11.4.3 集合关联缓存 430
11.5 缓存分析和 Valgrind 434
11.5.1 理论分析和基准测试 436
11.5.2 现实世界中的缓存分析:Cachegrind 437
11.6 展望未来:多核处理器上的缓存 439
11.6.1 缓存一致性 441
11.6.2 MSI 协议 441
11.6.3 实现缓存一致性协议 443
11.6.4 有关多核缓存的更多信息 443
11.7 总结 444
第 12 章 代码优化 445
12.1 优化之前:了解编译器 445
12.1.1 编译器已经做了什么 445
12.1.2 编译器无法始终完成的任务:学习代码优化的好处 447
12.1.3 与编译器合作:一个示例程序 450
12.2 代码优化第 一步:代码分析 451
12.2.1 使用Callgrind 进行性能分析 453
12.2.2 循环不变代码移动 455
12.3 其他编译器优化技术:循环展开和函数内联 457
12.3.1 函数内联 457
12.3.2 循环展开 458
12.4 内存注意事项 460
12.4.1 循环交换 460
12.4.2 用于改进局部性的其他一些编译器优化技术:循环裂变和融合 461
12.4.3 使用 Massif 进行内存分析 463
12.5 总结 465
第 13 章 操作系统 467
13.1 操作系统的工作原理及运行方式 468
13.1.1 操作系统的引导过程 469
13.1.2 让操作系统执行任务:中断和陷阱 469
13.2 进程 472
13.2.1 多道程序设计和上下文切换 472
13.2.2 进程状态 473
13.2.3 创建(和销毁)进程 475
13.2.4 退出和等待 480
13.3 虚拟内存 482
13.3.1 内存地址 484
13.3.2 虚拟地址到物理地址的转换 485
13.3.3 分页 486
13.3.4 内存效率 492
13.4 进程间通信 494
13.4.1 信号 495
13.4.2 消息传递 499
13.4.3 共享内存 500
13.5 总结 501
第 14 章 在多核时代利用共享内存 503
14.1 编程多核系统 505
14.1.1 多核系统对进程执行的影响 505
14.1.2 使用线程加速进程执行 506
14.2 编写你的第 一个多线程程序 508
14.2.1 创建和加入线程 509
14.2.2 线程函数 511
14.2.3 运行代码 511
14.2.4 重新审视标量乘法 512
14.2.5 改进标量乘法:传递多个参数 514
14.3 线程同步 515
14.3.1 互斥 521
14.3.2 信号量 528
14.3.3 其他同步机制 529
14.4 并行程序的性能测量 534
14.4.1 并行程序性能测量基础 534
14.4.2 并行程序性能测量进阶 537
14.5 缓存一致性和虚假共享 538
14.5.1 多核系统中的缓存 539
14.5.2 虚假共享 540
14.5.3 解决虚假共享 542
14.6 线程* 543
14.7 OpenMP 中的隐式线程 547
14.7.1 常用编译指示 548
14.7.2 为 OpenMP 增添趣味 548
14.7.3 一个更复杂的示例:OpenMP 中的 CountSort 算法 550
14.7.4 了解更多关于 OpenMP 的知识 552
14.8 总结 552
第 15 章 展望:其他并行系统和并行编程模型 554
15.1 异构计算:硬件加速器、GPGPU 计算和 CUDA 555
15.1.1 硬件加速器 555
15.1.2 GPU 体系结构简介 556
15.1.3 GPGPU 计算 557
15.1.4 CUDA 557
15.1.5 其他 GPGPU 编程语言 561
15.2 分布式内存系统、消息传递和MPI 561
15.2.1 并行和分布式处理模型 563
15.2.2 通信协议 563
15.2.3 消息传递接口 564
15.2.4 MPI Hello World 564
15.2.5 MPI 标量乘法 566
15.2.6 分布式内存系统面临的挑战 572
15.3 迈向百亿亿次计算:云计算、大数据和计算科学的未来 572
15.3.1 云计算 574
15.3.2 MapReduce 575
15.3.3 展望未来:机遇与挑战 579
- 人民邮电出版社有限公司 (微信公众号认证)
- 人民邮电出版社微店,为您提供最全面,最专业的一站式购书服务
- 扫描二维码,访问我们的微信店铺
- 随时随地的购物、客服咨询、查询订单和物流...