跳转至

计算机系统学习指南:书籍、课程与实践资源

用软件设计师考试的知识范围检查遗漏,把学习重点放在理解计算机如何工作:数据怎样表示,程序怎样执行,操作系统怎样管理资源,文件怎样保存到磁盘。已有编程经验的部分可以快速复习,把时间留给不熟悉的原理和实验。

当前建议从 《计算机科学速成课》+《编码》 开始,再用 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 的约定。

按以下顺序观察,并把操作前后的状态并排记录:

  1. 创建空文件:inode bitmap 怎样变化?空文件是否已经需要数据块?同时留意父目录新增的目录项。
  2. 向文件写入数据:data bitmap 的哪个位置发生变化?inode 如何记录数据位置?
  3. 创建硬链接:为什么新增名字后,文件的数据块不必复制?
  4. 删除目录项:还存在其他硬链接时,为什么数据块不会立即释放?最后一个链接删除后再观察回收。

该模拟器把普通文件简化为空文件或只有一个数据块,适合观察分配、链接和回收。理解一个文件占据多个不连续块时,需要继续学习索引分配、间接块或 extent 等机制。真实系统还要考虑文件仍被进程打开等情况,最后一个名字删除后也可能暂不释放内容。

字号、位号则是定位位示图中某一位的方法。若**块号、字号、位号均从 0 开始,块号直接对应位示图下标**,每字有 w 位,则块号 b 对应:

字号 = b // w
位号 = b % w

例如每字 32 位,块号 100 对应字号 3、位号 4,也就是自然语言中的第 4 个字、第 5 位。若题目从 1 编号,或位示图只覆盖某一段数据区,应先换算成从 0 开始的位示图下标,再计算。

配套视频可以看哈工大课程中的“生磁盘的使用”“从生磁盘到文件”“文件使用磁盘的实现”“目录与文件系统”。

6. 怎样积累自己的笔记

每学完一个主题,留下四项内容即可:它解决什么问题、核心机制是什么、一个具体例子、一个验证结果。

例如学习虚拟内存,可以记录“为什么每个进程都像拥有独立内存”,画出虚拟地址到物理地址的转换过程,手算一次页号与页内偏移,再用程序或模拟器验证。学习文件系统,则画出“文件名 → inode → 数据块”的关系,同时标出位示图负责的空闲空间管理。

软件设计师相关知识点与例题统一归入软件设计,按十二章继续补充。这篇指南保留学习路线与资源入口,具体原理和实验结果写进相应主题笔记。