计算机系统学习指南:书籍、课程与实践资源¶
用软件设计师考试的知识范围检查遗漏,把学习重点放在理解计算机如何工作:数据怎样表示,程序怎样执行,操作系统怎样管理资源,文件怎样保存到磁盘。已有编程经验的部分可以快速复习,把时间留给不熟悉的原理和实验。
当前建议从 《计算机科学速成课》+《编码》 开始,再用 CSAPP 串联程序与机器,随后以 OSTEP+操作系统课程 深入学习。算法可以并行推进,网络、数据库和语言实现按需要逐步展开。
1. 学习顺序¶
| 阶段 | 主要资源 | 要弄清的问题 | 建议产出 |
|---|---|---|---|
| 建立整体认识 | 《计算机科学速成课》笔记目录+《编码》 | 二进制和逻辑门怎样组成运算器、存储器和 CPU? | 画出从逻辑门到程序执行的关系图 |
| 动手理解硬件 | 可选 Nand2Tetris Part I | 怎样用简单部件构建一台能执行指令的计算机? | 完成逻辑门、ALU、内存和 CPU 等模拟实验 |
| 补齐必要语言基础 | 按需选学 CS50 的 C、内存部分 | 指针、数组、结构体和动态内存有什么关系? | 用 C 编写并调试小程序 |
| 理解程序如何运行 | CSAPP+CMU 15-213 | 代码怎样变成指令?缓存、链接、进程、虚拟内存如何影响程序? | 结合程序观察汇编、地址和内存访问 |
| 系统学习操作系统 | OSTEP+哈工大李治军课程 | CPU、内存和磁盘如何在多个程序之间分配? | 做调度、地址转换、并发和文件系统练习 |
| 深入实现 | 南京大学操作系统课或 MIT xv6 实验 | 系统调用、页表、文件系统如何落到代码? | 按课程要求完成若干实验 |
| 扩展 CS 知识 | MIT 6.006、Stanford CS144、CMU 15-445 | 算法、网络和数据库怎样解决各自的问题? | 每个方向选择一门主课和一个项目 |
每个阶段选一本主书、一门配套课程即可;同主题的其他资源用于查漏补缺。Missing Semester 的命令行、Git 和调试工具可以穿插学习。
2. 核心书籍怎么选¶
《编码》:先建立硬件直觉¶
Charles Petzold 的《编码:隐匿在计算机软硬件背后的语言》从信息传递、二进制和逻辑电路逐步讲到计算机,适合与《计算机科学速成课》的前半部分搭配。
- 《编码》第二版(豆瓣):从现在开始阅读可优先选这一版。
- 《编码》2010 年版(豆瓣):已有这一版也可以用来建立基础。
- 重点是理解“为什么这样设计”。后半部分涉及电路时,边读边画信号流向会比只看文字有效。
- 想把电路原理做出来,可搭配 Nand2Tetris;配套书是《计算机系统要素:从零开始构建现代计算机》。实验使用模拟器,不需要购买硬件。
CSAPP:从程序员视角理解计算机系统¶
Randal E. Bryant、David R. O’Hallaron 的《深入理解计算机系统》通常简称 CSAPP。它把数据表示、汇编、缓存、链接、进程、虚拟内存、系统 I/O 和并发连接起来,适合作为计算机系统学习的主线。
- 第三版(豆瓣):建议优先阅读,机器级程序部分以 x86-64 为基础。
- 第二版(豆瓣):基础原理仍有价值,机器级程序的体系结构背景与第三版不同。
- 前置要求:能读写 C,尤其是指针、数组、结构体和内存操作。遇到这些内容明显吃力时,先补语言基础。
- 第三版可以先抓住第 1、2、3、6 章,再读第 8、9、10 章;这是建立主线的选读顺序,之后再补齐其他章节。
- 教材与配套资源 · 实验入口。实验可随章节逐步做,不必第一次阅读就全部完成。
CSAPP 能解释程序怎样使用系统。磁盘空闲块管理、文件系统布局等细节,需要继续结合操作系统教材学习。
OSTEP:操作系统主教材¶
Remzi H. Arpaci-Dusseau、Andrea C. Arpaci-Dusseau 的 Operating Systems: Three Easy Pieces,中文版名为《操作系统导论》,围绕三个主题展开:
- 虚拟化:进程、CPU 调度、地址空间、虚拟内存。
- 并发:线程、锁、条件变量、信号量。
- 持久化:I/O、磁盘、文件系统及其可靠性。
入口:中文版(豆瓣) · 作者提供的免费英文在线版 · 配套练习。
现在关心的位示图、文件分配和磁盘块,适合在持久化部分重点学习。阅读时配合模拟器观察状态变化,可以把抽象概念变成具体操作。
其他经典操作系统教材¶
| 书籍 | 适合的用途 | 链接 |
|---|---|---|
| Andrew S. Tanenbaum、Herbert Bos《现代操作系统》原书第 4 版 | 系统查阅进程、内存、文件系统、I/O、死锁等主题,扩展整体视野 | 豆瓣 |
| Silberschatz、Galvin、Gagne《操作系统概念》原书第 9 版 | 传统大学教材,适合按知识体系学习和查阅定义 | 豆瓣 |
先选 OSTEP 作为主教材,另外两本按需参考即可。这里的《现代操作系统》是 Tanenbaum 等人的书,与《现代操作系统:原理与实现》是不同著作。
3. 大学课程与视频¶
当前主线:基础、系统与操作系统¶
| 课程 | 内容与学习条件 | 视频及课程入口 |
|---|---|---|
| 《计算机科学速成课》 | 建立计算机科学全貌,适合先看、反复回顾;深入原理还需要教材和实验 | 已有笔记 · B 站合集 |
| Harvard CS50x 2025 | 包括 C、内存、算法、数据结构、Python、SQL;有编程经验可按薄弱点选学 | YouTube 官方播放列表 |
| Nand2Tetris Part I | 从逻辑门、ALU 到内存、CPU 和汇编器;适合搭配《编码》 | 官方网站与项目 · YouTube 社区整理合集 |
| CMU 15-213,2015 | CSAPP 配套系统课程;需要 C 和指针基础 | B 站合集 · YouTube 社区整理合集 |
| 哈工大李治军《操作系统》 | 适合作为第一门中文操作系统主课;实现部分涉及 C、汇编及较早的系统背景 | B 站合集 |
| 南京大学蒋炎岩《操作系统原理》2026 | 从程序、系统调用、并发到存储和文件系统;适合已有 C、Linux 基础后深入 | B 站首讲 · 老师账号的课程合集 |
| MIT 6.S081,2020 | 围绕 xv6 理解并实现操作系统;需要 C、指针、Linux 工具和一些 RISC-V 汇编知识 | B 站中英字幕合集 · YouTube 首讲 · 2020 年课表与实验 |
Nand2Tetris 的 Part I 侧重硬件与汇编器;虚拟机、编译器等内容在 Part II。MIT 的这门操作系统课后来使用过 6.1810 编号,学习时尽量保持视频、实验说明和代码的年份一致。
后续方向与工具¶
| 方向 | 推荐课程 | 学习条件与目标 | 链接 |
|---|---|---|---|
| 数据结构与算法 | MIT 6.006,Fall 2011 | 需要基本编程和数学基础;学习排序、哈希、树、图、动态规划及复杂度分析,可配合《算法导论》 | YouTube 官方合集 · 课程与作业 |
| 计算机网络 | Stanford CS144 | 学习网络协议与传输机制;实验需要 C++ 基础 | YouTube 社区整理合集 · 官方课程与实验 |
| 数据库系统 | CMU 15-445/645,Fall 2022 | 需要 C++、数据结构和系统基础;学习缓冲池、索引、查询执行、事务,可配合《数据库系统概念》 | YouTube 官方合集 · 同年课程 · BusTub 项目 |
| 开发工具 | MIT Missing Semester,2026 | 补齐命令行、开发工具与 Git,可以和其他课程同步学习 | YouTube 官方合集 · 课程网站 · 中文资料 |
CS144 的视频合集属于较早的社区整理,可能与当前实验版本不同;BusTub 的主分支也会随课程演进。做实验时以所选学期的课程说明为准,中文翻译资料也应留意对应年份。
4. GitHub 学习路线、书籍与项目¶
用来查找和组织资源¶
| 资源 | 适合怎么用 |
|---|---|
| CS 自学指南 · GitHub | 中文课程导航,了解各方向的前置知识、课程特色和实验要求 |
| OSSU Computer Science | 参考较完整的本科 CS 自学体系,检查编程、数学、系统和理论知识是否缺项;部分外部平台的评分或证书可能收费 |
| free-programming-books | 按语言和主题查找免费书籍、课程;优先阅读作者或课程方提供的版本 |
| project-based-learning | 找小型项目练习,例如解释器、数据库和系统工具;按当前能力挑一个完成 |
这些目录适合在进入新主题时查一次,再回到已经选定的教材与课程。
可以直接阅读或动手的资源¶
| 资源 | 用途与入口 |
|---|---|
| OSTEP 配套练习 | 操作系统概念模拟和练习,适合与章节同步:GitHub |
| Computer Networks: A Systems Approach | Larry Peterson、Bruce Davie 的开放网络教材:在线阅读 · GitHub |
| Crafting Interpreters | Robert Nystrom 的解释器实践书,分别使用 Java 和 C 实现解释器,适合后续学习语言实现:在线阅读 · GitHub |
| BusTub | CMU 数据库课程的教学数据库项目,配合相应学期的实验要求使用:GitHub |
5. 从位示图开始做一次文件系统练习¶
位示图属于操作系统的文件系统与存储管理知识。可以把近期关于“文件能否分散存储”“字号和位号有什么用”的问题,转化为一次可观察的实验。
先复习 文件系统和位示图专题笔记,再阅读 OSTEP 的文件系统实现章节,并打开 file-implementation 练习。其中的 vsfs.py 模拟了一个简化文件系统,展示四类状态:
| 状态 | 表达什么 |
|---|---|
| inode bitmap | 哪些 inode 已分配 |
| inodes | 文件类型、数据位置、链接等元数据 |
| data bitmap | 哪些数据块已分配 |
| data | 数据块中的目录项或文件内容 |
这个模拟器中,1 表示已分配,0 表示空闲;判断具体题目时仍要先看题目对 0、1 的约定。
按以下顺序观察,并把操作前后的状态并排记录:
- 创建空文件:inode bitmap 怎样变化?空文件是否已经需要数据块?同时留意父目录新增的目录项。
- 向文件写入数据:data bitmap 的哪个位置发生变化?inode 如何记录数据位置?
- 创建硬链接:为什么新增名字后,文件的数据块不必复制?
- 删除目录项:还存在其他硬链接时,为什么数据块不会立即释放?最后一个链接删除后再观察回收。
该模拟器把普通文件简化为空文件或只有一个数据块,适合观察分配、链接和回收。理解一个文件占据多个不连续块时,需要继续学习索引分配、间接块或 extent 等机制。真实系统还要考虑文件仍被进程打开等情况,最后一个名字删除后也可能暂不释放内容。
字号、位号则是定位位示图中某一位的方法。若**块号、字号、位号均从 0 开始,块号直接对应位示图下标**,每字有 w 位,则块号 b 对应:
例如每字 32 位,块号 100 对应字号 3、位号 4,也就是自然语言中的第 4 个字、第 5 位。若题目从 1 编号,或位示图只覆盖某一段数据区,应先换算成从 0 开始的位示图下标,再计算。
配套视频可以看哈工大课程中的“生磁盘的使用”“从生磁盘到文件”“文件使用磁盘的实现”“目录与文件系统”。
6. 怎样积累自己的笔记¶
每学完一个主题,留下四项内容即可:它解决什么问题、核心机制是什么、一个具体例子、一个验证结果。
例如学习虚拟内存,可以记录“为什么每个进程都像拥有独立内存”,画出虚拟地址到物理地址的转换过程,手算一次页号与页内偏移,再用程序或模拟器验证。学习文件系统,则画出“文件名 → inode → 数据块”的关系,同时标出位示图负责的空闲空间管理。
软件设计师相关知识点与例题统一归入软件设计,按十二章继续补充。这篇指南保留学习路线与资源入口,具体原理和实验结果写进相应主题笔记。