# 前言：如何使用这本书


**读者定位**：计算机相关专业本科毕业、正在准备后端 / 基础架构方向技术面试的读者
**结构**：8 篇 · 36 章 · 4 个附录
**性质**：既可作为系统自学的原理教材，也可作为面试前的针对性复习手册

---

## 这本书的取舍

市面上八股资料大多是一份**题目清单**：列出问什么、答案是哪几句、按什么顺序背。清单很好用，但它有一个结构性缺陷——**它只告诉你"是什么"，不告诉你"为什么"，也不告诉你知识点之间的连接**。后果是：

1. **追问一层就崩。** 你答"`InnoDB` 用 `MVCC` 实现读已提交和可重复读"，面试官接着问"那两个隔离级别的实现差别在哪"——答案其实只有一句话（`ReadView` 的创建时机不同），但没推过一遍的人答不出来。
2. **换个场景就认不出来。** "`TIME_WAIT` 过多怎么处理"你会背，但面试官换成"我们的服务作为客户端短连接调用下游，`TIME_WAIT` 打满了本地端口"——这是同一件事，但需要你知道自己是**主动关闭方**才能答对。
3. **设计题露底。** 设计题考的不是中间件数量，而是你有没有稳定的推进顺序与取舍意识。这一点无法靠背题获得。

因此本书只有一个核心取舍：

> [!IMPORTANT]
> **假设本科课程内容你已经学过一遍，因此本书不再讲"是什么"；只讲面试必问、且必须知道"为什么"的部分。**

这条取舍展开为三条硬规则，全书每一章都在执行：

| 规则 | 做法 | 例子 |
|---|---|---|
| **不重复本科已教的定义** | 不写"进程是资源分配的基本单位"这类句子，直接进机制层 | 讲 `fork` 就讲写时复制的页表标记与缺页触发路径，而不是讲 `fork` 是什么 |
| **保留八股必问、必考的点** | 判定标准：标准答案需要三段以上、且面试官会追问到底层的，就写透 | `TIME_WAIT` 为什么是 2MSL 必须给出两条独立理由 |
| **难点要比别处讲得清楚** | 该画的图必须画，该给的算例必须给数字 | `cwnd` 演化必须有完整折线图；B+ 树树高必须有算例 |

一句话能答完的题（"`TCP` 和 `UDP` 的区别"）不作为独立小节，只作为表格里的速查条目出现。

**反面清单**（书里不会出现的内容）：写 OSI 七层的定义；写"索引的优点是加快查询"；写"`Redis` 很快因为它是内存数据库"；任何能原样抄进教材却不解决面试追问的段落。

---

## 本书的知识地图

下面这张图给出 8 篇之间的依赖关系。箭头表示"读懂了 A 才能顺畅读 B"。

```
            ┌────────────────────────────────────────────────┐
            │  第一篇  计算机组成与体系结构（第 1~3 章）        │
            │  存储层次与微架构 → 程序如何运行 → 性能工程口径   │
            └───────────────────────┬────────────────────────┘
                                    │ 提供"硬件为什么慢"的解释力
                                    ▼
            ┌────────────────────────────────────────────────┐
            │  第二篇  操作系统（第 4~9 章）                   │
            │  进程与 COW → 调度 → 同步与死锁 → fd 与 epoll     │
            │  → 内存管理 → 中断与系统调用                     │
            └───────┬─────────────────────────────┬──────────┘
                    │                             │
        ┌───────────┘                             └───────────┐
        ▼                                                     ▼
┌──────────────────────────────┐              ┌──────────────────────────────┐
│  第三篇  Linux（第 10~14 章） │              │  第四篇 计算机网络（15~19）   │
│  观测与排障：四板斧、OOM、    │              │  分层 → TCP → HTTP/TLS        │
│  磁盘 I/O、命令行             │              │  → DNS/CDN → 抓包排障         │
└──────────────┬───────────────┘              └──────────────┬───────────────┘
               │                                             │
               └──────────────┬──────────────────────────────┘
                              ▼
            ┌────────────────────────────────────────────────┐
            │  第五篇  数据库（第 20~27 章）                   │
            │  MySQL 架构 → 三种日志 → MVCC → 索引 → 锁 →      │
            │  优化 → 复制与分库分表 → Redis 与缓存            │
            └───────────────────────┬────────────────────────┘
                                    │
        ┌───────────────────────────┴───────────────────────────┐
        ▼                                                       ▼
┌──────────────────────────────┐              ┌──────────────────────────────┐
│ 第六篇 Java/JVM/并发（28~32）│              │ 第七篇 MQ·分布式·微服务(33~35)│
│ 对象模型 → 集合 → JMM →       │              │ 消息三件套 → CAP 与 Raft →    │
│ 线程池与 AQS → GC            │              │ 一致性方案 → 微服务治理       │
└──────────────┬───────────────┘              └──────────────┬───────────────┘
               │                                             │
               └──────────────┬──────────────────────────────┘
                              ▼
            ┌────────────────────────────────────────────────┐
            │  第八篇  场景设计与面试复盘（第 36 章）          │
            │  六步框架 → 容量估算 → 秒杀/短链/排行榜          │
            └────────────────────────────────────────────────┘
```

**三条主干依赖链**：

1. `第 1~3 章 → 第 4~9 章 → 第 10~14 章`：硬件层 → 内核机制 → 现场观测。不懂缓存行就理解不了伪共享，不懂缺页就理解不了 OOM 与 swap。
2. `第 10~14 章 + 第 15~19 章 → 第 20~27 章`：数据库的很多行为是**操作系统行为的下游**——`redo log` 的顺序写、`fsync` 的代价、主从复制的跨机 RTT、`buffer pool` 与 page cache 的竞争，都要靠前两篇解释。
3. `第 4~6 章 → 第 28~32 章`：`AQS` 的队列是 CLH 锁的变体，锁升级对应内核态的互斥量，`ThreadLocal` 泄漏的根因是弱引用与线程生命周期。并发这一篇是操作系统同步原语在 JVM 层的重演。

**第 33~36 章依赖前面几乎全部**：设计题是把前七篇的知识点重新组织成一个方案，因此它们放在最后，并且第 36 章会给出到前面各章的索引。

---

## 如何使用本书

> [!TIP]
> 三条阅读路线，按你的目的选一条。详细的日程表在附录 D。

### 路线一：系统学习（约 6~8 周）

按篇顺序读，每章做完 5 道自测题再看答案。每周 4~5 章。

```
第 1 周   第 1~3 章        组成原理：量级与代价，快读但必须记住数字
第 2 周   第 4~9 章        操作系统：全书最花时间的一篇，逐步跟着推导
第 3 周   第 10~14 章      Linux：边读边在机器上敲命令
第 4 周   第 15~19 章      网络：必须自己画一遍 TCP 状态机与 cwnd 折线
第 5~6 周 第 20~27 章      数据库：本篇篇幅最大，MVCC 与锁要各读两遍
第 7 周   第 28~32 章      Java/JVM/并发：写代码验证，不要只读
第 8 周   第 33~36 章 + 附录 分布式与设计题，然后按附录 D 做模拟面试
```

### 路线二：面试冲刺（7 天 / 3 天两套）

只读各章的「本章小结」「面试高频问题与陷阱」与标 ★ 的重点章，然后直接做附录 B 的索引与附录 D 的自测清单。

```
7 天版                              3 天版
Day 1  第 22、23、24 章（MVCC/索引/锁）   Day 1  第 22、23、24、30、31、32 章的小结
Day 2  第 20、21、25、26 章（架构/日志/优化/复制）      + 附录 A 参数速查
Day 3  第 16、17、18 章（TCP/HTTP/TLS）   Day 2  第 16、17、18、11、12 章的小结
Day 4  第 30、31、32 章（JMM/线程池/GC）  Day 3  第 33、34、36 章 + 附录 B 索引
Day 5  第 4、7、8、11、12 章（OS 与排障）+ 附录 A
Day 6  第 27、33、34 章（Redis/MQ/分布式）
Day 7  第 36 章 + 附录 B、D 全量过一遍
```

### 路线三：按岗位定制（查阅式）

| 你的目标岗位 | 优先篇目 | 可以略过 |
|---|---|---|
| 后端业务开发 | 第五（数据库）、第六（Java）、第四（网络） | 第一篇的第 2 章 |
| 基础架构 / 中间件 | 第二、三（OS 与 Linux）、第七（分布式） | 第八篇 |
| 数据库 / 存储方向 | 第五篇全部 + 第二篇第 7、8、9 章 | 第六篇第 28、29 章 |
| 大数据方向 | 第二、三篇 + 第七篇的 MQ 部分 | 第五篇的锁与事务细节 |
| 云原生方向 | 第三篇（cgroup/namespace）+ 第七篇 | 第五篇第 26 章 |

---

## 全书目录

### 第一篇 计算机组成与体系结构

- **第 1 章 存储层次与 CPU 微架构**：存储层次金字塔与延迟量级；局部性与缓存行；组相联与三类缺失；MESI；伪共享；流水线与三类冒险；分支预测；乱序执行与 Spectre/Meltdown；NUMA
- **第 2 章 程序如何真正运行**：编译链接全链路；ELF 段与节；静态与动态链接、PLT/GOT 与延迟绑定；`ld.so` 与 `LD_PRELOAD`；虚拟地址空间布局；栈帧与调用约定；大小端；内存对齐
- **第 3 章 性能工程：从纳秒到毫秒**：延迟数量级与心算；吞吐与延迟；Little 定律；Amdahl 与 Gustafson；USE 与 RED；尾延迟放大；基准测试五个陷阱

### 第二篇 操作系统

- **第 4 章 进程、线程与写时复制**：`fork` 与 COW 完整机制；`clone` 的 flags 组合；`exec` 家族；僵尸与孤儿；守护进程双 fork；NPTL 与 LWP
- **第 5 章 调度与 CPU 虚拟化**：调度三目标矛盾；经典算法与致命场景；CFS 的 `vruntime`、红黑树与 `nice` 换算；调度类；多核负载均衡与缓存亲和；上下文切换开销
- **第 6 章 同步、锁与死锁**：CAS 与 ABA；自旋与互斥的判定标准；信号量与条件变量（`while` 而非 `if`）；内存屏障；死锁四条件的必要非充分性；银行家算法；活锁与饥饿；无锁与无等待
- **第 7 章 文件描述符、VFS 与 I/O 多路复用**：fd 三层结构；`dup`/`fork` 的共享语义；软硬链接；`select`/`poll`/`epoll` 对比与 epoll 内部实现；LT 与 ET；零拷贝三种实现；page cache 与 `O_DIRECT`；`io_uring`
- **第 8 章 内存管理**：虚拟内存三动机；多级页表与 TLB；缺页四类；页替换算法与 Clock；`mmap` 用途谱系；共享内存；碎片与 slab；`malloc` 的 `brk`/`mmap` 分界
- **第 9 章 中断、系统调用与块层**：上下半部与三种下半部机制；中断上下文约束；系统调用完整路径与开销；`vDSO`；信号与 `SIGCHLD` 陷阱；I/O 栈与四种调度器；buffered 与 direct I/O

### 第三篇 Linux

- **第 10 章 进程、信号与资源限制**：进程状态机与 `D` 态不可杀；`ps`/`top` 字段真实含义；`/proc/[pid]` 速查；信号与 `SIGPIPE`；`ulimit` 生效层次；cgroup v1/v2；namespace 与容器
- **第 11 章 Linux 性能四板斧**：平均负载的准确含义；CPU 八项分解；上下文切换；内存 `available` 与 `si`/`so`；`iostat` 的 `await`/`aqu-sz`/`%util` 与 `%util` 为什么不可靠；`perf` 与火焰图；完整排查案例
- **第 12 章 内存、OOM 与 swap**：`/proc/meminfo` 全字段；page cache 与脏页回写；OOM killer 选择算法；`overcommit` 三种模式与 `malloc` 的骗局；`swappiness` 的真实含义；内存泄漏定位；cgroup 内存限制
- **第 13 章 文件系统、磁盘与 I/O 排查**：ext4 与 xfs 取舍；`df -i` 与 inode 耗尽；`du` 与 `df` 不一致；挂载选项；RAID 写惩罚；`fio` 与 IOPS 口径；`blktrace`；fd 耗尽三层排查
- **第 14 章 命令行与 Shell 速查**：三剑客分工；端口与进程排查；日志分析（`uniq -c` 的坑）；`find` 与 `xargs`；重定向顺序陷阱；`set -euo pipefail`；TOP10 完整推导

### 第四篇 计算机网络

- **第 15 章 体系结构与分层**：分层的代价；协议数据单元；封装与解封装全旅程；MTU、MSS 与分片的层次归属；ARP；NAT 与打洞；拥塞控制为何端到端；BDP
- **第 16 章 TCP 连接管理**：报文头全字段；三次握手每步作用与为什么不能两次；两个队列与溢出；SYN Flood 与 syncookies；四次挥手；`TIME_WAIT` 的 2MSL 两条理由；`CLOSE_WAIT` 排查；状态机全图
- **第 17 章 TCP 可靠传输与拥塞控制**：RTO 计算（`SRTT`/`RTTVAR`）；快速重传与 SACK；滑动窗口与零窗口探测；糊涂窗口综合征与 Nagle 死锁；`cwnd` 演化完整折线；丢包为何等同拥塞；CUBIC 与 BBR
- **第 18 章 HTTP 演进与 HTTPS**：HTTP/1.1 队头阻塞与管线化失败；HTTP/2 二进制分帧与 HPACK；HTTP/2 的 TCP 层队头阻塞；HTTP/3 与 QUIC 的 0-RTT 与连接迁移；TLS 1.2 与 1.3 握手对比；证书链与 `SNI`/`HSTS`；状态码陷阱
- **第 19 章 DNS、CDN 与网络排障**：DNS 递归与迭代查询；记录类型与 TTL；`dig +trace`；CDN 回源与命中率；分层排障法；`curl -w` 时间指标全表；抓包看什么；`ping`/`traceroute`/`mtr` 的能力边界

### 第五篇 数据库

- **第 20 章 MySQL 架构与存储引擎**：三层架构与 SQL 生命周期；优化器为何选错索引；buffer pool 与 `old` 区防污染；change buffer；表空间与页结构；行格式与行溢出；`UPDATE` 完整生命周期
- **第 21 章 redo log、undo log 与 binlog**：WAL 思想；`LSN` 与环形结构；组提交；undo 的双重作用与 `purge`；binlog 三种格式取舍；**两阶段提交三种崩溃点的恢复分析**；崩溃恢复流程
- **第 22 章 事务、隔离级别与 MVCC**：ACID 各自的实现依赖；隔离级别与异常现象对照；隐藏字段与版本链；**`ReadView` 可见性判断算法**；RC 与 RR 的根因；RR 下仍幻读的两种场景；长事务危害
- **第 23 章 索引原理与设计**：为什么是 B+ 树；**树高算例与三层能放多少行**；聚簇与二级索引；回表与覆盖索引；最左前缀完整推导；ICP；索引失效清单；联合索引列顺序方法论；前缀索引
- **第 24 章 锁、加锁规则与死锁**：MDL 与 DDL 雪崩链条；三种行锁形态；**加锁规则八条**；意向锁；唯一与非唯一索引的加锁差异；隐式锁；死锁日志读法；乐观锁与悲观锁
- **第 25 章 SQL 优化与执行计划**：`EXPLAIN` 全字段；`type` 十级排序；**`key_len` 计算**；`Extra` 危险信号；`EXPLAIN ANALYZE`；慢查询日志；深分页三方案；`COUNT` 系列差异；`NLJ`/`BNL`/Hash Join；子查询改写；在线 DDL 与 `gh-ost`
- **第 26 章 复制、高可用与分库分表**：三种复制模式；复制线程模型与 `relay log`；`GTID`；主从延迟五原因；并行复制与 `WRITESET`；**`seconds_behind_master` 为什么不准**；读写分离延迟读；脑裂；分库分表与路由；跨库分页；`XA`
- **第 27 章 Redis 原理与缓存架构**：单线程模型与 6.0 多线程 I/O；**八种类型的底层编码与转换阈值**；`SDS` 与 `listpack`；渐进式 rehash；过期删除与八种淘汰策略；RDB/AOF/混合持久化；主从与哨兵与 Cluster（16384 槽、`MOVED` 与 `ASK`）；缓存三件套；**缓存一致性四方案**；热 key 与大 key

### 第六篇 Java、JVM 与并发

- **第 28 章 Java 语言与对象模型**：对象布局与指针压缩；`equals`/`hashCode` 契约；字符串常量池与 `intern`；装箱缓存；`final`/`static` 语义；`finally` 覆盖陷阱；`try-with-resources`；JDK 动态代理与 CGLIB；泛型擦除与桥方法；序列化安全
- **第 29 章 集合框架原理**：`ArrayList` 快速失败；`LinkedList` 真实性能；**`HashMap` 扰动函数、0.75 负载因子、8/6 阈值、`hash & oldCap` 拆分**；`ConcurrentHashMap` 从分段锁到 `CAS + synchronized`；`CopyOnWriteArrayList` 边界；`LinkedHashMap` 实现 LRU；`TimSort` 契约异常
- **第 30 章 JMM、volatile 与 synchronized**：JMM 抽象模型；`happens-before` 八条；重排序三类型；内存屏障四类型与插入策略；`volatile` 两条语义与 DCL 必须加 `volatile` 的推导；`Mark Word` 位域与**锁升级路径**；`ObjectMonitor`；`final` 安全发布；**`ThreadLocalMap` 内存泄漏根因**
- **第 31 章 并发工具、线程池与 AQS**：七参数与**任务提交四步流程**；三种队列的行为差异；四种拒绝策略；`Executors` 四工厂的隐患；**线程数计算公式**；可观测与动态调整；**`AQS` 的 `state`、CLH 变体队列、`waitStatus`、`Condition` 队列**；公平与非公平锁；同步工具语义差异；`CompletableFuture` 与公共池隐患；`LongAdder`
- **第 32 章 JVM 内存结构与 GC**：运行时数据区；永久代到元空间；`TLAB` 与逃逸分析；**`GC Roots` 完整清单**；四种引用；分代假说与 `Card Table`；Minor GC 与**晋升四种条件**；**三色标记漏标两条件与两类解法**；CMS 的 `Concurrent Mode Failure`；G1 的 Region 与 SATB 与 `Mixed GC`；ZGC 着色指针；**八种 OOM**

### 第七篇 消息队列、分布式与微服务

- **第 33 章 消息队列：可靠性三件套**：**消息丢失三个环节**与各自防线；`Kafka` 的 `ISR`/`HW`/`LEO`；**消息重复根因与幂等四方案**；顺序消息三个层次与 `Kafka` 有序边界；**消息积压排查与处理**；延迟消息与时间轮；事务消息；四种 MQ 选型
- **第 34 章 分布式理论：CAP、共识与一致性**：CAP 的准确表述与 `PACELC`；一致性模型谱系；**Raft 完整机制（选举、日志复制、`commitIndex` 推进的反例推导、分区下的两个 leader）**；Paxos 与 ZAB；分布式事务六方案对比；分布式 ID 六方案与时钟回拨；**分布式锁四实现与 `fencing token`**；限流四算法；一致性哈希与虚拟节点
- **第 35 章 微服务架构与治理**：微服务取舍与拆分时机；注册发现两模式与 `AP`/`CP`；`Eureka` 自我保护；负载均衡七策略；**熔断器三态与参数**；线程池与信号量隔离；**重试放大算例**；降级层次；链路追踪与采样；网关职责边界；配置中心与灰度
- **第 36 章 场景设计题的答题框架**：评分维度；**六步答题框架**；**容量估算完整算例**；**秒杀六层防线与超卖分析**；短链接（`301` 与 `302` 之争）；排行榜；Feed 推拉；在线人数统计；白板沟通节奏；答不全的补救

### 附录

- **附录 A 核心参数与数量级速查**
- **附录 B 高频面试问题索引（正反双向）**
- **附录 C 术语中英对照表**
- **附录 D 学习路线、能力矩阵与自测清单**

---

## 排版约定

- **公式**：行内公式统一写成反引号包裹的纯文本数学，例如 `RTO = SRTT + 4 × RTTVAR`、`MSS = 1460`；成块推导与结构图用**无语言标注**的围栏代码块。全书**不使用 LaTeX 的 `$...$`**，以保证在任何 Markdown 渲染器下都不会露出源码。
- **代码**：一律标注语言；注释解释"为什么"而不只是"是什么"。
- **提示块**：全书只使用五种 —— `[!NOTE]`（前提与约定）、`[!TIP]`（记忆锚点与面试话术）、`[!IMPORTANT]`（必须记住的核心结论）、`[!WARNING]`（易错点）、`[!CAUTION]`（高风险误解）。
- **数值**：所有性能数字都给出数量级与口径（如"SSD 随机读 4 KB 约 100 μs"）。数量级已经足够用于面试估算，**背错数量级比不背更糟**。
- **自测题答案**：默认折叠在 `<details>` 块中，建议先自己作答再展开。每道题的解析都会写清"错在哪"与"面试官会怎么追问"。

---

## 阅读建议

> [!WARNING]
> **不要跳过推导。** 本书中所有"必背结论"都配有推导或至少一段"为什么"。它们不是装饰——面试的追问绝大多数正是冲着"只背了结论、没理解条件"的人设计的。例如"`TIME_WAIT` 是 2MSL"这个结论，只会背的人在被问"为什么不能省掉它、不用 `SO_REUSEADDR` 行不行"时立刻卡住。

> [!NOTE]
> 本书的每一章末尾都有「面试高频问题与陷阱」表，其中"陷阱"一列写的是**错误回答长什么样**。建议用法是：先只看"面试问法"列自问自答，再看"陷阱"列检查自己是否踩了坑。附录 B 提供反向索引：给定一个关键词，告诉你该回看哪一章哪一节。

> [!TIP]
> 每章的「前置知识检查」表列出了读懂该章需要的前置点以及它们在书中的补齐位置。如果某一行你不确定，**先去补齐再读正文**，比硬读要快得多：八股里几乎所有"看不懂"都源于前置缺失，而不是内容太难。


---

> 作者: [破戒僧](https://onlyblacktea.cn)  
> URL: https://onlyblacktea.cn/book/backend/preface/  

