《CSAPP —— Randal.E.Bryant》读书笔记

2016/08/29 blog 共 3037 字,约 9 分钟
Bob.Zhu

序论

第一章 计算机系统漫游

  • 信息就是位+上下
  • 程序被其他程序翻译成不同的格式
  • 了解编译系统如何工作是大有裨益的
  • 处理器读取并解释存储在存储器中的指令
  • 高速缓存
  • 形成层次结构的存储设备
  • 操作系统管理硬件
  • 利用网络系统和其他系统通信

1.1 信息就是位+上下

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

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

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

1.5 高速缓存

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

1.7 操作系统管理硬件

1.8 利用网络系统和其他系统通信

1.9 下一步

第一部分 程序执行和结构

第二章 信息的表示和处理

*信息存储
*整数表示
*整数运算
*浮点

2.1 信息存储

2.2 整数表示

2.3 整数运算

2.4 浮点

第三章 程序的机器级表示

  • 历史观点
  • 程序编码
  • 数据格式
  • 访问信息
  • 算数和逻辑操作
  • 控制
  • 过程
  • 数组分配和访问
  • 异类的数据结构
  • 对齐
  • 综合:理解指针
  • 现实生活:使用GDB调试器
  • 存储器的越界引用和缓冲区溢出
  • *浮点代码
  • *在C程序中嵌入汇编代码

3.1 历史观点

3.2 程序编码

3.3 数据格式

3.4 访问信息

3.5 算数和逻辑操作

3.6 控制

3.7 过程

3.8 数组分配和访问

3.9 异类的数据结构

3.10 对齐

3.11 综合:理解指针

3.12 现实生活:使用GDB调试器

3.13 存储器的越界引用和缓冲区溢出

3.14 * 浮点代码

3.15 * 在C程序中嵌入汇编代码

第四章 处理器体系结构

  • Y86指令集体系结构
  • 逻辑设计和硬件设计语言 HCL
  • Y86的顺序实现
  • 流水线的通用原理
  • Y86的流水线实现

4.1 Y86指令集体系结构

4.2 逻辑设计和硬件设计语言 HCL

4.3 Y86的顺序实现

4.4 流水线的通用原理

4.5 Y86的流水线实现

第五章 优化程序性能

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

5.2 表示程序性能

5.3 程序示例

5.4 消除循环的低效率

5.5 减少过程调用

5.6 消除不必要的存储器引用

5.7 理解现代处理器

5.8 较低循环开销

5.9 转换到指针代码

5.10 提高并行性

5.11 综合:优化合并代码的效果小结

5.12 分之预测和预测错误处罚

5.13 理解存储器性能

5.14 现实生活:性能提高技术

5.15 确认和消除性能瓶颈

第六章 存储器层次结构

6.1 存储技术

6.2 局部性

6.3 存储器层次结构

6.4 高速缓存存储器

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

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

6.7 综合:利用程序中的局部性

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

第七章 链接

7.1 编译器驱动程序

7.2 静态链接

7.3 目标文件

7.4 可重定位目标文件

7.5 符号和符号表

7.6 符号解析

7.7 重定位

7.8 可执行目标文件

7.9 加载可执行目标文件

7.10 动态链接共享库

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

7.12 * 与位置无关的代码(PIC)

7.13 处理目标文件的工具

第八章 异常控制流

8.1 异常

8.2 进程

8.3 系统调用和错误处理

8.4 进程控制

8.5 信号

8.6 非本地跳转

8.7 操作进程的工具

第九章 测量程序执行时间

9.1 计算机系统上的时间流

9.2 通过间隔计数来测量时间

9.3 周期计数器

9.4 用周期计数器来测量程序执行时间

9.5 基于gettimeofday函数的测量

9.6 综合:一个实验协议

9.7 展望未来

9.8 现实生活:K次最优测量方法

9.9 得到的经验教训

第十章 虚拟存储器

10.1 物理和虚拟寻址

10.2 地址空间

10.3 虚拟存储器作为缓存的工具

10.4 虚拟存储器作为存储器管理的工具

10.5 虚拟存储器作为存储器保护的工具

10.6 地址翻译

10.7 研究案例:Pentium/Linux存储器系统

10.8 存储器映射

10.9 动态存储器分配

10.10 垃圾收集

10.11 C程序中常见的与存储器有关的错误

10.12 扼要重述一些有关虚拟存储器的关键概念

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

第十一章 系统级 I/O

  • Unix I/O
  • 打开和关闭文件
  • 读和写文件
  • 用Rio包进行健壮的读和写
  • 读取文件元数据
  • 共享文件
  • I/O重定向
  • 标准I/O
  • 综合:我该使用哪些I/O函数

所有语言的运行时系统都提供执行 I/O 较高级别的工具。例如 ANSI C 提供标准 I/O 库,包含像printf 和 scanf 这样执行带缓冲的 I/O 函数, C++ 语言用它的重载操作符 << 输入 和 >> 输出 提供了类似的功能,Java 中有 Stream I/O 框架函数。 在Unix系统中,是通过使用由内核 提供的系统级 Unix I/O 函数来实现这些较高级别的函数。大多数时候,这些高级别 I/O 函数工作良好,不需要直接使用 Unix I/O,但了解底层 实现,是非常有必要的。

11.1 Unix I/O

11.2 打开和关闭文件

11.3 读和写文件

11.4 用Rio包进行健壮的读和写

11.5 读取文件元数据

11.6 共享文件

11.7 I/O重定向

11.8 标准I/O

11.9 综合:我该使用哪些I/O函数

第十二章 网络编程

  • 客户端和服务端编程模型
  • 网络
  • 全球IP因特网
  • 套接字接口
  • Web服务器
  • 综合:Tiny web服务器

网络应用随处可见,浏览Web,发送email的时候就在使用一个网络应用程序。所有的网络应用都基于相同的基本编程模型,有着相似的整体逻辑结构, 并且依赖相同的编程接口。

12.1 客户端和服务端编程模型

每个网络应用都是基于客户端-服务器模型的。客户端-服务器模型中的基本操作是 事务(transaction),由四步组成: 1) 当一个客户端需要服务时,向服务器发送一个请求,发起一个事务。 2) 服务器收到请求后,解释它,并以适当的方式操作它的资源。例如,当Web服务器收到一个请求后,就读取一个磁盘文件。 3) 服务器给客户端发送一个响应,并等待下一个请求。例如,Web服务器将文件发送回客户端。 4) 客户端收到响应,并处理它。例如,Web浏览器收到来自服务器的资源,在屏幕上进行显示。

12.2 网络

12.3 全球IP因特网

12.4 套接字接口

12.5 Web服务器

12.6 综合:Tiny web服务器

第十三章 并发编程

13.1 基于进程的并发编程

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

13.3 基于线程的并发编程

13.4 多线程程序中的共享变量

13.5 用信号量同步线程

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

13.7 其他并发性问题

参考资料

文档信息

Search

    Table of Contents