Chapter 1:计算机系统漫游
预习完成:2026-06-01 | 复习完成:2026-06-03 | 共 31 个知识点
CSAPP
- Chapter 1:计算机系统漫游
- 1. 信息 = 位 + 上下文(1.1)
- 2. 程序的翻译过程(1.2)
- 3. 了解编译系统的好处(1.3)
- 4. 系统的硬件组成(1.4.1)
- 5. 运行 hello 程序的过程(1.4.2)
- 6. 高速缓存至关重要(1.5)
- 7. 存储设备形成层次结构(1.6)
- 8. 操作系统管理硬件(1.7)
- 进程(1.7.1)
- 线程(1.7.2)
- 虚拟内存(1.7.3)
- 文件(1.7.4)
- 9. 系统之间利用网络通信(1.8)
- 10. 重要主题(1.9)
- Amdahl 定律(1.9.1)
- 并发和并行(1.9.2)
- 抽象的重要性(1.9.3)
- 关键公式 / 技巧
- 易错点
- 与其他章节的联系
- 习题记录
1. 信息 = 位 + 上下文(1.1)
- 计算机中所有信息都由位(0/1)组成,同一串位在不同上下文中有不同的解释(整数、浮点数、指令、字符等)。
2. 程序的翻译过程(1.2)
- 源程序
.c→ 预处理.i→ 编译.s(汇编) → 汇编.o(可重定位目标文件) → 链接 → 可执行文件。 - 四个阶段:预处理器 → 编译器 → 汇编器 → 链接器。
3. 了解编译系统的好处(1.3)
- 优化程序性能、理解链接时错误、避免安全漏洞(如缓冲区溢出)。
4. 系统的硬件组成(1.4.1)
- 总线:在部件间传输固定大小的字节块(字)。
- I/O 设备:通过控制器或适配器连接系统。
- 主存(DRAM):临时存放程序和数据的线性字节数组。
- 处理器(CPU):核心是 PC(程序计数器,x86-64 中为
%rip),始终指向下一条指令地址。 - CPU 的核心操作:加载、存储、操作、跳转。
- 指令集架构(ISA):处理器支持的指令及其编码规范,是对处理器硬件的抽象。
5. 运行 hello 程序的过程(1.4.2)
- 键盘输入 → shell 读入 → 加载可执行文件(DMA) → CPU 执行指令 → 输出到显示器。
6. 高速缓存至关重要(1.5)
- 核心问题:系统花费大量时间把数据从一个地方搬到另一个地方。
- 物理规律:较大的存储设备比较小的慢,快速设备比同类的贵得多。
- CPU-主存差距:处理器与主存之间的速度差距在持续增大。
- 解决方案:在 CPU 和主存之间加入更小更快的高速缓存(cache),存放处理器近期可能需要的指令和数据。
- 依赖的关键前提:局部性原理——程序倾向访问局部区域的数据和代码(时间局部性 + 空间局部性)。
- L1(数万字节,≈寄存器速度)→L2(数十万~数百万字节,比 L1 慢 5×)→L3(更大)。
- L1/L2/L3 用SRAM实现。程序员利用缓存知识可将程序性能提升一个数量级。
7. 存储设备形成层次结构(1.6)
- 所有存储设备组织成金字塔:寄存器(L0) → L1 → L2 → L3 → 主存(L4) → 本地磁盘(L5) → 远程存储(L6)。
- 从上至下:速度越来越慢、容量越来越大、每字节造价越来越便宜。
- 核心思想:每一层存储器作为下一层的高速缓存。
- 寄存器是 L1 的缓存,L1 是 L2 的缓存,…,主存是磁盘的缓存。
8. 操作系统管理硬件(1.7)
- 操作系统:应用程序和硬件之间的一层软件,两个基本功能:①防止硬件被滥用 ②提供简单统一的硬件接口。
- 三大抽象:进程、虚拟内存、文件。
进程(1.7.1)
- 进程:对一个正在运行的程序的抽象。每个进程都觉得自己独占 CPU、主存、I/O 设备。
- 并发运行:多个进程的指令交错执行。
- 上下文切换:保存当前进程上下文 → 恢复新进程上下文 → 转移控制权。由内核管理。
- 内核:操作系统代码常驻主存的部分,不是独立的进程,而是管理所有进程的代码和数据结构的集合。
线程(1.7.2)
- 线程:进程内的执行单元,同一进程的多个线程共享代码和全局数据。
- 多线程之间比多进程更容易共享数据,也比进程更高效。
虚拟内存(1.7.3)
- 虚拟内存:为每个进程提供独享主存的假象。每个进程看到一致的虚拟地址空间。
- 虚拟地址空间布局(从低到高):代码/数据 → 堆 → 共享库 → 栈 → 内核虚拟内存。
- 核心机制:进程的虚拟内存内容存在磁盘上,主存充当磁盘的高速缓存。
- 栈向下增长(函数调用),堆向上增长(malloc/free)。
文件(1.7.4)
- 文件就是字节序列。所有 I/O 设备都可以看成文件(万物皆文件)。
- 通过一小组Unix I/O系统调用提供统一接口。
9. 系统之间利用网络通信(1.8)
- 网络对系统而言只是一个I/O 设备。
- 数据流:本地内存 → 网络适配器 → 远程机器。
- 网络应用遵循客户端-服务器模型。
10. 重要主题(1.9)
Amdahl 定律(1.9.1)
- 公式:S = 1 ( 1 − a ) + a / k S = \frac{1}{(1-a) + a/k}S=(1−a)+a/k1(a=优化部分占比,k=该部分加速比,S=整体加速比)
- 核心结论:要想显著加速整个系统,必须提升全系统中相当大的部分的速度。
- 上界:即使优化部分无限加速(k→∞),整体加速比 ≤ 1/(1-a)。
并发和并行(1.9.2)
- 并发:一个同时具有多个活动的系统。
- 并行:用并发来使系统运行得更快。
- 三个层次:
- 线程级并行:多核处理器、超线程(SMT)。
- 指令级并行:流水线、超标量。
- 数据级并行(SIMD):一条指令同时操作多个数据。
抽象的重要性(1.9.3)
- 抽象是计算机科学中最重要的概念之一。
- 三大抽象:文件(对 I/O)、虚拟内存(对存储器)、进程(对运行中的程序)。
- 虚拟机:对整个计算机的抽象。
- 核心价值:只要执行模型一样,不同的处理器实现也能执行同样的机器代码。
关键公式 / 技巧
| 公式 | 名称 | 说明 |
|---|
| S = 1 ( 1 − a ) + a / k S = \frac{1}{(1-a) + a/k}S=(1−a)+a/k1 | Amdahl 定律 | a=可优化部分占比,k=该部分加速比,S=整体加速比 |
| S ∞ ≤ 1 1 − a S_{\infty} \leq \frac{1}{1-a}S∞≤1−a1 | Amdahl 上界 | 即使优化部分免费,整体加速比也受限 |
易错点
- 内核不是进程——内核是管理进程的代码集合,本身不以进程形式运行。(1.7.1)
- 虚拟内存 ≠ 物理内存——进程看见的地址空间是假象,实际数据可能部分在磁盘 swap 中。(1.7.3)
- 并发 ≠ 并行——单核通过切换也能并发,但不等于并行;并行要求真正的同时执行。(1.9.2)
- Amdahl 定律的"上界陷阱"——把 60% 的部分优化到免费,最多快 2.5 倍,瓶颈永远在不可优化的部分。(1.9.1)
- 存储速度差距在拉大——CPU 在加速,但内存没有同步加速,差距持续扩大。(1.5)
与其他章节的联系
| 本章概念 | 展开章节 |
|---|
| 编译系统(预处理/编译/汇编/链接) | 第 7 章 链接 |
| 缓冲区溢出 | 第 3 章 程序机器级表示 |
| 高速缓存和存储器层次结构 | 第 6 章存储器层次结构 |
| 进程、上下文切换、内核 | 第 8 章 异常控制流 |
| 虚拟内存、堆、栈 | 第 9 章 虚拟内存 |
| Unix I/O、文件 | 第 10 章 系统级 I/O |
| 网络、客户端-服务器 | 第 11 章 网络编程 |
| 线程、并发 | 第 12 章 并发编程 |
| 流水线、超标量、指令集架构 | 第 4 章 处理器体系结构 |
| SIMD、程序优化、Amdahl 定律 | 第 5 章 优化程序性能 |
习题记录
- Practice Problem 1.1(Amdahl 定律 — 卡车运土豆)
- A. a=0.6, k=1.5 → S=1/(0.4+0.6/1.5)=1.25X;直觉验证:25/(10+10)=1.25X
- B. S=1.67, a=0.6 → k=3 → 300 km/h(对卡车不现实!)
- Practice Problem 1.2(Amdahl 定律 — 软件性能 2X)
- S=2, a=0.8 → k=0.8/0.3≈2.67。核心教训:80% 部分需加速 2.67X 才能整体 2X,瓶颈永远在不可优化部分