计算机科学丛书:深入理解计算机系统.pdf

计算机科学丛书:深入理解计算机系统.pdf
 

书籍描述

编辑推荐
《深入理解计算机系统》:计算机科学丛书。

媒体推荐
“2005年,我开始采用Bryant和O’Hallaron的这本书作为本科生计算机系统课程的教材。现今,这本书仍然是我的计算机系统课程教科书的首选。”
  ——Mirela Damian,维拉诺瓦大学
“本书表述清晰、恰到好处——举重若轻地呈现了那些非常复杂的内容。”
  ——Ibrahim Matta,波士顿大学
“这是一本学习计算机硬件和软件如何‘真正’协同工作的好书,还教会你为什么了解这些知识会使你成为一个更有价值的程序员。本书还帮你为学习像操作系统和编译器这样的高级课程做好准备。在本书中,我最喜欢的章节是关于缓存的,当我第一次发现缓存有多重要时,真是难以置信!”
  ——Vishal Shah,Ask.com总架构师

作者简介
作者:(美国)布莱恩特(Randal E.Bryant) (美国)奥哈拉伦(David R.O'Hallaron) 译者:龚奕利 雷迎春

Randal E. Bryant,1973年于密歇根大学(University of Michigan)获得学士学位,随即就读于麻省理工学院(Massachusetts Institute of Technology)的研究生院,并在1981年获计算机博士学位。他在加州理工学院(California Institute of Technology)做了三年助教,从1984年至今一直是卡内基梅隆大学(Carnegie Mellon)的教师。他现在是计算机科学的大学教授(university professor)和计算机科学学院的院长。他同时还受邀于电子和计算机工程系。
David R.O'Hallaron,拥有弗吉尼亚大学计算机科学博士学位,现为Intel兹堡实验室主任,卡内基-梅隆大学计算机科学和电子与计算机工程副教授。他曾获得卡内基-梅隆大学计算机科学学院颁发的Herbert Simon杰出教学奖,并同Quake项目中其他成员一起获得了高性能计算领域中的最高国际奖项——Gordon Bell奖。

目录
出版者的话
译者序
前言
第1章 计算机系统漫游 1
1.1 信息就是位+上下文 1
1.2 程序被其他程序翻译成不同的格式 3
1.3 了解编译系统如何工作是大有益处的 4
1.4 处理器读并解释存储在存储器中的指令 5
1.4.1 系统的硬件组成 5
1.4.2 运行hello程序 7
1.5 高速缓存至关重要 7
1.6 存储设备形成层次结构 9
1.7 操作系统管理硬件 10
1.7.1 进程 11
1.7.2 线程 12
1.7.3 虚拟存储器 12
1.7.4 文件 13
1.8 系统之间利用网络通信 13
1.9 重要主题 15
1.9.1 并发和并行 15
1.9.2 计算机系统中抽象的重要性 17
1.10 小结 17
参考文献说明 18

第一部分 程序结构和执行
第2章 信息的表示和处理 20
2.1 信息存储 22
2.1.1 十六进制表示法 22
2.1.2 字 25
2.1.3 数据大小 25
2.1.4 寻址和字节顺序 26
2.1.5 表示字符串 31
2.1.6 表示代码 31
2.1.7 布尔代数简介 32
2.1.8 C语言中的位级运算 34
2.1.9 C语言中的逻辑运算 36
2.1.10 V语言中的移位运算 36
2.2 整数表示 38
2.2.1 整型数据类型 38
2.2.2 无符号数的编码 39
2.2.3 补码编码 40
2.2.4 有符号数和无符号数之间的转换 44
2.2.5 C语言中的有符号数与无符号数 47
2.2.6 扩展一个数字的位表示 49
2.2.7 截断数字 51
2.2.8 关于有符号数与无符号数的建议 52
2.3 整数运算 54
2.3.1 无符号加法 54
2.3.2 补码加法 57
2.3.3 补码的非 59
2.3.4 无符号乘法 60
2.3.5 补码乘法 60
2.3.6 乘以常数 63
2.3.7 除以2的幂 64
2.3.8 关于整数运算的最后思考 67
2.4 浮点数 67
2.4.1 二进制小数 68
2.4.2 IEEE浮点表示 70
2.4.3 数字示例 71
2.4.4 舍入 74
2.4.5 浮点运算 76
2.4.6 C语言中的浮点数 77
2.5 小结 79
参考文献说明 80
家庭作业 80
练习题答案 90

第3章 程序的机器级表示 102
3.1 历史观点 103
3.2 程序编码 105
3.2.1 机器级代码 106
3.2.2 代码示例 107
3.2.3 关于格式的注解 109
3.3 数据格式 111
3.4 访问信息 112
3.4.1 操作数指示符 112
3.4.2 数据传送指令 114
3.4.3 数据传送示例 116
3.5 算术和逻辑操作 118
3.5.1 加载有效地址 118
3.5.2 一元操作和二元操作 119
3.5.3 移位操作 120
3.5.4 讨论 120
3.5.5 特殊的算术操作 122
3.6 控制 123
3.6.1 条件码 124
3.6.2 访问条件码 125
3.6.3 跳转指令及其编码 127
3.6.4 翻译条件分支 129
3.6.5 循环 132
3.6.6 条件传送指令 139
3.6.7 switch语句 144
3.7 过程 149
3.7.1 栈帧结构 149
3.7.2 转移控制 150
3.7.3 寄存器使用惯例 151
3.7.4 过程示例 152
3.7.5 递归过程 156
3.8 数组分配和访问 158
3.8.1 基本原则 158
3.8.2 指针运算 159
3.8.3 嵌套的数组 159
3.8.4 定长数组 161
3.8.5 变长数组 163
3.9 异质的数据结构 164
3.9.1 结构 164
3.9.2 联合 167
3.9.3 数据对齐 170
3.10 综合:理解指针 172
3.11 应用:使用GDB调试器 174
3.12 存储器的越界引用和缓冲区溢出 175
3.13 x86-64:将ia32扩展到64位 183
3.13.1 x86-64的历史和动因 184
3.13.2 x86-64简介 185
3.13.3 访问信息 187
3.13.4 控制 192
3.13.5 数据结构 200
3.13.6 关于x86-64的总结性评论 200
3.14 浮点程序的机器级表示 201
3.15 小结 201
参考文献说明 202
家庭作业 202
练习题答案 212

第4章 处理器体系结构2 30
4.1 Y86指令集体系结构 231
4.1.1 程序员可见的状态 231
4.1.2 Y86指令 232
4.1.3 指令编码 233
4.1.4 Y86异常 237
4.1.5 Y86程序 237
4.1.6 一些Y86指令的详情 241
4.2 逻辑设计和硬件控制语言HCL 242
4.2.1 逻辑门 243
4.2.2 组合电路和HCL布尔表达式 243
4.2.3 字级的组合电路和HCL整数表达式 245
4.2.4 集合关系 248
4.2.5 存储器和时钟 248
4.3 y86的顺序实现 250
4.3.1 将处理组织成阶段 250
4.3.2 SEQ硬件结构 258
4.3.3 SEQ的时序 259
4.3.4 SEQ阶段的实现 262
4.4 流水线的通用原理 267
4.4.1 计算流水线 268
4.4.2 流水线操作的详细说明 269
4.4.3 流水线的局限性 271
4.4.4 带反馈的流水线系统272
4.5 Y86的流水线实现273
4.5.1 SEQ+:重新安排计算阶段 273
4.5.2 插入流水线寄存器 276
4.5.3 对信号进行重新排列和标号 277
4.5.4 预测下一个PC 279
4.5.5 流水线冒险 280
4.5.6 用暂停来避免数据冒险 283
4.5.7 用转发来避免数据冒险 285
4.5.8 加载/使用数据冒险 288
4.5.9 异常处理 289
4.5.10 pipe各阶段的实现 291
4.5.11 流水线控制逻辑 297
4.5.12 性能分析 305
4.5.13 未完成的工作 306
4.6 小结 308
参考文献说明309
家庭作业309
练习题答案 314

第5章 优化程序性能 324
5.1 优化编译器的能力和局限性 325
5.2 表示程序性能 328
5.3 程序示例 330
5.4 消除循环的低效率 332
5.5 减少过程调用 336
5.6 消除不必要的存储器引用 336
5.7 理解现代处理器 340
5.7.1 整体操作 340
5.7.2 功能单元的性能 343
5.7.3 处理器操作的抽象模型 344
5.8 循环展开 348
5.9 提高并行性 351
5.9.1 多个累积变量 351
5.9.2 重新结合变换 354
5.10 优化合并代码的结果小结 358
5.11 一些限制因素 359
5.11.1 寄存器溢出359
5.11.2 分支预测和预测错误处罚 360
5.12 理解存储器性能 363
5.12.1 加载的性能 363
5.12.2 存储的性能 364
5.13 应用:性能提高技术 369
5.14 确认和消除性能瓶颈 369
5.14.1 程序剖析 370
5.14.2 使用剖析程序来指导优化 371
5.14.3 Amdahl定律 374
5.15 小结 375
参考文献说明 375
家庭作业 376
练习题答案 378

第6章 存储器层次结构 382
6.1 存储技术 382
6.1.1 随机访问存储器 383
6.1.2 磁盘存储 389
6.1.3 固态硬盘 398
6.1.4 存储技术趋势 399
6.2 局部性 401
6.2.1 对程序数据引用的局部性 402
6.2.2 取指令的局部性 403
6.2.3 局部性小结 403
6.3 存储器层次结构 405
6.3.1 存储器层次结构中的缓存 406
6.3.2 存储器层次结构概念小结 408
6.4 高速缓存存储器 408
6.4.1 通用的高速缓存存储器结构 409
6.4.2 直接映射高速缓存 410
6.4.3 组相联高速缓存 416
6.4.4 全相联高速缓存 418
6.4.5 有关写的问题 420
6.4.6 一个真实的高速缓存层次结构的解剖 421
6.4.7 高速缓存参数的性能影响 422
6.5 编写高速缓存友好的代码 423
6.6 综合:高速缓存对程序性能的影响 426
6.6.1 存储器山 426
6.6.2 重新排列循环以提高空间局部性 430
6.6.3 在程序中利用局部性 433
6.7 小结 433
参考文献说明 434
家庭作业 434
练习题答案 442

第二部分 在系统上运行程序
第7章 链接 448
7.1 编译器驱动程序 449
7.2 静态链接 450
7.3 目标文件 450
7.4 可重定位目标文件 451
7.5 符号和符号表 452
7.6 符号解析 454
7.6.1 链接器如何解析多重定义的全局符号 455
7.6.2 与静态库链接 457
7.6.3 链接器如何使用静态库来解析引用 460
7.7 重定位 461
7.7.1 重定位条目 461
7.7.2 重定位符号引用 462
7.8 可执行目标文件 465
7.9 加载可执行目标文件 466
7.10 动态链接共享库 467
7.11 从应用程序中加载和链接共享库 468
7.12 与位置无关的代码(PIC) 471
7.13 处理目标文件的工具 473
7.14 小结 473
参考文献说明 474
家庭作业 474
练习题答案 479

第8章 异常控制流 480
8.1 异常 481
8.1.1 异常处理 481
8.1.2 异常的类别 482
8.1.3 Linux/IA32系统中的异常 484
8.2 进程 487
8.2.1 逻辑控制流 487
8.2.2 并发流 487
8.2.3 私有地址空间488
8.2.4 用户模式和内核模式 488
8.2.5 上下文切换 489
8.3 系统调用错误处理 491
8.4 进程控制 492
8.4.1 获取进程ID 492
8.4.2 创建和终止进程 492
8.4.3 回收子进程 495
8.4.4 让进程休眠 499
8.4.5 加载并运行程序500
8.4.6 利用fork和execve运行程序502
8.5 信号 504
8.5.1 信号术语 505
8.5.2 发送信号 506
8.5.3 接收信号 509
8.5.4 信号处理问题 511

……
第9章 虚拟存储器 534
第10章 系统级I/O 596
第11章 网络编程 614
第12章 并发编程 648
附录A 错误处理 694

序言
本书通过程序员的视角来介绍计算机系统,首先把高级语言转换成计算机所能理解的一种中间格式(如汇编语言),然后描述计算机如何解释和执行这些中间格式的程序,系统的哪一部分影响程序的执行效率。在讲述计算机系统知识的同时,也给出了关于C语言和汇编语言的编程、阅读技巧以及基本的系统编程工具,还给出一些方法帮助程序员基于对计算机系统的理解来改善程序的性能等问题。本书强调对计算机系统概念的理解,但并不意味着不动手。如果按照本书的安排做每一章后面的习题,将有助于加深对正文所述概念和知识的理解,更可以从实际动手中学习到新的知识。
本书的主要内容是关于计算机体系结构与编译器和操作系统的交互,包括:数据表示,汇编语言和汇编级计算机体系结构,处理器设计,程序的性能度量和优化,程序的加载器、链接器和编译器,I/O和设备的存储器层次结构,虚拟存储器,外部存储管理,中断、信号和进程控制。
本书的最大优点是为程序员描述计算机系统的实现细节,帮助其在大脑中构造一个层次型的计算机系统,从最底层的数据在内存中的表示(如大多数程序员一直陌生或疑惑的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户态应用。贯串本书的一条主线是使程序员在设计程序时,能充分意识到计算机系统的重要性,建立起所写程序可能被执行的数据或指令流图,明白执行程序时到底发生了什么事,从而能设计出高效、可移植、健壮的程序,并能够更快地对程序排错、改进程序性能等。
原书是卡内基-梅隆大学(CMU)的教材,现在很多国内外著名的大学也选用其作为教材或辅助性资料,因此,本书的读者不仅仅是那些因为工作和兴趣而关注本书的人,还包括一些在校的大学生。我们认为,在校学生越早接触本书的内容,将越有利于他们学习计算机的相关课程,培养对计算机系统的研究兴趣。
总的来说,本书是一座桥梁,它帮助程序员衔接了计算机系统各个领域的知识,为程序员构造了一个概念性框架。要想获取更多关于计算机系统结构、操作系统、编译器、网络、并发编程方面的知识,还需要进一步阅读相关书籍。

文摘
插图:

计算机科学丛书:深入理解计算机系统

1.9 重要主题
在此,总结一下我们旋风式的系统漫游。这次讨论得出一个很重要的观点,那就是系统不仅仅只是硬件。系统是硬件和系统软件互相交织的集合体,它们必须共同协作以达到运行应用程序的最终目的。本书的余下部分会讲述硬件和软件的详细内容,通过了解这些详细内容,你可以写出更快速、更可靠和更安全的程序。
我们在此强调几个贯穿计算机系统所有方面的重要概念作为本章的结束。我们还会在本书中的多处讨论这些概念的重要性。
1.9.1 并发和并行
数字计算机的整个历史中,有两个需求是驱动进步的持续动力:一个是我们想要计算机做得更多,另一个是我们想要计算机运行得更快。当处理器同时能够做更多事情时,这两个因素都会改进。我们用的术语并发(concurrency)是一个通用的概念,指一个同时具有多个活动的系统;而术语并行(parallelism)指的是用并发使一个系统运行得更快。并行可以在计算机系统的多个抽象层次上运用。在此,我们按照系统层次结构中由高到低的顺序重点强调三个层次。
1.线程级并发
构建进程这个抽象,我们能够设计出同时执行多个程序的系统,这就导致了并发。使用线程,我们甚至能够在一个进程中执行多个控制流。从20世纪60年代初期出现时间共享以来,计算机系统中就开始有了对并发执行的支持。传统意义上,这种并发执行只是模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换的方式实现的,就好像一个杂技演员保持多个球在空中飞舞。这种并发形式允许多个用户同时与系统交互,例如,当许多人想要从一个Web服务器获取页面时。它还允许一个用户同时从事多个任务,例如,在一个窗口中开启Web浏览器,在另一窗口中运行字处理器,同时又播放音乐。在以前,即使处理器必须在多个任务间切换,大多数实际的计算也都是由一个处理器来完成的。这种配置称为单处理器系统。

内容简介
《深入理解计算机系统》从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/O、网络编程、并发编程等。书中提供子大量的例子和练习题,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。
《深入理解计算机系统》适合作为高等院校计算机及相关专业本科牛、研究生的教材,也可供想要写出更快、更可靠程序的程序员及专业技术人员参考。

海报:

计算机科学丛书:深入理解计算机系统

购买书籍

当当网购书 京东购书 卓越购书

PDF电子书下载地址

相关书籍

搜索更多