跳转至

学习路线

系统知识不是一条从“简单”到“复杂”的直线,而是一张围绕执行、存储、通信与协调展开的依赖图。下面给出一条主线和三条可按目标切换的支线。

主线:从一条指令到一次请求

第一阶段:表示与执行

先建立不会频繁失效的底层模型:

  1. 抽象、契约与性能
  2. 数据表示与内存层次
  3. ISA 与微架构
  4. 流水线、ILP 与分支预测
  5. 缓存与一致性

退出条件不是能背流水线级数,而是能够解释:同一段源码为什么在不同数据布局、编译选项和核心拓扑下表现不同。

第二阶段:资源虚拟化

接着理解操作系统怎样把有限硬件变成稳定接口:

  1. 进程与线程
  2. 调度
  3. 虚拟内存
  4. I/O、中断与 DMA
  5. 文件系统

退出条件是能从一次系统调用画出用户态、内核、设备和返回路径,并区分阻塞时间、CPU 时间和设备服务时间。

第三阶段:并发与异步

并发部分按“正确性先于性能”的顺序学习:

  1. 顺序、竞态与不变量
  2. 锁与条件变量
  3. 原子操作与内存模型
  4. 协程
  5. 异步与事件循环
  6. 无锁算法与 RCU
  7. 结构化并发

退出条件是能为共享状态写出不变量、线性化点、取消路径和资源生命周期,而不仅是调用某个并发库。

第四阶段:通信与持久化

把单机状态扩展到网络和存储:

  1. 分层与分组
  2. TCP、UDP 与 QUIC
  3. 拥塞控制
  4. Socket 与 I/O 模型
  5. SSD 与 NVMe
  6. 缓存、日志与崩溃一致性

退出条件是能准确解释“发送成功”“写入成功”“提交成功”分别跨过了哪一个边界。

第五阶段:扩展与容错

最后研究工作拆分、通信和失败:

  1. Work、Span 与扩展定律
  2. 拓扑与通信
  3. 时间、时钟与顺序
  4. 复制与共识
  5. 事务与隔离
  6. 可靠性与可观测性

退出条件是能说清一个扩展方案减少了什么、增加了什么通信或协调成本,以及遇到部分失败时保留哪些保证。

三条目标支线

系统程序员

优先顺序:

C / C++ / Rust / Go → ABI 与链接 → 内存模型 → 虚拟内存 → I/O → 调试与剖析

重点页面包括 CC++RustGoWebAssembly链接、加载与 ABI性能剖析

后端与基础设施工程

优先顺序:

运行时 → 并发 → Socket → TCP/QUIC → 存储 → 事务 → 可观测性

重点不只是 API 使用,而是超时、重试、背压、幂等、队列和尾延迟的组合效应。

高性能与并行计算

优先顺序:

缓存/NUMA → SIMD/SIMT → Work/Span → OpenMP → CUDA/MPI → 拓扑与集合通信

每次优化都先写性能上界,再用 profiling 验证瓶颈是否真的位于计算、访存、同步或通信。

十二周实践节奏

主题 可验证产出
1 数据表示与汇编 对一个短函数解释对象布局、调用约定和反汇编
2 流水线与缓存 用基准展示局部性和分支可预测性的数量级差异
3 进程、线程与调度 追踪一次创建、阻塞、唤醒和上下文切换
4 虚拟内存 解释页表、TLB、缺页和写时复制
5 锁、原子与内存模型 为一个并发队列写出不变量和 happens-before
6 协程与异步 I/O 实现带取消、超时和有界背压的小型执行器
7 IP、TCP 与 QUIC 抓包解释握手、确认、重传和流量控制
8 文件系统与 SSD 追踪一次写入直到持久化边界
9 性能测量 设计对照实验并生成可复现的 profiling 证据
10 并行计算 用 Work/Span 与实测加速比解释扩展瓶颈
11 复制、共识与事务 对故障时间线判断可见状态与恢复路径
12 全栈复盘 从一次慢请求完成跨层因果分析

Reference