前言:如何使用这本书
读者定位:计算机相关专业本科毕业、正在准备后端 / 基础架构方向技术面试的读者 结构:8 篇 · 36 章 · 4 个附录 性质:既可作为系统自学的原理教材,也可作为面试前的针对性复习手册
这本书的取舍
市面上八股资料大多是一份题目清单:列出问什么、答案是哪几句、按什么顺序背。清单很好用,但它有一个结构性缺陷——它只告诉你"是什么",不告诉你"为什么",也不告诉你知识点之间的连接。后果是:
- 追问一层就崩。 你答"
InnoDB用MVCC实现读已提交和可重复读",面试官接着问"那两个隔离级别的实现差别在哪"——答案其实只有一句话(ReadView的创建时机不同),但没推过一遍的人答不出来。 - 换个场景就认不出来。 “
TIME_WAIT过多怎么处理"你会背,但面试官换成"我们的服务作为客户端短连接调用下游,TIME_WAIT打满了本地端口”——这是同一件事,但需要你知道自己是主动关闭方才能答对。 - 设计题露底。 设计题考的不是中间件数量,而是你有没有稳定的推进顺序与取舍意识。这一点无法靠背题获得。
因此本书只有一个核心取舍:
重要
假设本科课程内容你已经学过一遍,因此本书不再讲"是什么";只讲面试必问、且必须知道"为什么"的部分。
这条取舍展开为三条硬规则,全书每一章都在执行:
| 规则 | 做法 | 例子 |
|---|---|---|
| 不重复本科已教的定义 | 不写"进程是资源分配的基本单位"这类句子,直接进机制层 | 讲 fork 就讲写时复制的页表标记与缺页触发路径,而不是讲 fork 是什么 |
| 保留八股必问、必考的点 | 判定标准:标准答案需要三段以上、且面试官会追问到底层的,就写透 | TIME_WAIT 为什么是 2MSL 必须给出两条独立理由 |
| 难点要比别处讲得清楚 | 该画的图必须画,该给的算例必须给数字 | cwnd 演化必须有完整折线图;B+ 树树高必须有算例 |
一句话能答完的题("TCP 和 UDP 的区别")不作为独立小节,只作为表格里的速查条目出现。
反面清单(书里不会出现的内容):写 OSI 七层的定义;写"索引的优点是加快查询";写"Redis 很快因为它是内存数据库";任何能原样抄进教材却不解决面试追问的段落。
本书的知识地图
下面这张图给出 8 篇之间的依赖关系。箭头表示"读懂了 A 才能顺畅读 B"。
| |
三条主干依赖链:
第 1~3 章 → 第 4~9 章 → 第 10~14 章:硬件层 → 内核机制 → 现场观测。不懂缓存行就理解不了伪共享,不懂缺页就理解不了 OOM 与 swap。第 10~14 章 + 第 15~19 章 → 第 20~27 章:数据库的很多行为是操作系统行为的下游——redo log的顺序写、fsync的代价、主从复制的跨机 RTT、buffer pool与 page cache 的竞争,都要靠前两篇解释。第 4~6 章 → 第 28~32 章:AQS的队列是 CLH 锁的变体,锁升级对应内核态的互斥量,ThreadLocal泄漏的根因是弱引用与线程生命周期。并发这一篇是操作系统同步原语在 JVM 层的重演。
第 33~36 章依赖前面几乎全部:设计题是把前七篇的知识点重新组织成一个方案,因此它们放在最后,并且第 36 章会给出到前面各章的索引。
如何使用本书
提示
三条阅读路线,按你的目的选一条。详细的日程表在附录 D。
路线一:系统学习(约 6~8 周)
按篇顺序读,每章做完 5 道自测题再看答案。每周 4~5 章。
| |
路线二:面试冲刺(7 天 / 3 天两套)
只读各章的「本章小结」「面试高频问题与陷阱」与标 ★ 的重点章,然后直接做附录 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 提供反向索引:给定一个关键词,告诉你该回看哪一章哪一节。
提示
每章的「前置知识检查」表列出了读懂该章需要的前置点以及它们在书中的补齐位置。如果某一行你不确定,先去补齐再读正文,比硬读要快得多:八股里几乎所有"看不懂"都源于前置缺失,而不是内容太难。