新書推薦:

《
奇迹时刻:获得全新的认知与领悟,如何爱自己,打破原生家庭限制,找寻真正的自由与自爱
》
售價:NT$
305

《
学会卓越
》
售價:NT$
510

《
365日自我肯定之书:你是你自己人生的主角!增强自我肯定感
》
售價:NT$
356

《
小儿推拿轻松学,脾肺同养百病消
》
售價:NT$
184

《
海洋之思:俄罗斯的海洋观(1997~2021)
》
售價:NT$
653

《
国语(全二册)中国古代史学丛书
》
售價:NT$
653

《
新安医学古籍整理发掘研究
》
售價:NT$
500

《
如何提出一个好问题(全新升级版)
》
售價:NT$
561
|
| 編輯推薦: |
【权威作者与专业翻译】国外计算机领域专家联袂撰写,精准传递核心知识。 【分层递进体系清晰】按抽象层次编排内容,从 C 语言基础逐步延伸至硬件架构、汇编语言、并行计算等,呈现完整计算机系统全景图。 【软硬件全覆盖】涵盖计算机组成、操作系统、内存管理、代码优化、多核编程等核心主题,兼顾理论与实践,满足多维度学习需求。 【实用工具与安全案例】详解 GDB、Valgrind 等调试工具,剖析缓存区溢出等经典安全问题,助力提升工程实践与问题排查能力。 【适配多场景使用】既可作为计算机系统相关课程教材,也适合有编程基础的从业者自学,部分章节可作为高级课程背景阅读材料。 【资源与时俱进】内容紧跟计算机领域发展,涵盖云计算、MapReduce 等前沿主题,适配多核时代需求。
|
| 內容簡介: |
计算机系统是计算机专业的常见课程,也是学习编程过程中的重要学习内容。本书是计算机系统的入门图书,介绍了现代计算机系统的主要硬件和软件。本书按抽象层次设置各章节,从常用于编写操作系统的 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
|
|