英文版·第3版 深入理解计算机系统


英文版·第3版 深入理解计算机系统

文章插图
深入理解计算机系统(英文版·第3版)【英文版·第3版 深入理解计算机系统】《深入理解计算机系统(英文版·第3版)》是2017年机械工业出版社出版图书,作者[美] 兰德尔 E.布莱恩特(Randal E. Bryant)大卫 R. 奥哈拉伦(David R. O'Hallaron) 。
基本介绍书名:深入理解计算机系统(英文版·第3版)
作者:[美] 兰德尔 E.布莱恩特(Randal E. Bryant)大卫 R. 奥哈拉伦(David R. O'Hallaron)
出版社:机械工业出版社 
出版时间:2017年
出版信息ISBN(书号):978-7-111-56127-9丛书名:经典原版书库出版日期:2017-04版次:1/1开本:16定价:¥239.00内容简介本书是一本将计算机软体和硬体理论结合讲述的经典教材,内容涵盖计算机导论、体系结构和处理器设计等多门课程 。本书最大的特点是为程式设计师描述计算机系统的实现细节,通过描述程式是如何映射到系统上,以及程式是如何执行的,使读者更好地理解程式的行为,找到程式效率低下的原因 。和第2版相比,本版内容上最大的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础 。主要更新如下:· 基于x86-64,大量地重写代码,首次介绍对处理浮点数据的程式的机器级支持 。· 处理器体系结构修改为支持64位字和操作的设计 。· 引入更多的功能单元和更複杂的控制逻辑,使基于程式数据流表示的程式性能模型预测更加可靠 。· 扩充关于用GOT和PLT创建与位置无关代码的讨论,描述了更加强大的连结技术(比如库打桩) 。· 增加了对信号处理程式更细緻的描述,包括异步信号安全的函式等 。· 採用最新函式,更新了与协定无关和执行绪安全的网路编程 。图书目录Preface xix About the Authors xxxv1A Tour of Computer Systems 11.1 Information Is Bits + Context 31.2 Programs Are Translated by Other Programs into Different Forms 41.3 It Pays to Understand How Compilation Systems Work 61.4 Processors Read and Interpret Instructions Stored in Memory 71.4.1 Hardware Organization of a System 81.4.2 Running the helloProgram 101.5 Caches Matter 111.6 Storage Devices Form a Hierarchy 141.7 The Operating System Manages the Hardware 141.7.1 Processes 151.7.2 Threads 171.7.3 Virtual Memory 181.7.4 Files 191.8 Systems Communicate with Other Systems Using Networks 191.9 Important Themes 221.9.1 Amdahl’s Law 221.9.2 Concurrency and Parallelism 241.9.3 The Importance of Abstractions in Computer Systems 261.10 Summary 27 Bibliographic Notes 28 Solutions to Practice Problems 28Part I Program Structure and Execution2Representing and Manipulating Information 312.1 Information Storage 342.1.1 Hexadecimal Notation 362.1.2 Data Sizes 392.1.3 Addressing and Byte Ordering 422.1.4 Representing Strings 492.1.5 Representing Code 492.1.6 Introduction to Boolean Algebra 502.1.7 Bit-Level Operations in C 542.1.8 Logical Operations in C 562.1.9 Shift Operations in C 572.2 Integer Representations 592.2.1 Integral Data Types 602.2.2 Unsigned Encodings 622.2.3 Two’s-Complement Encodings 642.2.4 Conversions between Signed and Unsigned 702.2.5 Signed versus Unsigned in C 742.2.6 Expanding the Bit Representation of a Number 762.2.7 Truncating Numbers 812.2.8 Advice on Signed versus Unsigned 832.3 Integer Arithmetic 842.3.1 Unsigned Addition 842.3.2 Two’s-Complement Addition 902.3.3 Two’s-Complement Negation 952.3.4 Unsigned Multiplication 962.3.5 Two’s-Complement Multiplication 972.3.6 Multiplying by Constants 1012.3.7 Dividing by Powers of 2 103 2.3.8 Final Thoughts on Integer Arithmetic 1072.4 Floating Point 1082.4.1 Fractional Binary Numbers 1092.4.2 IEEE Floating-Point Representation 1122.4.3 Example Numbers 1152.4.4 Rounding 1202.4.5 Floating-Point Operations 1222.4.6 Floating Point in C 1242.5 Summary 126Bibliographic Notes 127Homework Problems 128Solutions to Practice Problems 1433Machine-Level Representation of Programs 1633.1 A Historical Perspective 1663.2 Program Encodings 1693.2.1 Machine-Level Code 1703.2.2 Code Examples 1723.2.3 Notes on Formatting 1753.3 Data Formats 1773.4 Accessing Information 1793.4.1 Operand Speci.ers 1803.4.2 Data Movement Instructions 1823.4.3 Data Movement Example 1863.4.4 Pushing and Popping Stack Data 1893.5 Arithmetic and Logical Operations 1913.5.1 Load Effective Address 1913.5.2 Unary and Binary Operations 1943.5.3 Shift Operations 1943.5.4 Discussion 1963.5.5 Special Arithmetic Operations 1973.6 Control 2003.6.1 Condition Codes 2013.6.2 Accessing the Condition Codes 2023.6.3 Jump Instructions 2053.6.4 Jump Instruction Encodings 2073.6.5 Implementing Conditional Branches withConditional Control 209 3.6.6 Implementing Conditional Branches withConditional Moves 2143.6.7 Loops 2203.6.8 Switch Statements 2323.7 Procedures 2383.7.1 The Run-Time Stack 2393.7.2 Control Transfer 2413.7.3 Data Transfer 2453.7.4 Local Storage on the Stack 2483.7.5 Local Storage in Registers 2513.7.6 Recursive Procedures 2533.8 Array Allocation and Access 2553.8.1 Basic Principles 2553.8.2 Pointer Arithmetic 2573.8.3 Nested Arrays 2583.8.4 Fixed-Size Arrays 2603.8.5 Variable-Size Arrays 2623.9 Heterogeneous Data Structures 2653.9.1 Structures 2653.9.2 Unions 2693.9.3 Data Alignment 2733.10 Combining Control and Data in Machine-Level Programs 2763.10.1 Understanding Pointers 2773.10.2 Life in the Real World: Using the gdbDebugger 2793.10.3 Out-of-Bounds Memory References and Buffer Over.ow 2793.10.4 Thwarting Buffer Over.ow Attacks 2843.10.5 Supporting Variable-Size Stack Frames 2903.11 Floating-Point Code 2933.11.1 Floating-Point Movement and Conversion Operations 2963.11.2 Floating-Point Code in Procedures 3013.11.3 Floating-Point Arithmetic Operations 3023.11.4 De.ning and Using Floating-Point Constants 3043.11.5 Using Bitwise Operations in Floating-Point Code 3053.11.6 Floating-Point Comparison Operations 306 3.11.7 Observations about Floating-Point Code 3093.12 Summary 309Bibliographic Notes 310Homework Problems 311Solutions to Practice Problems 3254Processor Architecture 3514.1 The Y86-64 Instruction Set Architecture 3554.1.1 Programmer-Visible State 3554.1.2 Y86-64 Instructions 3564.1.3 Instruction Encoding 3584.1.4 Y86-64 Exceptions 3634.1.5 Y86-64 Programs 3644.1.6 Some Y86-64 Instruction Details 3704.2 Logic Design and the Hardware Control Language HCL 3724.2.1 Logic Gates 3734.2.2 Combinational Circuits and HCL Boolean Expressions 3744.2.3 Word-Level Combinational Circuits and HCLInteger Expressions 3764.2.4 Set Membership 3804.2.5 Memory and Clocking 3814.3 Sequential Y86-64 Implementations 3844.3.1 Organizing Processing into Stages 3844.3.2 SEQ Hardware Structure 3964.3.3 SEQ Timing 4004.3.4 SEQ Stage Implementations 4044.4 General Principles of Pipelining 4124.4.1 Computational Pipelines 4124.4.2 A Detailed Look at Pipeline Operation 4144.4.3 Limitations of Pipelining 4164.4.4 Pipelining a System with Feedback 4194.5 Pipelined Y86-64 Implementations 4214.5.1 SEQ+: Rearranging the Computation Stages 4214.5.2 Inserting Pipeline Registers 422 4.5.3 Rearranging and Relabeling Signals 4264.5.4 Next PC Prediction 4274.5.5 Pipeline Hazards 4294.5.6 Exception Handling 4444.5.7 PIPE Stage Implementations 4474.5.8 Pipeline Control Logic 4554.5.9 Performance Analysis 4644.5.10 Un.nished Business 4684.6 Summary 4704.6.1 Y86-64 Simulators 472Bibliographic Notes 473Homework Problems 473Solutions to Practice Problems 4805Optimizing Program Performance 4955.1 Capabilities and Limitations of Optimizing Compilers 4985.2 Expressing Program Performance 5025.3 Program Example 5045.4 Eliminating Loop Inef.ciencies 5085.5 Reducing Procedure Calls 5125.6 Eliminating Unneeded Memory References 5145.7 Understanding Modern Processors 5175.7.1 Overall Operation 5185.7.2 Functional Unit Performance 5235.7.3 An Abstract Model of Processor Operation 5255.8 Loop Unrolling 5315.9 Enhancing Parallelism 5365.9.1 Multiple Accumulators 5365.9.2 Reassociation Transformation 5415.10 Summary of Results for Optimizing Combining Code 5475.11 Some Limiting Factors 5485.11.1 Register Spilling 5485.11.2 Branch Prediction and Misprediction Penalties 5495.12 Understanding Memory Performance 553 5.12.1 Load Performance 5545.12.2 Store Performance 5555.13 Life in the Real World: Performance Improvement Techniques 5615.14 Identifying and Eliminating Performance Bottlenecks 5625.14.1 Program Pro.ling 5625.14.2 Using a Pro.ler to Guide Optimization 5655.15 Summary 568Bibliographic Notes 569Homework Problems 570Solutions to Practice Problems 5736The Memory Hierarchy 5796.1 Storage Technologies 5816.1.1 Random Access Memory 5816.1.2 Disk Storage 5896.1.3 Solid State Disks 6006.1.4 Storage Technology Trends 6026.2 Locality 6046.2.1 Locality of References to Program Data 6066.2.2 Locality of Instruction Fetches 6076.2.3 Summary of Locality 6086.3 The Memory Hierarchy 6096.3.1 Caching in the Memory Hierarchy 6106.3.2 Summary of Memory Hierarchy Concepts 6146.4 Cache Memories 6146.4.1 Generic Cache Memory Organization 6156.4.2 Direct-Mapped Caches 6176.4.3 Set Associative Caches 6246.4.4 Fully Associative Caches 6266.4.5 Issues with Writes 6306.4.6 Anatomy of a Real Cache Hierarchy 6316.4.7 Performance Impact of Cache Parameters 6316.5 Writing Cache-Friendly Code 6336.6 Putting It Together: The Impact of Caches on Program Performance 6396.6.1 The Memory Mountain 639 6.6.2 Rearranging Loops to Increase Spatial Locality 6436.6.3 Exploiting Locality in Your Programs 6476.7 Summary 648Bibliographic Notes 648Homework Problems 649Solutions to Practice Problems 660Part II Running Programs on a System7Linking 6697.1 Compiler Drivers 6717.2 Static Linking 6727.3 Object Files 6737.4 Relocatable Object Files 6747.5 Symbols and Symbol Tables 6757.6 Symbol Resolution 6797.6.1 How Linkers Resolve Duplicate Symbol Names 6807.6.2 Linking with Static Libraries 6847.6.3 How Linkers Use Static Libraries to Resolve References 6887.7 Relocation 6897.7.1 Relocation Entries 6907.7.2 Relocating Symbol References 6917.8 Executable Object Files 6957.9 Loading Executable Object Files 6977.10 Dynamic Linking with Shared Libraries 6987.11 Loading and Linking Shared Libraries from Applications 7017.12 Position-Independent Code (PIC) 7047.13 Library Interpositioning 7077.13.1 Compile-Time Interpositioning 7087.13.2 Link-Time Interpositioning 7087.13.3 Run-Time Interpositioning 7107.14 Tools for Manipulating Object Files 7137.15 Summary 713Bibliographic Notes 714Homework Problems 714Solutions to Practice Problems 717 第8章 异常控制流 7218.1 异常 7238.1.1 异常处理 7248.1.2 异常的类别 7268.1.3 Linux/x86-64系统中的异常 7298.2 进程 7328.2.1 逻辑控制流 7328.2.2 并发流 7338.2.3 私有地址空间 7348.2.4 用户模式和核心模式 7348.2.5 上下文切换 7368.3 系统调用错误处理 7378.4 进程控制 7388.4.1 获取进程ID 7398.4.2 创建和终止进程 7398.4.3 回收子进程 7438.4.4 让进程休眠 7498.4.5 载入并运行程式 7508.4.6 利用fork和execve运行程式 7538.5 信号 7568.5.1 信号术语 7588.5.2 传送信号 7598.5.3 接收信号 7628.5.4 阻塞和解除阻塞信号 7648.5.5 编写信号处理程式 7668.5.6 同步流以避免讨厌的并发错误 7768.5.7 显式地等待信号 7788.6 非本地跳转 7818.7 操作进程的工具 7868.8 小结 787参考文献说明 787家庭作业 788练习题答案 795第9章 虚拟记忆体 8019.1 物理和虚拟定址 8039.2 地址空间 8049.3 虚拟记忆体作为快取的工具 8059.3.1 DRAM快取的组织结构 8069.3.2 页表 8069.3.3 页命中 8089.3.4 缺页 8089.3.5 分配页面 8109.3.6 又是局部性救了我们 8109.4 虚拟记忆体作为记忆体管理的工具 8119.5 虚拟记忆体作为记忆体保护的工具 8129.6 地址翻译 8139.6.1 结合高速快取和虚拟记忆体 8179.6.2 利用TLB加速地址翻译 8179.6.3 多级页表 8199.6.4 综合:端到端的地址翻译 8219.7 案例研究:Intel Core i7/Linux记忆体系统 8259.7.1 Core i7地址翻译 8269.7.2 Linux虚拟记忆体系统 8289.8 记忆体映射 8339.8.1 再看共享对象 8339.8.2 再看fork函式 8369.8.3 再看execve函式 8369.8.4 使用mmap函式的用户级记忆体映射 8379.9 动态记忆体分配 8399.9.1 malloc和free函式 8409.9.2 为什幺要使用动态记忆体分配 843 9.9.3 分配器的要求和目标 8449.9.4 碎片 8469.9.5 实现问题 8469.9.6 隐式空闲鍊表 8479.9.7 放置已分配的块 8499.9.8 分割空闲块 8499.9.9 获取额外的堆记忆体 8509.9.10 合併空闲块 8509.9.11 带边界标记的合併 8519.9.12 综合:实现一个简单的分配器 8549.9.13 显式空闲鍊表 8629.9.14 分离的空闲鍊表 8639.10 垃圾收集 8659.10.1 垃圾收集器的基本知识 8669.10.2 Mark&Sweep垃圾收集器 8679.10.3 C程式的保守Mark&Sweep 8699.11 C程式中常见的与记忆体有关的错误 8709.11.1 间接引用坏指针 8709.11.2 读未初始化的记忆体 8719.11.3 允许栈缓冲区溢出 8719.11.4 假设指针和它们指向的对象是相同大小的 8729.11.5 造成错位错误 8729.11.6 引用指针,而不是它所指向的对象 8739.11.7 误解指针运算 8739.11.8 引用不存在的变数 8749.11.9 引用空闲堆块中的数据 8749.11.10 引起记忆体泄漏 8759.12 小结 875参考文献说明 876家庭作业 876练习题答案 880第三部分程式间的互动和通信第10章 系统级I/O 88910.1 Unix I/O 89010.2 档案 89110.3 打开和关闭档案 89310.4 读和写档案 89510.5 用RIO包健壮地读写 89710.5.1 RIO的无缓冲的输入输出函式 89710.5.2 RIO的带缓冲的输入函式 89810.6 读取档案元数据 90310.7 读取目录内容 90510.8 已分享档案 90610.9 I/O重定向 90910.10 标準I/O 91110.11 综合:我该使用哪些I/O函式? 91110.12 小结 913参考文献说明 914家庭作业 914练习题答案 915第11章 网路编程 91711.1 客户端–伺服器编程模型 91811.2 网路 91911.3 全球IP网际网路 92411.3.1 IP位址 92511.3.2 网际网路域名 92711.3.3 网际网路连线 92911.4 套接字接口 93211.4.1 套接字地址结构 93311.4.2 socket函式 934 11.4.3 connect函式 93411.4.4 bind函式 93511.4.5 listen函式 93511.4.6 accept函式 93611.4.7 主机和服务的转换 93711.4.8 套接字接口的辅助函式 94211.4.9 echo客户端和伺服器的示例 94411.5 Web伺服器 94811.5.1 Web基础 94811.5.2 Web内容 94911.5.3 HTTP事务 95011.5.4 服务动态内容 95311.6 综合:TINY Web伺服器 95611.7 小结 964参考文献说明 965家庭作业 965练习题答案 966第12章 并发编程 97112.1 基于进程的并发编程 97312.1.1 基于进程的并发伺服器 97412.1.2 进程的优劣 97512.2 基于I/O多路复用的并发编程 97712.2.1 基于I/O多路复用的并发事件驱动伺服器 98012.2.2 I/O多路复用技术的优劣 98512.3 基于执行绪的并发编程 98512.3.1 执行绪执行模型 98612.3.2 Posix执行绪 98712.3.3 创建执行绪 98812.3.4 终止执行绪 98812.3.5 回收已终止执行绪的资源 98912.3.6 分离执行绪 98912.3.7 初始化执行绪 99012.3.8 基于执行绪的并发伺服器 99112.4 多执行绪程式中的共享变数 99212.4.1 执行绪记忆体模型 99312.4.2 将变数映射到记忆体 99412.4.3 共享变数 99512.5 用信号量同步执行绪 99512.5.1 进度图 99912.5.2 信号量 100112.5.3 使用信号量来实现互斥 100212.5.4 利用信号量来调度共享资源 100412.5.5 综合:基于预执行绪化的并发伺服器 100812.6 使用执行绪提高并行性 101312.7 其他并发问题 102012.7.1 执行绪安全 102012.7.2 可重入性 102312.7.3 线上程化的程式中使用已存在的库函式 102412.7.4 竞争 102512.7.5 死锁 102712.8 小结 1030参考文献说明 1030家庭作业 1031练习题答案 1036附录A 错误处理 1041参考文献 1047