转码记录 Vol.04 | 25 Fall:OS、数据库、网络,三个系统方向同时打通
从 24 Fall 开始算,这是第四个学期。前三个学期的路径:打数学和逻辑基础,自学从 Python 到 RISC-V 汇编的完整栈,动手实现 CPU、写 C、做全栈项目。这学期是系统软件层的集中展开:操作系统、数据库、网 络三个方向同步推进,配合 MIT 6.S081、Berkeley CS 186、CS 168,加 Redis 工程实践和一个从零上线的 Agent 应用。
从 24 Fall 开始算,这是第四个学期。
前三个学期的路径:24 Fall 打数学和逻辑基础,25 Winter 自学从 Python 到 RISC-V 汇编的完整栈,25 Summer 动手实现 CPU、写 C、做全栈项目。走向是从硬件层向上——先理解计算机怎么工作,再理解软件怎么在硬件上运行。
这学期是这条路径里"系统软件层"的集中展开:操作系统、数据库、网络,三个方向同步推进。校内三门课,同步跟三门顶级自学课(Berkeley CS 168、CS 186,MIT 6.S081),加 Redis 工程实践和一个从零上线的 Agent 应用项目。
校内课程
EECS 2101 – Fundamentals of Data Structures
前置是 EECS 2030(高级 OOP)和 MATH 1090(逻辑),成绩 A。
CS 61B 和 EECS 2030 里已经用过这些数据结构(链表、树、哈希表、图)。这门课的增量在于形式化方法:每个 ADT 有明确的规约语言(前置/后置条件、不变量),每个算法要证明正确性。这是 MATH 1090 里那套形式化框架在数据结构领域的直接应用。
摊还分析(Amortized Analysis):动态数组(ArrayList)在追加元素时,满了就扩容为 2 倍并复制。单次扩容代价是 O(n),但把这个代价平摊 到之前所有的 append 操作上,每次操作实际承担的成本是常数级的——均摊 O(1)。这个分析工具不只用于动态数组,分析 Splay Tree 等自适应数据结构都要用到。
哈希表的期望分析:哈希表的 O(1) 查找是期望情况,不是最坏情况。分析建立在哈希函数均匀分布的假设上——n 个元素分布到 m 个槽,每个槽的期望长度是 n/m(装载因子),装载因子保持常数,查找就是 O(1) 期望。最坏情况(所有元素哈希到同一个槽)是 O(n)。
图算法的正确性证明:BFS 为什么能找到最短路径(无权图)?因为 BFS 按层展开,第一次到达某节点时走过的层数就是最短路长度。用归纳法证明:第 k 层的所有节点都在最短路长度为 k 的位置上。Dijkstra 的贪心策略为什么正确?因为到一个节点的最短路不会经过一个还没确定最短距离的节点(非负权图条件)。
这门课让数据结构从"我知道怎么用"升级到"我能说清楚为什么是对的,为什么是这个复杂度"。
EECS 3421(York)+ CS 186(Berkeley)– 数据库系统
这两门课同步进行——EECS 3421 讲数据库"是什么以及如何使用",CS 186 讲数据库"内部是怎么实现的"。两门互补,一起看是这学期效果最好的组合,成绩 A。
使用层(EECS 3421 – Introduction to Database Systems)
ER Model 到关系模式:实体关系图描述业务概念,转换成关系模式时要处理各种关联——一对多(外键),多对多(联结表),继承层次(每个子类一张表,或所有子类共享一张表)。设计选择影响后续查询效率和数据一致性维护成本。
关系代数和 SQL:SQL 是声明式语言,写的是"想要什么";关系代数描述"怎么计算"。SELECT ... WHERE ... 对应关系代数的选择(σ)和投影(π);JOIN 对应连接(⋈)。理解这个对应关系,有助于理解查询优化器在做什么。
Transaction 的 ACID 和隔离级别:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| Read Uncommitted | ✓ | ✓ | ✓ |
| Read Committed | ✗ | ✓ | ✓ |
| Repeatable Read | ✗ | ✗ | ✓ |
| Serializable | ✗ | ✗ | ✗ |
PostgreSQL 默认 Read Committed,MySQL InnoDB 默认 Repeatable Read。选隔离级别是在数据一致性和并发性能之间做权衡,不存在"一律用最强"的正确答案。
实现层(CS 186 – Introduction to Database Systems)
Buffer Pool Management:数据库不直接读写磁盘,而是维护内存缓冲池,把频繁访问的页(page,通常 4KB 或 8KB)缓存在内存中。替换策略(LRU、Clock)决定内存满时驱逐哪一页。这和操作系统的页面置换是同一类问题,但数据库自己管理,因为它比 OS 更了解访问模式。
B+ 树索引:关系数据库的主流索引结构不是二叉树,而是 B+ 树。原因:B+ 树的阶数(branching factor)很高(通常数百个子节点),树高极低(3-4 层就能索引数百万条记录),每次查找的磁盘 I/O 次数少。B+ 树的叶节点形成有序链表,范围查询可以顺序扫描叶层,不需要回到上层节点。
Join 算法:SQL 的 JOIN 有多种执行算法,查询优化器根据代价估计选择:Nested Loop Join(简单但 I/O 代价高)、Sort-Merge Join(适合大表、有序数据)、Hash Join(适合等值连接、大表对小表)。同一条 SQL,优化器选不同的 Join 算法,执行时间可以差几个数量级。
WAL 和 ARIES 恢复协议:崩溃恢复靠 WAL(Write-Ahead Logging)——在数据页写入磁盘之前,日志记录必须先落盘。ARIES 恢复流程:Analysis(扫描日志确认崩溃状态)→ Redo(重做所有操作,包括未提交事务)→ Undo(回滚未提交事务)。这是"先全部重做,再撤销未提交的",和直觉上"只恢复已提交的"相反,但逻辑上更简洁。
