《深入理解计算机系统》读书笔记01: 从入门到实践

📅 2026/7/6 15:12:02
《深入理解计算机系统》读书笔记01: 从入门到实践
《深入理解计算机系统》学习指南从入门到实践作者: andylin02学习章节: 全书概览关键词 CSAPP; 计算机系统漫游; 编译系统; 存储层次结构; 进程; 虚拟内存; 抽象《深入理解计算机系统》Computer Systems: A Programmer’s Perspective简称 CSAPP被誉为计算机领域的圣经是每个程序员深入理解底层系统的必读之作。它不仅涵盖了计算机系统的核心概念还通过大量实验帮助读者在实践中巩固知识。一、全书章节概览本书共 12 章大致可分为三大部分部分章节核心内容第一部分第1-6章程序结构和执行数据表示、汇编、处理器架构、性能优化、存储器层次结构第二部分第7-9章在系统上运行程序链接、异常控制流、虚拟内存第三部分第10-12章程序间的交互和通信系统级 I/O、网络编程、并发编程第一章计算机系统漫游— 通过跟踪hello.c程序的生命周期宏观了解计算机系统全貌。第二章信息的表示和处理— 深入讲解整数、浮点数的二进制表示与运算是理解计算机底层运算的基础。第三章程序的机器级表示— 学习汇编语言与机器代码理解 C 语言程序在底层的执行方式。第四章处理器体系结构— 设计一个简单的处理器理解指令执行的流水线机制。第五章优化程序性能— 学习代码优化技巧理解编译器优化能力与局限。第六章存储器层次结构— 深入理解缓存Cache的工作机制与程序局部性原理。第七章链接— 学习静态链接、动态链接、符号解析、重定位等核心概念。第八章异常控制流— 理解进程、异常、信号、非本地跳转等机制。第九章虚拟内存— 深入剖析虚拟地址到物理地址的映射机制理解分页、缺页处理等。第十章系统级 I/O— 学习 Unix I/O 模型与文件操作。第十一章网络编程— 了解网络编程基础、客户端-服务器模型。第十二章并发编程— 学习线程、同步、并发 bug 等并发编程核心概念。二、关键代码示例1. 程序编译的四个阶段示例以下是完整的hello.c程序以及各个阶段的输出示例// hello.c#includestdio.hintmain(){printf(hello, world\n);return0;}预处理阶段.i 文件// hello.i (部分示意)#1hello.c#1built-in#1hello.cexternintprintf(constchar*__restrict __format,...);intmain(){printf(hello, world\n);return0;}汇编阶段.s 文件; hello.s main: subq $8, %rsp movl $.LCO, %edi call puts movl $0, %eax addq $8, %rsp ret .LCO: .string hello, world编译命令# 完整编译gcc-ohello hello.c# 分步执行四个阶段gcc-Ehello.c-ohello.i# 预处理gcc-Shello.i-ohello.s# 编译gcc-chello.s-ohello.o# 汇编gcc hello.o-ohello# 链接编译系统由预处理器cpp、编译器ccl、汇编器as、链接器ld四个程序构成。2. 大端/小端存储示例// 字节序检测程序#includestdio.htypedefunsignedchar*byte_pointer;voidshow_bytes(byte_pointer start,size_tlen){size_ti;for(i0;ilen;i)printf(%.2x ,start[i]);printf(\n);}voidshow_int(intx){show_bytes((byte_pointer)x,sizeof(int));}intmain(){intval0x01234567;printf(int 0x01234567 在内存中的字节序: );show_int(val);return0;}小端存储如 Intel x86最低有效字节在前输出为67 45 23 01大端存储如某些 IBM 系统最高有效字节在前输出为01 23 45 67三、架构图与流程图1. 编译系统流程图┌─────────────────────────────────────────────────────────────────────┐ │ 编译系统流程图 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ hello.c ──→ 预处理器 ──→ hello.i ──→ 编译器 ──→ hello.s │ │ (文本) (cpp) (文本) (ccl) (汇编) │ │ │ │ │ ↓ │ │ hello ──←─────── 链接器 ──←─────── hello.o ──←─── 汇编器 │ │ (可执行) (ld) (目标文件) (as) │ │ │ │ 阶段说明 │ │ ▸ 预处理处理 #include、#define 等预处理指令 │ │ ▸ 编译C 语言 → 汇编语言 │ │ ▸ 汇编汇编语言 → 机器指令二进制 │ │ ▸ 链接合并目标文件及库 → 可执行文件 │ │ │ └─────────────────────────────────────────────────────────────────────┘2. 典型系统硬件组成┌─────────────────────────────────────────────────────────────────────┐ │ 典型系统硬件组成架构图 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ CPU ┌──────────────────────────────────────────────────┐ │ │ │ │ 寄存器文件 │ │ │ │ └──────────────────────────────────────────────────┘ │ │ │ ▲ │ │ │ │ │ ↓ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ │ 算术/逻辑单元 (ALU) │ │ │ │ └──────────────────────────────────────────────────┘ │ │ │ ▲ │ │ │ │ │ ↓ │ │ └─────────┼──────────────────────┼───────────────────────────────┘ │ │ │ │ ↓ ↓ │ ┌─────────────────┐ ┌─────────────────┐ │ │ 高速缓存 │◄────►│ 主存 │ │ │ (Cache) │ │ (DRAM) │ │ └─────────────────┘ └─────────────────┘ │ ▲ ▲ │ │ │ │ └──────────┬───────────┘ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ 系统总线 │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ↓ ↓ ↓ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ I/O桥 │ │ 磁盘 │ │ 显示器 │ │ │ 控制器 │ │ 控制器 │ │ 适配器 │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ │ │ ↓ ↓ ↓ │ [键盘/鼠标] [磁盘] [显示器] │ └─────────────────────────────────────────────────────────────────────┘系统硬件包括总线、I/O 设备、主存DRAM和处理器。总线是贯穿整个系统的电子管道通常设计为传送定长的字节块字。3. 存储器层次结构┌─────────────────────────────────────────────────────────────────────┐ │ 存储器层次结构图 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ L0: 寄存器 │ │ ↑ (1个周期) │ │ L1: L1 高速缓存 (SRAM) │ │ ↑ (2-4个周期) │ │ L2: L2 高速缓存 (SRAM) │ │ ↑ (10-20个周期) │ │ L3: L3 高速缓存 (SRAM) │ │ ↑ (50-100个周期) │ │ L4: 主存 (DRAM) │ │ ↑ (数百个周期) │ │ L5: 本地磁盘 │ │ ↑ (数千万个周期) │ │ L6: 远程存储网络 │ │ │ │ 核心思想每一层作为下一层的高速缓存速度递减、容量递增 │ │ │ └─────────────────────────────────────────────────────────────────────┘存储器层次结构的设计核心是局部性原理时间局部性和空间局部性将更小更快的设备作为下一层的缓存。4. 计算机系统抽象层次┌─────────────────────────────────────────────────────────────────────┐ │ 计算机系统抽象层次 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 应用程序 │ │ ↑ │ │ │ 软件 │ │ ↓ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 操作系统 │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ │ │ 进程 │ │ 虚拟内存 │ │ 文件 │ │ │ │ │ │ (处理器抽象) │ │ (内存抽象) │ │ (I/O设备抽象) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ↑ │ │ │ 硬件 │ │ ↓ │ │ 计算机硬件处理器、内存、I/O设备 │ │ │ │ 抽象对应关系 │ │ ▸ 文件 → I/O 设备的抽象表示 │ │ ▸ 虚拟内存 → 主存和磁盘 I/O 设备的抽象表示 │ │ ▸ 进程 → 处理器、主存和 I/O 设备的抽象表示 │ │ ▸ 指令集架构 → 实际处理器的抽象 │ │ │ └─────────────────────────────────────────────────────────────────────┘操作系统通过进程、虚拟内存和文件等抽象概念实现两大功能防止硬件被失控应用程序滥用并为应用提供统一的硬件控制接口。四、第一章预告计算机系统漫游1.1 信息就是位 上下文核心思想计算机系统中的所有信息——包括磁盘文件、内存中的程序、用户数据和网络数据——都是由一串比特bit表示的。区分不同数据对象的唯一方法是读取时的上下文。例如相同的二进制序列1101001作为字符读取ASCII 码 105 → 字符i作为整数读取十进制的 105┌─────────────────────────────────────────────────────────────────────┐ │ 信息 位 上下文 示意图 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 二进制比特序列: 1101001 │ │ │ │ │ ┌─────────────┼─────────────┐ │ │ ↓ ↓ ↓ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │ ASCII 解码 │ │ 整数解码 │ │ 指令解码 │ │ │ │ 上下文 │ │ 上下文 │ │ 上下文 │ │ │ └────────────┘ └────────────┘ └────────────┘ │ │ ↓ ↓ ↓ │ │ 字符 i 整数 105 机器指令 │ │ │ │ → 同样的比特流在不同的上下文中呈现出完全不同的含义 │ │ │ └─────────────────────────────────────────────────────────────────────┘1.2 程序被其他程序翻译成不同格式hello.c从源文件到可执行文件的转换过程# 编译命令unixgcc-ohello hello.c┌─────────────────────────────────────────────────────────────────────┐ │ hello.c (文本) │ │ │ │ │ ↓ 预处理器 (cpp) - 处理 #include 等预处理指令 │ │ hello.i (文本) │ │ │ │ │ ↓ 编译器 (ccl) - 翻译成汇编语言 │ │ hello.s (汇编文本) │ │ │ │ │ ↓ 汇编器 (as) - 翻译成机器指令 │ │ hello.o (二进制目标文件) │ │ │ │ │ ↓ 链接器 (ld) - 合并 printf.o 等库文件 │ │ hello (可执行二进制文件) │ └─────────────────────────────────────────────────────────────────────┘1.3 处理器读并解释存储在主存中的指令典型硬件组成组件功能描述总线贯穿系统的电子管道在各部件间传递信息字节I/O 设备系统与外界的通道键盘、鼠标、显示器、磁盘主存临时存储设备存放程序和程序处理的数据逻辑上是线性的字节数组处理器CPU解释/执行主存指令的引擎核心是程序计数器PC高速缓存更小更快的存储设备作为处理器与主存之间的缓存层程序执行流程┌─────────────────────────────────────────────────────────────────────┐ │ hello 程序执行流程 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 1. shell 读取命令行 hello │ │ ↓ │ │ 2. shell 调用加载器将 hello 文件中的代码和数据复制到主存 │ │ ↓ │ │ 3. 处理器开始执行 main 程序中的机器语言指令 │ │ ↓ │ │ 4. 指令将 hello, world\n 字符串从主存复制到寄存器 │ │ ↓ │ │ 5. 寄存器将字符串复制到显示设备经过存储器映射 I/O │ │ ↓ │ │ 6. 屏幕上显示 hello, world │ │ │ │ 关键技术DMA直接存储器存取数据可直接从磁盘到达主存 │ │ 无需经过处理器 │ │ │ └─────────────────────────────────────────────────────────────────────┘1.4 操作系统管理硬件操作系统实现两个基本功能防止硬件被失控的应用程序滥用向应用程序提供简单一致的硬件控制机制操作系统通过三个基本抽象实现这些功能抽象概念抽象的对象说明文件I/O 设备将磁盘、键盘等设备统一抽象为文件虚拟内存主存 磁盘 I/O为每个进程提供独占主存的假象进程处理器 主存 I/O 设备操作系统对正在运行的程序的一种抽象1.5 Amdahl 定律与并发并行Amdahl 定律当我们对系统的某个部分进行加速时其对系统整体性能的影响取决于该部分的重要性与加速程度。这提醒我们优化应聚焦于关键瓶颈。并发与并行的区别并发逻辑上的同时强调一段时间内处理多个任务并行物理上的同时强调多核处理器真正同时执行1.6 本章学习收获第一章的核心价值在于建立计算机系统的宏观认知包括✅ 程序的整个生命周期编写 → 编译 → 链接 → 加载 → 执行✅ 编译系统的四个阶段及各阶段作用✅ 系统硬件的核心组成总线、I/O 设备、主存、处理器、高速缓存✅ 存储层次结构与局部性原理✅ 操作系统提供的抽象层进程、虚拟内存、文件✅ Amdahl 定律与并发并行基本概念这些概念将在后续章节中深入展开。本书从上层程序出发由上至下剖析和串联了每一个环节帮助读者构建完整的计算机系统知识体系。五、学习建议1. 学习资源汇总资源类型推荐内容官方教材《深入理解计算机系统》第 3 版在线课程CMU 15-213本书作者授课的原版课程配套实验Data Lab、Bomb Lab、Attack Lab、Cache Lab、Shell Lab、Malloc Lab、Proxy Lab 等 7 个经典实验开源代码GitHub 上的csapp实验代码库包含简易 shell 程序、动态内存分配器等2. 学习路线第一阶段打好基础 ├── 第1章计算机系统漫游建立宏观概念 ├── 第2章信息的表示和处理二进制基础 └── 第3章程序的机器级表示汇编基础 第二阶段深入底层 ├── 第4章处理器体系结构 ├── 第5章优化程序性能 └── 第6章存储器层次结构 Cache Lab 第三阶段系统核心 ├── 第7章链接 ├── 第8章异常控制流 Shell Lab ├── 第9章虚拟内存 Malloc Lab 第四阶段应用拓展 ├── 第10章系统级 I/O ├── 第11章网络编程 Proxy Lab └── 第12章并发编程3. 实验推荐顺序Data Lab— 熟悉整数和浮点数的位级表示入门级Bomb Lab— 学习汇编语言和 GDB 调试Attack Lab— 理解代码注入和缓冲区溢出攻击Cache Lab— 深入理解缓存机制Shell Lab— 实现简易 shell 程序学习进程管理和信号处理Malloc Lab— 实现动态内存分配器Proxy Lab— 实现 HTTP 代理服务器阅读建议本书每章前言都会从程序员角度分析为什么要学这些知识然后正文清晰地阐述答案建议认真阅读每章前言。六、总结《深入理解计算机系统》是一本将理论与实践完美结合的计算机系统经典著作。通过阅读本书和完成配套实验你将能够 构建完整的计算机系统知识体系 编写更高效、更安全、更可移植的程序 快速定位和解决程序中的性能问题 理解编译、链接、加载等底层机制 掌握网络编程和并发编程的核心技术后续章节将逐步深入敬请期待本文为个人学习笔记仅用于知识分享。如有错误欢迎指正。 点赞 收藏 分享让更多开发者看到这篇深度解析❤️ 如果觉得有用请给个赞支持一下作者