由于此商品库存有限,请在下单后15分钟之内支付完成,手慢无哦!
100%刮中券,最高99元无敌券,券有效期7天
活动自2017年6月2日上线,敬请关注云钻刮券活动规则更新。
如活动受政府机关指令需要停止举办的,或活动遭受严重网络攻击需暂停举办的,或者系统故障导致的其它意外问题,苏宁无需为此承担赔偿或者进行补偿。
醉染图书深入理解计算机系统9787111544937
¥ ×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高速缓存至关重要9
1.6存储设备形成层次结构9
1.7操作系统管理硬件10
1.7.1进程11
1.7.2线程12
1.7.3虚拟内存12
1.7.4文件14
1.8系统之间利用网络通信14
1.9重要主题16
1.9.1Amdahl定律16
1.9.2并发和并行17
1.9.3计算机系统中抽象的重要19
1.10小结20
参考文献说明20
练习题20
部分
程序结构和执行
第2章信息的表示和处理22
2.1信息存储24
2.1.1十六进制表示法25
2.1.2字数据大小27
2.1.3寻址和字节顺序29
2.1.4表示字符串34
2.1.5表示代码34
2.1.6布尔代数简介35
2.1.7C语言中的位级运算37
2.1.8C语言中的逻辑运算39
2.1.9C语言中的移位运算40
2.2整数表示41
2.2.1整型数据类型42
2.2.2无符号数的编码43
2..补码编码44
2.2.4有符号数和无符号数之间的转换49
2.2.5C语言中的有符号数与无符号数52
2.2.6扩展一个数字的位表示54
2.2.7截断数字56
2.2.8关于有符号数与无符号数的建议58
.整数运算60
..1无符号加法60
..2补码加法62
..补码的非66
..4无符号乘法67
..5补码乘法67
..乘以常数70
..除以2的幂71
..关于整数运算的后思考74
2.4浮点数75
2.4.1二进制小数76
2.4.2IEEE浮点表示78
2.4.3数字示例79
2.4.4舍入83
2.4.5浮点运算85
2.4.6C语言中的浮点数86
2.5小结87
参考文献说明88
家庭作业88
练习题97
第3章程序的机器级表示109
3.1历史观点110
3.2程序编码113
3.2.1机器级代码113
3.2.2代码示例114
3..关于格式的注解117
3.3数据格式119
3.4访问信息119
3.4.1操作数指示符121
3.4.2数据传送指令122
3.4.3数据传送示例125
3.4.4压入和弹出栈数据127
3.5算术和逻辑操作128
3.5.1加载有效地址129
3.5.2一元和二元操作130
3.5.3移位操作131
3.5.4讨论131
3.5.5特殊的算术操作133
3.6控制135
3.6.1条件码135
3.6.2访问条件码136
3.6.3跳转指令138
3.6.4跳转指令的编码139
3.6.5用条件控制来实现条件分支
3.6.6用条件传送来实现条件分支
3.6.7循环149
3.6.8switch语句159
3.7过程164
3.7.1运行时栈164
3.7.2转移控制165
3.7.3数据传送168
3.7.4栈上的局部存储170
3.7.5寄存器中的局部存储空间172
3.7.6递归过程174
3.8数组分配和访问176
3.8.1基本原则176
3.8.2指针运算177
3.8.3嵌套的数组178
3.8.4定长数组179
3.8.5变长数组181
3.9异质的数据结构183
3.9.1结构183
3.9.2联合186
3.9.3数据对齐189
3.10在机器级程序中将控制与数据结合起来192
3.10.1理解指针192
3.10.2应用:使用GDB调试器193
3.10.3内存越界引用和缓冲区溢出194
3.10.4对抗缓冲区溢出攻击198
3.10.5支持变长栈帧201
3.11浮点代码204
3.11.1浮点传送和转换操作205
3.11.2过程中的浮点代码209
3.11.3浮点运算操作210
3.11.4定义和使用浮点常数212
3.11.5在浮点代码中使用位级操作212
3.11.6浮点比较操作213
3.11.7对浮点代码的观察结论215
3.12小结216
参考文献说明216
家庭作业216
练习题226
第4章处理器体系结构243
4.1Y86—64指令集体系结构245
4.1.1程序员可见的状态245
4.1.2Y86—64指令245
4.1.3指令编码246
4.1.4Y86—64异常250
4.1.5Y86—64程序251
4.1.6一些Y86—64指令的详情255
4.2逻辑设计和硬件控制语言HCL256
4.2.1逻辑门257
4.2.2组合电路和HCL布尔表达式257
4..字级的组合电路和HCL整数表达式258
4.2.4集合关系261
4.2.5存储器和时钟262
4.3Y86—64的顺序实现264
4.3.1将处理组织成阶段264
4.3.2SE硬件结构272
4.3.3SE的时序274
4.3.4SE阶段的实现277
4.4流水线的通用原理282
4.4.1计算流水线282
4.4.2流水线操作的详细说明284
4.4.3流水线的局限24
4.4.4带反馈的流水线系统287
4.5Y86—64的流水线实现288
4.5.1SE+:重新安排计算阶段288
4.5.2插入流水线寄存器289
4.5.3对信号进行重新排列和标号292
4.5.4预测下一个PC293
4.5.5流水线冒险295
4.5.6异常处理306
4.5.7PIPE各阶段的实现308
4.5.8流水线控制逻辑314
4.5.9能分析322
4.5.10未完成的工作3
4.6小结325
参考文献说明326
家庭作业327
练习题331
第5章优化程序能341
5.1优化编译器的能力和局限342
5.2表示程序能345
5.3程序示例347
5.4消除循环的低效率350
5.5减少过程调用353
5.6消除不必要的内存引用354
5.7理解现代处理器357
5.7.1整体操作357
5.7.2功能单元的能361
5.7.3处理器操作的抽象模型362
5.8循环展开366
5.9提高并行369
5.9.1多个累积变量370
5.9.2重新结合变换373
5.10优化合并代码的结果小结377
5.11一些因素378
5.11.1寄存器溢出378
5.11.2分支预测和预测错误处罚379
5.12理解内存能32
5.12.1加载的能32
5.12.2存储的能33
5.13应用:能提技术387
5.14确认和消除能瓶颈388
5.14.1程序剖析388
5.14.2使用剖析程序来指导优化390
5.15小结392
参考文献说明393
家庭作业393
练习题395
第6章存储器层次结构399
6.1存储技术399
6.1.1随机访问存储器400
6.1.2磁盘存储406
6.1.3固态硬盘414
6.1.4存储技术趋势415
6.2局部41
6.2.1对程序数据引用的局部41
6.2.2取指令的局部419
6..局部小结420
6.3存储器层次结构421
6.3.1存储器层次结构中的缓存422
6.3.2存储器层次结构概念小结424
6.4高速缓存存储器425
6.4.1通用的高速缓存存储器组织结构425
6.4.2直接映高速缓存427
6.4.3组相联高速缓存433
6.4.4全相联高速缓存434
6.4.5有关写的问题437
6.4.6一个真实的高速缓存层次结构的解剖438
6.4.7高速缓存参数的能影响439
6.5编写高速缓存友好的代码440
6.6综合:高速缓存对程序能的影响444
6.6.1存储器山444
6.6.2重新排列循环以提高空间局部447
6.6.3在程序中利用局部450
6.7小结450
参考文献说明451
家庭作业451
练习题459
第二部分
在系统上运行程序
第7章链接464
7.1编译器驱动程序465
7.2静态链接466
7.3目标文件466
7.4可重定位目标文件467
7.5符号和符号表468
7.6符号解析470
7.6.1链接器如何解析多重定义的全局符号471
7.6.2与静态库链接475
7.6.3链接器如何使用静态库来解析引用477
7.7重定位478
7.7.1重定位条目479
7.7.2重定位符号引用479
7.8可执行目标文件483
7.9加载可执行目标文件484
7.10动态链接共享库485
7.11从应用程序中加载和链接共享库487
7.12位置无关代码489
7.13库打桩机制492
7.13.1编译时打桩492
7.13.2链接时打桩492
7.13.3运行时打桩494
7.14处理目标文件的工具496
7.15小结496
参考文献说明497
家庭作业497
练习题499
第8章异常控制流501
8.1异常502
8.1.1异常处理503
8.1.2异常的类别504
8.1.3Linux/x86—64系统中的异常505
8.2进程508
8.2.1逻辑控制流508
8.2.2并发流509
8..私有地址空间509
8.2.4用户模式和内核模式510
8.2.5上下文切换511
8.3系统调用错误处理512
8.4进程控制513
8.4.1获取进程513
8.4.2创建和终止进程513
8.4.3回收子进程516
8.4.4让进程休眠521
8.4.5加载并运行程序521
8.4.6利用fork和execve运行程序524
8.5信号526
8.5.1信号术语527
8.5.2发送信号528
8.5.3接收信号531
8.5.4阻塞和解除阻塞信号532
8.5.5编写信号处理程序533
8.5.6同步流以避免讨厌的并发错误540
8.5.7显式地等待信号543
8.6非本地跳转546
8.7操作进程的工具550
8.8小结550
参考文献说明550
家庭作业550
练习题556
第9章虚拟内存559
9.1物理和虚拟寻址560
9.2地址空间560
9.3虚拟内存作为缓存的工具561
9.3.1DRAM缓存的组织结构562
9.3.2页表562
9.3.3页命中563
9.3.4缺页564
9.3.5分配页面565
9.3.6又是局部救了我们565
9.4虚拟内存作为内存管理的工具565
9.5虚拟内存作为内存保护的工具567
9.6地址翻译567
9.6.1结合高速缓存和虚拟内存570
9.6.2利用TLB加速地址翻译570
9.6.3多级页表571
9.6.4综合:端到端的地址翻译573
9.7案例研究:IntelCorei7/Linux内存系统576
9.7.1Corei7地址翻译576
9.7.2Linux虚拟内存系统580
9.8存映582
9.8.1再看共享对象583
9.8.2再看fork函数584
9.8.3再看execve函数584
9.8.4使用mmap函数的用户级存映585
9.9动态内存分配587
9.9.1malloc和free函数587
9.9.2为什么要使用动态内存分配589
9.9.3分配器的要求和目标590
9.9.4碎片591
9.9.5实现问题592
9.9.6隐式空闲链表592
9.9.7放置已分配的块593
9.9.8分割空闲块594
9.9.9获取额外的堆内存594
9.9.10合并空闲块594
9.9.11带边界标记的合并595
9.9.12综合:实现一个简单的分配器597
9.9.13显式空闲链表603
9.9.14分离的空闲链表604
9.10垃圾收集605
9.10.1垃圾收集器的基本知识606
9.10.2Mark&Sweep垃圾收集器607
9.10.3C程序的保守Mark&Sweep608
9.11C程序中常见的与内存有关的错误609
9.11.1间接引用坏指针609
9.11.2读未初始化的内存609
9.11.3允许栈缓冲区溢出610
9.11.4设指针和它们指向的对象是相同大小的610
9.11.5造成错位错误611
9.11.6引用指针,而不是它所指向的对象611
9.11.7误解指针运算611
9.11.8引用不存在的变量612
9.11.9引用空闲堆块中的数据612
9.11.10引起内存泄漏613
9.12小结613
参考文献说明613
家庭作业614
练习题617
第三部分
程序间的交互和通信
0章系统级I/O62210.1UnixI/O622
10.2文件6
10.3打开和关闭文件624
10.4读和写文件625
10.5用RIO包健壮地读写626
10.5.1RIO的无缓冲的输入输出函数627
10.5.2RIO的带缓冲的输入函数627
10.6读取文件元数据632
10.7读取目录内容633
10.8共享文件634
10.9I/O重定向637
10.10标准I/O638
10.11综合:我该使用哪些I/O函数?638
10.12小结640
参考文献说明640
家庭作业640
练习题641
1章网络编程642
11.1客户端服务器编程模型642
11.2网络643
11.3全球IP因特网646
11.3.1IP地址647
11.3.2因特网域名649
11.3.3因特网连接651
11.4套接字接口652
11.4.1套接字地址结构653
11.4.2socket函数654
11.4.3connect函数654
11.4.4bind函数654
11.4.5listen函数655
11.4.6accept函数655
11.4.7主机和服务的转换656
11.4.8套接字接口的辅函数660
11.4.9echo客户端和服务器的示例662
11.5Web服务器665
11.5.1Web基础665
11.5.2Web内容666
11.5.3事务667
11.5.4服务动态内容669
11.6综合:TINYWeb服务器671
11.7小结678
参考文献说明678
家庭作业678
练习题679
2章并发编程681
12.1基于进程的并发编程682
12.1.1基于进程的并发服务器683
12.1.2进程的优劣684
12.2基于I/O多路复用的并发编程684
12.2.1基于I/O多路复用的并发事件驱动服务器686
12.2.2I/O多路复用技术的优劣690
1.基于线程的并发编程691
1..1线程执行模型691
1..2Posix线程691
1..创建线程692
1..4终止线程693
1..5回收已终止线程的资源693
1..分离线程694
1..初始化线程694
1..基于线程的并发服务器694
12.4多线程程序的享变量696
12.4.1线程内存模型696
12.4.2将变量映到内存697
12.4.3共享变量698
12.5用信号量同步线程698
12.5.1进度图701
12.5.2信号量702
12.5.3使用信号量来实现互斥703
12.5.4利用信号量来调度共享资源704
12.5.5综合:基于预线程化的并发服务器708
12.6使用线程提高并行710
12.7并发问题716
12.7.1线程安全716
12.7.2可重入717
12.7.3在线程化的程序中使用已存在的库函数718
12.7.4竞争719
12.7.5死锁721
12.8小结722
参考文献说明7
家庭作业7
练习题726
附录A错误处理729
参考文献733
关于作者Randal E.Bryant 1973年于密歇根大学获得士学,随即就读于麻省理工学院院,并在1981年获计算机科学博士。他在加州理工学院做了三年教,从1984年至今一直是卡内基梅隆大学的教师。这其中有五年的时间,他是计算机科学系主任,有十年的时间是计算机科学学院院长。他现在是计算机科学学院的院长、教授。他同时还受邀任职于与计算机工程系。
他教授生和计算机系统方面的课程近40年。在讲授计算机体系结构课程多年后,他开始把关注点从如何设计计算机转移到程序员如何在更好地了解系统的情况下编写出更有效和更可靠的程序。他和OHallaron教授一起在卡内基梅隆大学开设了15-213课程“计算机系统导论”,那便是此书的基础。他还教授一些有关算法、编程、计算机网络、分布式系统和VLSI(超大规模集成电路)设计方面的课程。
Bryant教授的主要研究内容是设计软件工具来帮软件和硬件设计者验其系统正确。其中,包括几种类型的模拟器,以及用数学方法来明设计正确的形式化验工具。他发表了150多篇技术。包括Intel、IBM、Fujitsu和Microsoft在内的主要计算机制造商都使用着他的研究成果。他还因他的研究获得过数项大奖。其中包括Semiconductor Research Corporation颁发的两个发明荣誉奖和一个技术成就奖,ACM颁发的Kanellakis理论与实践奖,还有IEEE颁发的W.R.G.r奖、Emmanuel Piore奖和Phil Kaufman奖。他还是ACM院士、IEEE院士、美国工程院院士和美国人文与科学研究院院士。
David R.OHallaron 卡内基梅隆大学计算机科学和与计算机工程系教授。在弗吉尼亚大学获得计算机科学博士,2007~2010年为Intel匹兹堡实验室主任。
20年来,他教授生和计算机系统方面的课程,例如计算机体系结构、计算机系统导论、并行处理器设计和Internet服务。他和Bryant教授一起在卡内基梅隆大学开设了作为本书基础的“计算机系统导论”课程。2004年他获得了卡内基梅隆大学计算机科学学院颁发的Herbert Simon杰出教学奖,这个奖项的获得者是基于学生的投票产生的。
O’Hallaron教授从事计算机系统领域的研究,主要兴趣在于科学计算、数据密集型计算和虚拟化方面的软件系统。其中有名的是项目,该项目是一群计算机科学家、土木和地震学家为提高对强烈地震中大地运动的预测能力而开发的。2003年,他同项目中成员一起获得了高能计算领域中的高国际奖项——Gordon Bell奖。他目前的工作重点是自动分级(autograding)概念,即评价程序质量的程序。
前言本书(简称CS:APP)的主要读者是计算机科学家、计算机,以及那些想通过学习计算机系统的内在运作而能够写出更好程序的人。 我们的目的是解释所有计算机系统的本质概念,并向你展示这些概念是如何实实在在地影响应用程序的正确、能和实用的。的系统类书籍都是从构建者的角度来写的,讲述如何实现硬件或系统软件,包括操作系统、编译器和网络接口。而本书是从程序员的角度来写的,讲述应用程序员如何能够利用系统知识来编写出更好的程序。当然,学习一个计算机系统应该做些什么,是学习如何构建一个计算机系统的很好的出发点,所以,对于希望继续学统软硬件实现的人来说,本书也是一本很有价值的介绍读物。大多数系统书籍还倾向于重点关注系统的某一个方面,比如:硬件架构、操作系统、编译器或者网络。本书则以程序员的视角统一覆盖了上述所有方面的内容。 如果你研究和领会了这本书里的概念,你将开始成为极少数的“牛人”,这些“牛人”知道事情是如何运作的,也知道当事情出现故障时如何修复。你写的程序将能够更好地利用操作系统和系统软件提供的功能,对各种操作条件和运行时参数都能正确操作,运行起来更快,并能避免出现使程序容易受到网络攻击的缺陷。同时,你也要做好更深入探究的准备,研究像编译器、计算机体系结构、操作系统、嵌入式系统、网络互联和网络安全这样的高级题目。 读者应具备的背景知识本书的重点是执行x86-64机器代码的系统。对英特尔及其竞争对手而言,x86-64是他们自1978年起,以8086微处理器为代表,不断进化的近期新成果。按照英特尔微处理器产品线的命名规则,这类微处理器俗称为“x86”。随着半导体技术的演进,单芯片上集成了更多的晶体管,这些处理器的计算能力和内存容量有了很大的增长。在这个过程中,它们从处理16位字,发展到引入IA32处理器处理32位字,再到近的x86-64处理64位字。 我们考虑的是这些机器如何在Linux操作系统上运行C语言程序。Linux是众多继承自初由贝尔实验室开发的Unix的操作系统中的一种。这类操作系统的成员包括Solaris、FreeBSD和MacOS X。近年来,由于Posix和标准Unix规范的标准化努力,这些操作系统保持了高度兼容。因此,本书内容几乎直接适用于这些“类Unix”操作系统。 文中包含大量已在Linux系统上编译和运行过的程序示例。我们设你能访问一台这样的机器,并且能够登录,做一些诸如切换目录之类的简单操作。如果你的计算机运行的是Microsoft Windows系统,我们建议你选择安装一个虚拟机环境(例如VirtualBox或者VMWare),以便为一种操作系统(客户OS)编写的程序能在另一种系统(宿主OS)上运行。 我们还设你对C和C++有一定的了解。如果你以前只有Java经验,那么你需要付出更多的努力来完成这种转换,不过我们也会帮你。Java和C有相似的语法和控制语句。不过,有一些C语言的特(特是指针、显式的动态内存分配和格式化I/O)在Java中都是没有的。所幸的是,C是一个较小的语言,在Brian Kernighan和Dennis Ritchie经典的“K&R”文献中得到了清晰优美的描述\[61\]。无论你的编程背景如何,都应该考虑将K&R作为个人系统藏书的一部分。如果你只有使用解释语言的经验,如Python、Ruby或Perl,那么在使用本书之前,需要花费一些时间来学习C。 本书的前几章揭示了C语言程序和它们相对应的机器语言程序之间的交互作用。机器语言示例都是用运行在x86-64处理器上的GNU GCC编译器生成的。我们不需要你以前有任何硬件、机器语言或是汇编语言编程的经验。 给C语言初学者 关于C编程语言的建议为了帮C语言编程背景薄弱(或全无背景)的读者,我们在书中加入了这样一些专门的注释来突出C中一些特别重要的特。我们设你熟悉C++或Java。 如何阅读此书从程序员的角度学习计算机系统是如何工作的会有趣,主要是因为你可以主动地做这件事情。无论何时你学到一些新的东西,都可以马上试验并且直接看到运行结果。事实上,我们相信学统的专享方法就是做(do)系统,即在真正的系统上解决具体的问题,或是编写和运行程序。 这个主题观念贯穿全书。当引入一个新概念时,将会有一个或多个练习题紧随其后,你应该马上做一做来检验你的理解。这些练习题的解答在每章的末尾。当你阅读时,尝试自己来解答每个问题,然后再查阅,看自己的正确。除章外,每章后面都有难度不同的家庭作业。对每个家庭作业题,我们标注了难度级别: 只需要几分钟。几乎或接近不需要编程。 可能需要将近20分钟。通常包括编写和测试一些代码。(许多都源自我们在中出的题目。)需要很大的努力,也许是1~2个小时。一般包括编写和测试大量的代码。 一个实验作业,需要将近10个小时。 文中每段代码示例都是由经过GCC编译的C程序直接生成并在Linux系统上进行了测试,没有任何人为的改动。当然,你的系统上GCC的版本可能不同,或者根本就是另外一种编译器,那么可能生成不一样的机器代码,但是整体行为表现应该是一样的。所有的源程序代码都可以从csapp.cs.cmu.edu上的CS:APP主页上获取。在本书中,源程序的文件名列在两条水平线的右边,水平线之间是格式化的代码。比如,图1中的程序能在code/intro/目录下的hello.c文件中找到。当遇到这些示例程序时,我们鼓励你在自己的系统上试着运行它们。 图1 一个典型的代码示例为了避免本书体积过大、内容过多,我们添加了许多网络旁注(Web aside),包括一些对本书主要内容的补充资料。本书中用CHAP:TOP这样的标记形式来引用这些旁注,这里CHAP是该章主题的缩写编码,而TOP是涉及的话题的缩写编码。例如,网络旁注DATA:BOOL包含对第2章中数据表示里面有关布尔代数内容的补充资料;而网络旁注ARCH:VLOG包含的是用Verilog硬件描述语言进行处理器设计的资料,是对第4章中处理器设计部分的补充。所有的网络旁注都可以从CS:APP的主页上获取。 旁注 什么是旁注在整本书中,你将会遇到很多以这种形式出现的旁注。旁注是附加说明,能使你对当前讨论的主题多一些了解。旁注可以有很多用处。一些是小的历史故事。例如,C语言、Linux和Internet是从何而来的?有些旁注则是用来澄清学生们经常感到疑惑的问题。例如,高速缓存的行、组和块有什么区别?还有些旁注给出了一些现实世界的例子。例如,一个浮点错误怎么毁掉了法国的一枚,或是给出市面上出售的一个磁盘驱动器的几何和运行参数。,还有一些旁注仅仅就是一些有趣的内容,例如,什么是“hoinky”?本书概述本书由12章组成,旨在阐述计算机系统的核心概念。内容概述如下: ●章:计算机系统漫游。这一章通过研究“hello,world”这个简单程序的生命周期,介绍计算机系统的主要概念和主题。 ●第2章:信息的表示和处理。我们讲述了计算机的算术运算,重点描述了会对程序员有影响的无符号数和数的补码表示的特。我们考虑数字是如何表示的,以及由此确定对于一个给定的字长,其可能编码值的范围。我们探讨有符号和无符号数字之间类型转换的效果,还阐述算术运算的数学特。菜鸟级程序员经常很惊奇地了解到(用补码表示的)两个正数的和或者积可能为负。另一方面,补码的算术运算满足很多整数运算的代数特,因此,编译器可以很安全地把一个常量乘法转化为一系列的移位和加法。我们用C语言的位级操作来说明布尔代数的原理和应用。我们从两个方面讲述了IEEE标准的浮点格式:一是如何用它来表示数值,一是浮点运算的数学属。 对计算机的算术运算有深刻的理解是写出可靠程序的关键。比如,程序员和编译器不能用表达式(x-y<0)来替代(x
亲,大宗购物请点击企业用户渠道>小苏的服务会更贴心!
亲,很抱歉,您购买的宝贝销售异常火爆让小苏措手不及,请稍后再试~
非常抱歉,您前期未参加预订活动,
无法支付尾款哦!
抱歉,您暂无任性付资格
