书籍 深入理解计算机系统  英文版的封面

深入理解计算机系统 英文版PDF电子书下载

(美)兰德尔·E.布莱恩特(Randal E.Bryant),(美)大卫·R.奥哈拉伦

购买点数

26

出版社

北京:机械工业出版社

出版时间

2017

ISBN

标注页数

1045 页

PDF页数

1088 页

图书目录

第1章 计算机系统漫游 1

1.1信息就是位+上下文 3

1.2程序被其他程序翻译成不同的格式 4

1.3了解编译系统如何工作是大有益处的 6

1.4处理器读并解释储存在内存中的指令 7

1.4.1系统的硬件组成 8

1.4.2运行hello程序 10

1.5高速缓存至关重要 11

1.6存储设备形成层次结构 14

1.7操作系统管理硬件 14

1.7.1进程 15

1.7.2线程 17

1.7.3虚拟内存 18

1.7.4文件 19

1.8系统之间利用网络通信 19

1.9重要主题 22

1.9.1 Amdahl定律 22

1.9.2并发和并行 24

1.9.3计算机系统中抽象的重要性 26

1.10小结 27

参考文献说明 28

练习题答案 28

第一部分 程序结构和执行 31

第2章 信息的表示和处理 31

2.1信息存储 34

2.1.1十六进制表示法 36

2.1.2字数据大小 39

2.1.3寻址和字节顺序 42

2.1.4表示字符串 49

2.1.5表示代码 49

2.1.6布尔代数简介 50

2.1.7 C语言中的位级运算 54

2.1.8 C语言中的逻辑运算 56

2.1.9 C语言中的移位运算 57

2.2整数表示 59

2.2.1整型数据类型 60

2.2.2无符号数的编码 62

2.2.3补码编码 64

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

2.2.5 C语言中的有符号数与无符号数 74

2.2.6扩展一个数字的位表示 76

2.2.7截断数字 81

2.2.8关于有符号数与无符号数的建议 83

2.3整数运算 84

2.3.1无符号加法 84

2.3.2补码加法 90

2.3.3补码的非 95

2.3.4无符号乘法 96

2.3.5补码乘法 97

2.3.6乘以常数 101

2.3.7除以2的幂 103

2.3.8关于整数运算的最后思考 107

2.4浮点数 108

2.4.1二进制小数 109

2.4.2 IEEE浮点表示 112

2.4.3数字示例 115

2.4.4舍入 120

2.4.5浮点运算 122

2.4.6 C语言中的浮点数 124

2.5小结 126

参考文献说明 127

家庭作业 128

练习题答案 143

第3章 程序的机器级表示 163

3.1历史观点 166

3.2程序编码 169

3.2.1机器级代码 170

3.2.2代码示例 172

3.2.3关于格式的注解 175

3.3数据格式 177

3.4访问信息 179

3.4.1操作数指示符 180

3.4.2数据传送指令 182

3.4.3数据传送示例 186

3.4.4压入和弹出栈数据 189

3.5算术和逻辑操作 191

3.5.1加载有效地址 191

3.5.2一元和二元操作 194

3.5.3移位操作 194

3.5.4讨论 196

3.5.5特殊的算术操作 197

3.6控制 200

3.6.1条件码 201

3.6.2访问条件码 202

3.6.3跳转指令 205

3.6.4跳转指令的编码 207

3.6.5用条件控制来实现条件分支 209

3.6.6用条件传送来实现条件分支 214

3.6.7循环 220

3.6.8 switch语句 232

3.7过程 238

3.7.1运行时栈 239

3.7.2转移控制 241

3.7.3数据传送 245

3.7.4栈上的局部存储 248

3.7.5寄存器中的局部存储空间 251

3.7.6递归过程 253

3.8数组分配和访问 255

3.8.1基本原则 255

3.8.2指针运算 257

3.8.3嵌套的数组 258

3.8.4定长数组 260

3.8.5变长数组 262

3.9异质的数据结构 265

3.9.1结构 265

3.9.2联合 269

3.9.3数据对齐 273

3.10在机器级程序中将控制与数据结合起来 276

3.10.1理解指针 277

3.10.2应用:使用GDB调试器 279

3.10.3内存越界引用和缓冲区溢出 279

3.10.4对抗缓冲区溢出攻击 284

3.10.5支持变长栈帧 290

3.11浮点代码 293

3.11.1浮点传送和转换操作 296

3.11.2过程中的浮点代码 301

3.11.3浮点运算操作 302

3.11.4定义和使用浮点常数 304

3.11.5在浮点代码中使用位级操作 305

3.11.6浮点比较操作 306

3.11.7对浮点代码的观察结论 309

3.12小结 309

参考文献说明 310

家庭作业 311

练习题答案 325

第4章 处理器体系结构 351

4.1 Y86-64指令集体系结构 355

4.1.1程序员可见的状态 355

4.1.2 Y86-64指令 356

4.1.3指令编码 358

4.1.4 Y86-64异常 363

4.1.5 Y86-64程序 364

4.1.6一些Y86-64指令的详情 370

4.2逻辑设计和硬件控制语言HCL 372

4.2.1逻辑门 373

4.2.2组合电路和HCL布尔表达式 374

4.2.3字级的组合电路和HCL整数表达式 376

4.2.4集合关系 380

4.2.5存储器和时钟 381

4.3 Y86-64的顺序实现 384

4.3.1将处理组织成阶段 384

4.3.2 SEQ硬件结构 396

4.3.3 SEQ的时序 400

4.3.4 SEQ阶段的实现 404

4.4流水线的通用原理 412

4.4.1计算流水线 412

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

4.4.3流水线的局限性 416

4.4.4带反馈的流水线系统 419

4.5 Y86-64的流水线实现 421

4.5.1 SEQ+:重新安排计算阶段 421

4.5.2插入流水线寄存器 422

4.5.3对信号进行重新排列和标号 426

4.5.4预测下一个PC 427

4.5.5流水线冒险 429

4.5.6异常处理 444

4.5.7 PIPE各阶段的实现 447

4.5.8流水线控制逻辑 455

4.5.9性能分析 464

4.5.10未完成的工作 468

4.6小结 470

参考文献说明 473

家庭作业 473

练习题答案 480

第5章 优化程序性能 495

5.1优化编译器的能力和局限性 498

5.2表示程序性能 502

5.3程序示例 504

5.4消除循环的低效率 508

5.5减少过程调用 512

5.6消除不必要的内存引用 514

5.7理解现代处理器 517

5.7.1整体操作 518

5.7.2功能单元的性能 523

5.7.3处理器操作的抽象模型 525

5.8循环展开 531

5.9提高并行性 536

5.9.1多个累积变量 536

5.9.2重新结合变换 541

5.10优化合并代码的结果小结 547

5.11一些限制因素 548

5.11.1寄存器溢出 548

5.11.2分支预测和预测错误处罚 549

5.12理解内存性能 553

5.12.1加载的性能 554

5.12.2存储的性能 555

5.13应用:性能提高技术 561

5.14确认和消除性能瓶颈 562

5.14.1程序剖析 562

5.14.2使用剖析程序来指导优化 565

5.15小结 568

参考文献说明 569

家庭作业 570

练习题答案 573

第6章 存储器层次结构 579

6.1存储技术 581

6.1.1随机访问存储器 581

6.1.2磁盘存储 589

6.1.3固态硬盘 600

6.1.4存储技术趋势 602

6.2局部性 604

6.2.1对程序数据引用的局部性 606

6.2.2取指令的局部性 607

6.2.3局部性小结 608

6.3存储器层次结构 609

6.3.1存储器层次结构中的缓存 610

6.3.2存储器层次结构概念小结 614

6.4高速缓存存储器 614

6.4.1通用的高速缓存存储器组织结构 615

6.4.2直接映射高速缓存 617

6.4.3组相联高速缓存 624

6.4.4全相联高速缓存 626

6.4.5有关写的问题 630

6.4.6一个真实的高速缓存层次结构的解剖 631

6.4.7高速缓存参数的性能影响 631

6.5编写高速缓存友好的代码 633

6.6综合:高速缓存对程序性能的影响 639

6.6.1存储器山 639

6.6.2重新排列循环以提高空间局部性 643

6.6.3在程序中利用局部性 647

6.7小结 648

参考文献说明 648

家庭作业 649

练习题答案 660

第二部分 在系统上运行程序 669

第7章 链接 669

7.1编译器驱动程序 671

7.2静态链接 672

7.3目标文件 673

7.4可重定位目标文件 674

7.5符号和符号表 675

7.6符号解析 679

7.6.1链接器如何解析多重定义的全局符号 680

7.6.2与静态库链接 684

7.6.3链接器如何使用静态库来解析引用 688

7.7重定位 689

7.7.1重定位条目 690

7.7.2重定位符号引用 691

7.8可执行目标文件 695

7.9加载可执行目标文件 697

7.10动态链接共享库 698

7.11从应用程序中加载和链接共享库 701

7.12位置无关代码 704

7.13库打桩机制 707

7.13.1编译时打桩 708

7.13.2链接时打桩 708

7.13.3运行时打桩 710

7.14处理目标文件的工具 713

7.15小结 713

参考文献说明 714

家庭作业 714

练习题答案 717

第8章 异常控制流 721

8.1异常 723

8.1.1异常处理 724

8.1.2异常的类别 726

8.1.3 Linux/x86-64系统中的异常 729

8.2进程 732

8.2.1逻辑控制流 732

8.2.2并发流 733

8.2.3私有地址空间 734

8.2.4用户模式和内核模式 734

8.2.5上下文切换 736

8.3系统调用错误处理 737

8.4进程控制 738

8.4.1获取进程ID 739

8.4.2创建和终止进程 739

8.4.3回收子进程 743

8.4.4让进程休眠 749

8.4.5加载并运行程序 750

8.4.6利用fork和execve运行程序 753

8.5信号 756

8.5.1信号术语 758

8.5.2发送信号 759

8.5.3接收信号 762

8.5.4阻塞和解除阻塞信号 764

8.5.5编写信号处理程序 766

8.5.6同步流以避免讨厌的并发错误 776

8.5.7显式地等待信号 778

8.6非本地跳转 781

8.7操作进程的工具 786

8.8小结 787

参考文献说明 787

家庭作业 788

练习题答案 795

第9章 虚拟内存 801

9.1物理和虚拟寻址 803

9.2地址空间 804

9.3虚拟内存作为缓存的工具 805

9.3.1 DRAM缓存的组织结构 806

9.3.2页表 806

9.3.3页命中 808

9.3.4缺页 808

9.3.5分配页面 810

9.3.6又是局部性救了我们 810

9.4虚拟内存作为内存管理的工具 811

9.5虚拟内存作为内存保护的工具 812

9.6地址翻译 813

9.6.1结合高速缓存和虚拟内存 817

9.6.2利用TLB加速地址翻译 817

9.6.3多级页表 819

9.6.4综合:端到端的地址翻译 821

9.7案例研究:Intel Core i7/Linux内存系统 825

9.7.1 Core i7地址翻译 826

9.7.2 Linux虚拟内存系统 828

9.8内存映射 833

9.8.1再看共享对象 833

9.8.2再看fork函数 836

9.8.3再看execve函数 836

9.8.4使用mmap函数的用户级内存映射 837

9.9动态内存分配 839

9.9.1 malloc和free函数 840

9.9.2为什么要使用动态内存分配 843

9.9.3分配器的要求和目标 844

9.9.4碎片 846

9.9.5实现问题 846

9.9.6隐式空闲链表 847

9.9.7放置已分配的块 849

9.9.8分割空闲块 849

9.9.9获取额外的堆内存 850

9.9.10合并空闲块 850

9.9.11带边界标记的合并 851

9.9.12综合:实现一个简单的分配器 854

9.9.13显式空闲链表 862

9.9.14分离的空闲链表 863

9.10垃圾收集 865

9.10.1垃圾收集器的基本知识 866

9.10.2 Mark&Sweep垃圾收集器 867

9.10.3 C程序的保守Mark&Sweep 869

9.11 C程序中常见的与内存有关的错误 870

9.11.1间接引用坏指针 870

9.11.2读未初始化的内存 871

9.11.3允许栈缓冲区溢出 871

9.11.4假设指针和它们指向的对象是相同大小的 872

9.11.5造成错位错误 872

9.11.6引用指针,而不是它所指向的对象 873

9.11.7误解指针运算 873

9.11.8引用不存在的变量 874

9.11.9引用空闲堆块中的数据 874

9.11.10引起内存泄漏 875

9.12小结 875

参考文献说明 876

家庭作业 876

练习题答案 880

第三部分 程序间的交互和通信 889

第10章 系统级I/O 889

10.1 Unix I/O 890

10.2文件 891

10.3打开和关闭文件 893

10.4读和写文件 895

10.5用RIO包健壮地读写 897

10.5.1 RIO的无缓冲的输入输出函数 897

10.5.2 RIO的带缓冲的输入函数 898

10.6读取文件元数据 903

10.7读取目录内容 905

10.8共享文件 906

10.9 I/O重定向 909

10.10标准I/O 911

10.11综合:我该使用哪些I/O函数? 911

10.12小结 913

参考文献说明 914

家庭作业 914

练习题答案 915

第11章 网络编程 917

11.1客户端-服务器编程模型 918

11.2网络 919

11.3全球IP因特网 924

11.3.1IP地址 925

11.3.2因特网域名 927

11.3.3因特网连接 929

11.4套接字接口 932

11.4.1套接字地址结构 933

11.4.2 socket函数 934

11.4.3 connect函数 934

11.4.4 bind函数 935

11.4.5 listen函数 935

11.4.6 accept函数 936

11.4.7主机和服务的转换 937

11.4.8套接字接口的辅助函数 942

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

11.5 Web服务器 948

11.5.1 Web基础 948

11.5.2 Web内容 949

11.5.3 HTTP事务 950

11.5.4服务动态内容 953

11.6综合:TINY Web服务器 956

11.7小结 964

参考文献说明 965

家庭作业 965

练习题答案 966

第12章 并发编程 971

12.1基于进程的并发编程 973

12.1.1基于进程的并发服务器 974

12.1.2进程的优劣 975

12.2基于I/O多路复用的并发编程 977

12.2.1基于I/O多路复用的并发事件驱动服务器 980

12.2.2 I/O多路复用技术的优劣 985

12.3基于线程的并发编程 985

12.3.1线程执行模型 986

12.3.2 Posix线程 987

12.3.3创建线程 988

12.3.4终止线程 988

12.3.5回收已终止线程的资源 989

12.3.6分离线程 989

12.3.7初始化线程 990

12.3.8基于线程的并发服务器 991

12.4多线程程序中的共享变量 992

12.4.1线程内存模型 993

12.4.2将变量映射到内存 994

12.4.3共享变量 995

12.5用信号量同步线程 995

12.5.1进度图 999

12.5.2信号量 1001

12.5.3使用信号量来实现互斥 1002

12.5.4利用信号量来调度共享资源 1004

12.5.5综合:基于预线程化的并发服务器 1008

12.6使用线程提高并行性 1013

12.7其他并发问题 1020

12.7.1线程安全 1020

12.7.2可重入性 1023

12.7.3在线程化的程序中使用已存在的库函数 1024

12.7.4竞争 1025

12.7.5死锁 1027

12.8小结 1030

参考文献说明 1030

家庭作业 1031

练习题答案 1036

附录A 错误处理 1041

参考文献 1047

查看更多关于的内容

上一篇:越南三弄下一篇:我的大学
本类热门
在线购买PDF电子书
下载此书RAR压缩包