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


这本书的取舍

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

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

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

重要

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

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

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

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

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


本书的知识地图

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
            ┌────────────────────────────────────────────────┐
            │  第一篇  计算机组成与体系结构(第 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 章会给出到前面各章的索引。


如何使用本书

提示

三条阅读路线,按你的目的选一条。详细的日程表在附录 D。

路线一:系统学习(约 6~8 周)

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

1
2
3
4
5
6
7
第 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 的自测清单。

1
2
3
4
5
6
7
8
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> 块中,建议先自己作答再展开。每道题的解析都会写清"错在哪"与"面试官会怎么追问"。

阅读建议

警告

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

注意

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

提示

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