新闻资讯
看你所看,想你所想

深入理解计算机系统(原书第2版)

深入理解计算机系统(原书第2版)

深入理解计算机系统(原书第2版)

《深入理解计算机系统(原书第2版)》是2010年机械工业出版社出版的图书,作者是Randal E.Bryant、David R.O’Hallaron。

基本介绍

  • 书名:深入理解计算机系统(原书第2版)
  • 作者:(美)Randal E.Bryant / David R.O’Hallaron
  • 译者:龚奕利 / 雷迎春
  • ISBN:978-7-111-32133-0
  • 定价:99.00元
  • 出版社:机械工业出版社
  • 出版时间:2010年
  • 装帧:精装
  • 开本:16开

内容简介

本书从程式设计师的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影回响用程式的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程式的机器级表示、处理器体系结构、最佳化程式性能、存储器层次结构、连结、异常控制流、虚拟存储器、系统级I/O、网路编程、并发编程等。书中提供大量的例子和练习,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。
通过掌握程式是如何映射到系统上,以及程式是如何执行的,读者能够更好地理解程式的行为为什幺是这样的,以及效率低下是如何造成的。
本书适合那些想要写出更快、更可靠程式的程式设计师阅读,也适合作为高等院校计算机及相关专业本科生、研究生的教材。
本书的最大优点是为程式设计师描述计算机系统的实现细节,帮助其在大脑中构造一个层次型的计算机系统,从最底层的数据在记忆体中的表示到流水线指令的构成,到虚拟存储器,到编译系统,到动态载入库,到最后的用户态套用。

作者简介

Randal E.Bryant 1973年于密西根大学(University of Michigan)获得学士学位,随即就读于麻省理工学院的研究生院,并在1981年获计算机博士学位。他在加州理工学院(California Institute of Technology)做了三年助教,从1984年至今一直是卡内基-梅隆大学的教师。他现在是计算机科学的大学教授和计算机科学学院的院长。他同时还受邀于电子和计算机工程系。
他从事本科生和研究生计算机系统方面课程的教学超过30年。在讲授计算机体系结构课程多年后,他开始把关注点从如何设计计算机转移到程式设计师如何在更好的了解系统的情况下编写出更有效和更可靠的程式。他和O’Hallaron教授一起在卡内基梅隆大学开设了15-213“计算机系统导论”课程,那便是此书的基础。他还教授一些有关算法、编程、计算机网路和VLSI(超大规模积体电路)设计方面的课程。
Bryant教授的主要研究内容是设计软体工具来帮助软体和硬体设计者验证其系统正确性。其中,包括几种类型的模拟器,以及用数学方法来证明设计正确性的形式化验证工具。他发表了150多篇技术论文。包括Intel、FreeScale、IBM和Fujitsu在内的主要计算机製造商都使用着他的研究成果。他还因他的研究获得过数项大奖。其中包括Semiconductor Research Corporation颁发的两个发明荣誉奖和一个技术成就奖,ACM颁发的Kanellakis理论与实践奖,还有IEEE授予的W.R.G.Baker奖、Emmanuel Piore奖和Phil Kaufman奖。他还是ACM院士、IEEE院士和美国国家工程院院士。
David R.O’Hallaron 现为Intel匹兹堡实验室主任,卡内基-梅隆大学电子和计算机工程系副教授。在维吉尼亚大学获得计算机科学的博士学位。
他教授本科生和研究生的计算机系统方面的课程,例如计算机体系结构、计算机系统导论、并行处理器设计和Internet服务。他和Bryant教授一起开设了“计算机系统导论”课程,那便是此书的基础。2004年他获得了CMU计算机学院颁发的Herbert Simon杰出教学奖,这个奖项的获得者是基于学生的投票产生的。
O’Hallaron教授从事计算机系统领域的研究,主要兴趣在于科学计算、数据密集型计算和虚拟化方面的软体系统。其中最着名的是Quake项目,一群计算机科学家、土木工程师和地震学家致力于提高对强烈地震中大地运动的预测能力。2003年,他同Quake项目中其他成员一起获得了高性能计算领域中的最高国际奖项—Gordon Bell奖。

英文版

丛书名:经典原版书库书号:978-7-111-32631-1
英文版封面英文版封面
定价:128.00元

图书目录

出版者的话
译者序
前 言
第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 C语言中的移位运算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章 处理器体系结构230
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 逻辑设计和硬体控制语言HCL242
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 预测下一个PC279
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 获取进程ID492
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
8.5.5 可移植的信号处理516
8.5.6 显式地阻塞和取消阻塞信号517
8.5.7 同步流以避免讨厌的并发错误517
8.6 非本地跳转521
8.7 操作进程的工具524
8.8 小结524
参考文献说明525
家庭作业525
练习题答案530
第9章 虚拟存储器534
9.1 物理和虚拟定址535
9.2 地址空间535
9.3 虚拟存储器作为快取的工具536
9.3.1 DRAM快取的组织结构537
9.3.2 页表537
9.3.3 页命中538
9.3.4 缺页538
9.3.5 分配页面539
9.3.6 又是局部性救了我们539
9.4 虚拟存储器作为存储器管理的工具540
9.5 虚拟存储器作为存储器保护的工具541
9.6 地址翻译542
9.6.1 结合高速快取和虚拟存储器544
9.6.2 利用TLB加速地址翻译545
9.6.3 多级页表546
9.6.4 综合:端到端的地址翻译547
9.7 案例研究:Intel Core i7/Linux存储器系统550
9.7.1 Core i7地址翻译551
9.7.2 Linux虚拟存储器系统554
9.8 存储器映射556
9.8.1 再看共享对象557
9.8.2 再看fork函式558
9.8.3 再看execve函式559
9.8.4 使用mmap函式的用户级存储器映射559
9.9 动态存储器分配561
9.9.1 malloc和free函式561
9.9.2 为什幺要使用动态存储器分配563
9.9.3 分配器的要求和目标564
9.9.4 碎片565
9.9.5 实现问题565
9.9.6 隐式空闲鍊表565
9.9.7 放置已分配的块567
9.9.8 分割空闲块567
9.9.9 获取额外的堆存储器567
9.9.10 合併空闲块568
9.9.11 带边界标记的合併568
9.9.12 综合:实现一个简单的分配器570
9.9.13 显式空闲鍊表576
9.9.14 分离的空闲鍊表576
9.10 垃圾收集578
9.10.1 垃圾收集器的基本知识579
9.10.2 Mark&Sweep垃圾收集器580
9.10.3 C程式的保守Mark&Sweep580
9.11 C程式中常见的与存储器有关的错误581
9.11.1 间接引用坏指针582
9.11.2 读未初始化的存储器582
9.11.3 允许栈缓冲区溢出582
9.11.4 假设指针和它们指向的对象是相同大小的583
9.11.5 造成错位错误583
9.11.6 引用指针,而不是它所指向的对象583
9.11.7 误解指针运算584
9.11.8 引用不存在的变数584
9.11.9 引用空闲堆块中的数据584
9.11.10 引起存储器泄漏585
9.12 小结585
参考文献说明586
家庭作业586
练习题答案589
第三部分 程式间的互动和通信
第10章 系统级I/O596
10.1 Unix I/O596
10.2 打开和关闭档案597
10.3 读和写档案598
10.4 用RIO包健壮地读写599
10.4.1 RIO的无缓冲的输入输出函式600
10.4.2 RIO的带缓冲的输入函式600
10.5 读取档案元数据604
10.6 已分享档案606
10.7 I/O重定向608
10.8 标準I/O609
10.9 综合:我该使用哪些I/O函式610
10.10 小结611
参考文献说明612
家庭作业612
练习题答案612
第11章 网路编程614
11.1 客户端-伺服器编程模型614
11.2 网路615
11.3 全球IP网际网路618
11.3.1 IP位址619
11.3.2 网际网路域名620
11.3.3 网际网路连线623
11.4 套接字接口625
11.4.1 套接字地址结构625
11.4.2 socket函式626
11.4.3 connect函式626
11.4.4 open_clientfd函式627
11.4.5 bind函式628
11.4.6 listen函式628
11.4.7 open_listenfd函式628
11.4.8 accept函式629
11.4.9 echo客户端和伺服器的示例630
11.5 Web伺服器633
11.5.1 Web基础633
11.5.2 Web内容633
11.5.3 HTTP事务634
11.5.4 服务动态内容636
11.6 综合:TINY Web伺服器639
11.7 小结645
参考文献说明645
家庭作业646
练习题答案646
第12章 并发编程648
12.1 基于进程的并发编程649
12.1.1 基于进程的并发伺服器649
12.1.2 关于进程的优劣651
12.2 基于I/O多路复用的并发编程651
12.2.1 基于I/O多路复用的并发事件驱动伺服器653
12.2.2 I/O多路复用技术的优劣657
12.3 基于执行绪的并发编程657
12.3.1 执行绪执行模型657
12.3.2 Posix执行绪658
12.3.3 创建执行绪659
12.3.4 终止执行绪659
12.3.5 回收已终止执行绪的资源660
12.3.6 分离执行绪660
12.3.7 初始化执行绪660
12.3.8 一个基于执行绪的并发伺服器661
12.4 多执行绪程式中的共享变数662
12.4.1 执行绪存储器模型663
12.4.2 将变数映射到存储器663
12.4.3 共享变数664
12.5 用信号量同步执行绪664
12.5.1 进度图667
12.5.2 信号量668
12.5.3 使用信号量来实现互斥669
12.5.4 利用信号量来调度共享资源670
12.5.5 综合:基于预执行绪化的并发伺服器674
12.6 使用执行绪提高并行性676
12.7 其他并发问题680
12.7.1 执行绪安全680
12.7.2 可重入性682
12.7.3 线上程化的程式中使用已存在的库函式682
12.7.4 竞争683
12.7.5 死锁685
12.8 小结687
参考文献说明687
家庭作业688
练习题答案691
附录A 错误处理694
A.1 Unix系统中的错误处理694
A.2  错误处理包装函式696
参考文献698

相关推荐

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:yongganaa@126.com