深入理解计算机系统

深入理解计算机系统

计算机专业书籍
《深入理解计算机系统》一书有两个版本,分别由布赖恩特和Randal E.Bryant/David R.O’Hallaron编着。书中主要介绍了要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。
  • 书名:深入理解计算机系统
  • 别名:
  • 作者:(美)布赖恩特(Bryant,R.E.)等
  • 类别:
  • 原作品:
  • 译者:龚奕利/雷迎春
  • 出版社:电子工业出版社
  • 页数:736
  • 定价:¥89.00 元
  • 开本:16
  • 装帧:平装
  • ISBN:10位[7121025809] 13位[9787121025808]
  • 外文名:Computer Systems: A Programmer's Perspective

版本

中文版——

作者:(美)Randal E.Bryant / David R.O’Hallaron译者:龚奕利/雷迎春

出版社:机械工业出版社

出版日期:2011年2月第1版ISBN:978-7-111-32133-0

开本:16开

定价:99.00元

页数:726

英文版——

作者:(美)Randal E. Bryant; David R. O'Hallaron着

出版社:机械工业出版社

出版日期:2010年12月27日

ISBN:978-7-111-32631-1

开本:16开

定价:128.00

页数:1080

内容提要

本书主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解程序执行的方式,改进程序的执行效率。此书以程序员的视角全面讲解了计算机系统,深入浅出地介绍了处理器、编译器、操作系统和网络环境,是这一领域的权威之作。n本书适合作为计算机及相关专业的本科生教材,同时也适用于编程人员参考阅读。

编辑推荐

本书主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解程序执行的方式,改进程序的执行效率。此书以程序员的视角全面讲解了计算机系统,深入浅出地介绍了处理器、编译器、操作系统和网络环境,是这一领域的权威之作。

本书适合作为计算机及相关专业的本科生教材,同时也适用于编程人员参考阅读。

作者简介

Randal E.Brant:1981年在麻省理工学院获计算机科学博士学位,现任美国卡内基·梅隆大学计算机学院院长,是ACM和IEEE的双会士,多次获得这两个协会颁发的大奖。Bryant教授从事计算机系统方面的教学工作已超过20年,结合计算机体系结构课程多年的教学经验,他开始把关注点从如何设计计算机转移到如何使用程序员在更好地了解系统的情况下编写出更有效、更可靠的程序上来。

目录

第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.8c语言中的位级运算34

2.1.9c语言中的逻辑运算36

2.1.10c语言中的移位运算36

2.2整数表示38

2.2.1整型数据类型38

2.2.2无符号数的编码39

2.2.3补码编码40

2.2.4有符号数和无符号数之间的转换44

2.2.5c语言中的有符号数与无符号数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.2ieee浮点表示70

2.4.3数字示例71

2.4.4舍入74

2.4.5浮点运算76

2.4.6c语言中的浮点数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.7switch语句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.13x86-64:将ia32扩展到64位183

3.13.186-64的历史和动因184

3.13.2x86-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.1y86指令集体系结构231

4.1.1程序员可见的状态231

4.1.2y86指令232

4.1.3指令编码233

4.1.4y86异常237

4.1.5y86程序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.3y86的顺序实现250

4.3.1将处理组织成阶段250

4.3.2eq硬件结构258

4.3.3seq的时序259

4.3.4seq阶段的实现262

4.4流水线的通用原理267

4.4.1计算流水线268

4.4.2流水线操作的详细说明269

4.4.3流水线的局限性271

4.4.4带反馈的流水线系统272

4.5y86的流水线实现273

4.5.1seq+:重新安排计算阶段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.10pipe各阶段的实现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.3amdahl定律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.3linux/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.1dram缓存的组织结构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.1core i7地址翻译551

9.7.2linux虚拟存储器系统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.1malloc和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.2mark&sweep垃圾收集器580

9.10.3c程序的保守mark&sweep580

9.11c程序中常见的与存储器有关的错误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.1unix i/o596

10.2打开和关闭文件597

10.3读和写文件598

10.4用rio包健壮地读写599

10.4.1rio的无缓冲的输入输出函数600

10.4.2rio的带缓冲的输入函数600

10.5读取文件元数据604

10.6共享文件606

10.7i/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.1ip地址619

11.3.2因特网域名620

11.3.3因特网连接623

11.4套接字接口625

11.4.1套接字地址结构625

11.4.2socket函数626

11.4.3onnect函数626

11.4.4open_clientfd函数627

11.4.5bind函数628

11.4.6listen函数628

11.4.7open_listenfd函数628

11.4.8accept函数629

11.4.9echo客户端和服务器的示例630

11.5web服务器633

11.5.1web基础633

11.5.2web内容633

11.5.3http事务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.2i/o多路复用技术的优劣657

12.3基于线程的并发编程657

12.3.1线程执行模型657

12.3.2posix线程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.1unix系统中的错误处理694

a.2错误处理包装函数696

参考文献698

前言

This book; Computer Systems: A Programmer's Perspective (CS:APP), is for programmers who want to improve their skills by learning what is going on "under the hood" of a computer system. . Our aim is to explain the enduring concepts underlying all computer systems, and to show you the concrete ways that these ideas affect the correctness, performance, and utility of your application programs. Unlike other systems books, which are written primarily for system builders, this book is written for programmers, from a programmer's perspective.

相关词条

相关搜索

其它词条