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


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

文章插图
英文版封面定价:128.00元图书目录出版者的话译者序前 言第1章 计算机系统漫游11.1 信息就是位+上下文11.2 程式被其他程式翻译成不同的格式31.3 了解编译系统如何工作是大有益处的41.4 处理器读并解释存储在存储器中的指令51.4.1 系统的硬体组成51.4.2 运行hello程式71.5 高速快取至关重要71.6 存储设备形成层次结构91.7 作业系统管理硬体101.7.1 进程111.7.2 执行绪121.7.3 虚拟存储器121.7.4 档案131.8 系统之间利用网路通信131.9 重要主题151.9.1 并发和并行151.9.2 计算机系统中抽象的重要性171.10 小结17参考文献说明18第一部分 程式结构和执行第2章 信息的表示和处理202.1 信息存储222.1.1 十六进制表示法222.1.2 字252.1.3 数据大小252.1.4 定址和位元组顺序262.1.5 表示字元串312.1.6 表示代码312.1.7 布尔代数简介322.1.8 C语言中的位级运算342.1.9 C语言中的逻辑运算362.1.10 C语言中的移位运算362.2 整数表示382.2.1 整型数据类型382.2.2 无符号数的编码392.2.3 补码编码402.2.4 有符号数和无符号数之间的转换442.2.5 C语言中的有符号数与无符号数472.2.6 扩展一个数字的位表示492.2.7 截断数字512.2.8 关于有符号数与无符号数的建议522.3 整数运算542.3.1 无符号加法542.3.2 补码加法572.3.3 补码的非592.3.4 无符号乘法602.3.5 补码乘法602.3.6 乘以常数632.3.7 除以2的幂642.3.8 关于整数运算的最后思考672.4 浮点数672.4.1 二进制小数682.4.2 IEEE浮点表示70 2.4.3 数字示例712.4.4 捨入742.4.5 浮点运算762.4.6 C语言中的浮点数772.5 小结79参考文献说明80家庭作业80练习题答案90第3章 程式的机器级表示1023.1 历史观点1033.2 程式编码1053.2.1 机器级代码1063.2.2 代码示例1073.2.3 关于格式的注解1093.3 数据格式1113.4 访问信息1123.4.1 运算元指示符1123.4.2 数据传送指令1143.4.3 数据传送示例1163.5 算术和逻辑操作1183.5.1 载入有效地址1183.5.2 一元操作和二元操作1193.5.3 移位操作1203.5.4 讨论1203.5.5 特殊的算术操作1223.6 控制1233.6.1 条件码1243.6.2 访问条件码1253.6.3 跳转指令及其编码1273.6.4 翻译条件分支1293.6.5 循环1323.6.6 条件传送指令1393.6.7 switch语句1443.7 过程1493.7.1 栈帧结构1493.7.2 转移控制1503.7.3 暂存器使用惯例1513.7.4 过程示例1523.7.5 递归过程1563.8 数组分配和访问1583.8.1 基本原则1583.8.2 指针运算1593.8.3 嵌套的数组1593.8.4 定长数组1613.8.5 变长数组1633.9 异质的数据结构1643.9.1 结构1643.9.2 联合1673.9.3 数据对齐1703.10 综合:理解指针1723.11 套用:使用GDB调试器1743.12 存储器的越界引用和缓冲区溢出1753.13 x86-64:将IA32扩展到64位1833.13.1 x86-64的历史和动因1843.13.2 x86-64简介1853.13.3 访问信息1873.13.4 控制1923.13.5 数据结构2003.13.6 关于x86-64的总结性评论2003.14 浮点程式的机器级表示2013.15 小结201参考文献说明202家庭作业202练习题答案212第4章 处理器体系结构2304.1 Y86指令集体系结构2314.1.1 程式设计师可见的状态2314.1.2 Y86指令2324.1.3 指令编码2334.1.4 Y86异常2374.1.5 Y86程式2374.1.6 一些Y86指令的详情2414.2 逻辑设计和硬体控制语言HCL242 4.2.1 逻辑门2434.2.2 组合电路和HCL布尔表达式2434.2.3 字级的组合电路和HCL整数表达式2454.2.4 集合关係2484.2.5 存储器和时钟2484.3 Y86的顺序实现2504.3.1 将处理组织成阶段2504.3.2 SEQ硬体结构2584.3.3 SEQ的时序2594.3.4 SEQ阶段的实现2624.4 流水线的通用原理2674.4.1 计算流水线2684.4.2 流水线操作的详细说明2694.4.3 流水线的局限性2714.4.4 带反馈的流水线系统2724.5 Y86的流水线实现2734.5.1 SEQ+:重新安排计算阶段2734.5.2 插入流水线暂存器2764.5.3 对信号进行重新排列和标号2774.5.4 预测下一个PC2794.5.5 流水线冒险2804.5.6 用暂停来避免数据冒险2834.5.7 用转发来避免数据冒险2854.5.8 载入/使用数据冒险2884.5.9 异常处理2894.5.10 PIPE各阶段的实现2914.5.11 流水线控制逻辑2974.5.12 性能分析3054.5.13 未完成的工作3064.6 小结308参考文献说明309家庭作业309练习题答案314第5章 最佳化程式性能3245.1 最佳化编译器的能力和局限性3255.2 表示程式性能3285.3 程式示例3305.4 消除循环的低效率3325.5 减少过程调用3365.6 消除不必要的存储器引用3365.7 理解现代处理器3405.7.1 整体操作3405.7.2 功能单元的性能3435.7.3 处理器操作的抽象模型3445.8 循环展开3485.9 提高并行性3515.9.1 多个累积变数3515.9.2 重新结合变换3545.10 最佳化合併代码的结果小结3585.11 一些限制因素3595.11.1 暂存器溢出3595.11.2 分支预测和预测错误处罚3605.12 理解存储器性能3635.12.1 载入的性能3635.12.2 存储的性能3645.13 套用:性能提高技术3695.14 确认和消除性能瓶颈3695.14.1 程式剖析3705.14.2 使用剖析程式来指导最佳化3715.14.3 Amdahl定律3745.15 小结375参考文献说明375家庭作业376练习题答案378第6章 存储器层次结构3826.1存储技术3826.1.1 随机访问存储器383 6.1.2 磁碟存储3896.1.3 固态硬碟3986.1.4 存储技术趋势3996.2 局部性4016.2.1 对程式数据引用的局部性4026.2.2 取指令的局部性4036.2.3 局部性小结4036.3 存储器层次结构4056.3.1 存储器层次结构中的快取4066.3.2 存储器层次结构概念小结4086.4 高速快取存储器4086.4.1 通用的高速快取存储器结构4096.4.2 直接映射高速快取4106.4.3 组相联高速快取4166.4.4 全相联高速快取4186.4.5 有关写的问题4206.4.6 一个真实的高速快取层次结构的解剖4216.4.7 高速快取参数的性能影响4226.5 编写高速快取友好的代码4236.6 综合:高速快取对程式性能的影响4266.6.1 存储器山4266.6.2 重新排列循环以提高空间局部性4306.6.3 在程式中利用局部性4336.7 小结433参考文献说明434家庭作业434练习题答案442第二部分 在系统上运行程式第7章 连结4487.1 编译器驱动程式4497.2 静态连结4507.3 目标档案4507.4 可重定位目标档案4517.5 符号和符号表4527.6 符号解析4547.6.1 连结器如何解析多重定义的全局符号4557.6.2 与静态库连结4577.6.3 连结器如何使用静态库来解析引用4607.7 重定位4617.7.1 重定位条目4617.7.2 重定位符号引用4627.8 可执行目标档案4657.9 载入可执行目标档案4667.10 动态连结共享库4677.11 从应用程式中载入和连结共享库4687.12 与位置无关的代码(PIC)4717.13 处理目标档案的工具4737.14 小结473参考文献说明474家庭作业474练习题答案479第8章 异常控制流4808.1 异常4818.1.1 异常处理4818.1.2 异常的类别4828.1.3 Linux/IA32系统中的异常4848.2 进程4878.2.1 逻辑控制流4878.2.2 并发流4878.2.3 私有地址空间4888.2.4 用户模式和核心模式4888.2.5 上下文切换4898.3 系统调用错误处理4918.4 进程控制4928.4.1 获取进程ID4928.4.2 创建和终止进程4928.4.3 回收子进程495 8.4.4 让进程休眠4998.4.5 载入并运行程式5008.4.6 利用fork和execve运行程式5028.5 信号5048.5.1 信号术语5058.5.2 传送信号5068.5.3 接收信号5098.5.4 信号处理问题5118.5.5 可移植的信号处理5168.5.6 显式地阻塞和取消阻塞信号5178.5.7 同步流以避免讨厌的并发错误5178.6 非本地跳转5218.7 操作进程的工具5248.8 小结524参考文献说明525家庭作业525练习题答案530第9章 虚拟存储器5349.1 物理和虚拟定址5359.2 地址空间5359.3 虚拟存储器作为快取的工具5369.3.1 DRAM快取的组织结构5379.3.2 页表5379.3.3 页命中5389.3.4 缺页5389.3.5 分配页面5399.3.6 又是局部性救了我们5399.4 虚拟存储器作为存储器管理的工具5409.5 虚拟存储器作为存储器保护的工具5419.6 地址翻译5429.6.1 结合高速快取和虚拟存储器5449.6.2 利用TLB加速地址翻译5459.6.3 多级页表5469.6.4 综合:端到端的地址翻译5479.7 案例研究:Intel Core i7/Linux存储器系统5509.7.1 Core i7地址翻译5519.7.2 Linux虚拟存储器系统5549.8 存储器映射5569.8.1 再看共享对象5579.8.2 再看fork函式5589.8.3 再看execve函式5599.8.4 使用mmap函式的用户级存储器映射5599.9 动态存储器分配5619.9.1 malloc和free函式5619.9.2 为什幺要使用动态存储器分配5639.9.3 分配器的要求和目标5649.9.4 碎片5659.9.5 实现问题5659.9.6 隐式空闲鍊表5659.9.7 放置已分配的块5679.9.8 分割空闲块5679.9.9 获取额外的堆存储器5679.9.10 合併空闲块5689.9.11 带边界标记的合併5689.9.12 综合:实现一个简单的分配器5709.9.13 显式空闲鍊表5769.9.14 分离的空闲鍊表5769.10 垃圾收集5789.10.1 垃圾收集器的基本知识5799.10.2 Mark&Sweep垃圾收集器580 9.10.3 C程式的保守Mark&Sweep5809.11 C程式中常见的与存储器有关的错误5819.11.1 间接引用坏指针5829.11.2 读未初始化的存储器5829.11.3 允许栈缓冲区溢出5829.11.4 假设指针和它们指向的对象是相同大小的5839.11.5 造成错位错误5839.11.6 引用指针,而不是它所指向的对象5839.11.7 误解指针运算5849.11.8 引用不存在的变数5849.11.9 引用空闲堆块中的数据5849.11.10 引起存储器泄漏5859.12 小结585参考文献说明586家庭作业586练习题答案589第三部分 程式间的互动和通信第10章 系统级I/O59610.1 Unix I/O59610.2 打开和关闭档案59710.3 读和写档案59810.4 用RIO包健壮地读写59910.4.1 RIO的无缓冲的输入输出函式60010.4.2 RIO的带缓冲的输入函式60010.5 读取档案元数据60410.6 已分享档案60610.7 I/O重定向60810.8 标準I/O60910.9 综合:我该使用哪些I/O函式61010.10 小结611参考文献说明612家庭作业612练习题答案612第11章 网路编程61411.1 客户端-伺服器编程模型61411.2 网路61511.3 全球IP网际网路61811.3.1 IP位址61911.3.2 网际网路域名62011.3.3 网际网路连线62311.4 套接字接口62511.4.1 套接字地址结构62511.4.2 socket函式62611.4.3 connect函式62611.4.4 open_clientfd函式62711.4.5 bind函式62811.4.6 listen函式62811.4.7 open_listenfd函式62811.4.8 accept函式62911.4.9 echo客户端和伺服器的示例63011.5 Web伺服器63311.5.1 Web基础63311.5.2 Web内容63311.5.3 HTTP事务63411.5.4 服务动态内容63611.6 综合:TINY Web伺服器63911.7 小结645参考文献说明645家庭作业646练习题答案646第12章 并发编程64812.1 基于进程的并发编程64912.1.1 基于进程的并发伺服器64912.1.2 关于进程的优劣651 12.2 基于I/O多路复用的并发编程65112.2.1 基于I/O多路复用的并发事件驱动伺服器65312.2.2 I/O多路复用技术的优劣65712.3 基于执行绪的并发编程65712.3.1 执行绪执行模型65712.3.2 Posix执行绪65812.3.3 创建执行绪65912.3.4 终止执行绪65912.3.5 回收已终止执行绪的资源66012.3.6 分离执行绪66012.3.7 初始化执行绪66012.3.8 一个基于执行绪的并发伺服器66112.4 多执行绪程式中的共享变数66212.4.1 执行绪存储器模型66312.4.2 将变数映射到存储器66312.4.3 共享变数66412.5 用信号量同步执行绪66412.5.1 进度图66712.5.2 信号量66812.5.3 使用信号量来实现互斥66912.5.4 利用信号量来调度共享资源67012.5.5 综合:基于预执行绪化的并发伺服器67412.6 使用执行绪提高并行性67612.7 其他并发问题68012.7.1 执行绪安全68012.7.2 可重入性68212.7.3 线上程化的程式中使用已存在的库函式68212.7.4 竞争68312.7.5 死锁68512.8 小结687参考文献说明687家庭作业688练习题答案691附录A 错误处理694A.1 Unix系统中的错误处理694A.2错误处理包装函式696参考文献698