posts

《Go 语言运行时原理》 · 全书目录与章节索引(30 篇)

《Go 语言运行时原理》共 10 章 29 节,全卷实验驱动:每节固定三段式——可复现实验(命令与本机实测数字)、源码定位(文件与函数)、调优决策(决策表或清单)。覆盖调度器、内存分配、GC、编译器四大子系统,以及一次端到端调优实战。

《Go 语言运行时原理》是本丛书 Go 系列的第四卷,也是收口卷,共 10 章 29 节。它的写法与前三卷不同:全卷实验驱动,每节固定三段式——① 可复现实验(命令 + 本机真实输出)② 源码定位(文件:函数)③ 调优决策(决策表或清单)。它不满足于解释「三色标记是怎么回事」,而是带你跑一遍 GC trace、指出写屏障在哪个文件的哪一行、给出「什么时候该调 GOGC」的判断依据。

全书概览

项内容
卷名《Go 语言运行时原理》
篇数29 节正文 + 1 篇目录 = 30 篇
章数10 章,分六个部分
主线版本Go 1.27(对照线 Go 1.26)
写作方式全卷实验驱动:实验 + 源码 + 决策三段式
基准环境Apple M1 Pro / 10 核 / 32 GiB(每节均声明)
前置卷一《入门》、卷二《实战》、卷三《高级》

全书目录

目录与学习路线

篇标题内容
目录全书目录与学习路线(30 篇)六个部分定位、实验驱动写法说明、常见问题速查

第一部分:方法论(第 1 章)

这一部分只有一章,但它是全卷的地基——它教的是「怎么看见运行时」。

节标题核心内容与实测亮点
1.1实验驱动方法:GODEBUG/pprof/trace/gcflags/SSA dump五类观测工具各自能看见什么;GOSSAFUNC 会写出 ssa.html
1.2源码地图与阅读路线runtime 目录的组织方式;四条建议的阅读路线
1.3复现基线:环境与基准约定基准环境、测量约定、本卷所有数字的可复现前提

第二部分:调度(第 2–3 章)

调度器决定了「哪些 goroutine 在什么时候跑」。这一部分先看内部结构,再看怎么观测和调优。

节标题核心内容与实测亮点
2.1G/M/P 结构与状态机三个结构体的字段语义;goroutine 的状态迁移路径
2.2调度循环与 work stealing 实测调度循环的入口;窃取策略与实测的负载分布
2.3抢占式调度与 sysmon协作式到抢占式的演进;sysmon 的职责与触发条件
3.1GOMAXPROCS 与容器感知实测容器 CPU 限额下的实际行为;不同取值的吞吐对照
3.2runtime/trace 解读 goroutine 时间线trace 里各条泳道分别代表什么;从时间线定位阻塞
3.3调度相关的性能决策何时该调 GOMAXPROCS、何时该改程序结构

第三部分:内存(第 4–5 章)

分配器决定了「对象放在哪、要花多少代价」,布局决定了「访问有多快」。

节标题核心内容与实测亮点
4.1size class 与 mcache/mcentral/mheap请求 33 字节实测分配 48 字节(size class 圆整);tiny allocator 的行为
4.2逃逸分析与分配决策-gcflags='-m' / -m -l / -m -m 三档真实输出;编译器实现路径
4.3分配热点定位与对象复用allocs/op 10→1、B/op 44992→12293;pprof -list 行级定位
5.1栈增长与连续栈递归 20001 帧、帧间距恒为 160;StackInuse 256→4352 KiB
5.2结构体对齐、padding 与缓存行Bad 32B / Good 24B;false sharing 实测 stride 1/8/16 = 221–317 / 30–37 / 14.6–14.8 ms
5.3内存布局优化实测Bad 48.0 vs Good 40.0 B/obj(100 万对象省 8 MB);GC 扫描面 44MB/2 轮 → 16MB/1 轮

第四部分:GC(第 6–7 章)

GC 是 Go 最常被讨论、也最常被误解的子系统。这一部分先讲内部,再讲调优。

节标题核心内容与实测亮点
6.1三色标记与写屏障-gcflags='-S' 汇编实测含 CALL runtime.gcWriteBarrier2 与 STP (R0,R1),(R25)
6.2GC 阶段、辅助标记与 pacingGOGC=100→24 轮 / 400→6 轮 / GOMEMLIMIT=64MiB→25 轮;STW p50=18µs、p99=61µs
6.3Green Tea GC 实测对比4 配置各 9 轮取中位数;关掉后 GC CPU 涨约 3 倍但墙钟仅涨约 9%(不夸大成「提速」)
7.1GOGC/GOMEMLIMIT 实验矩阵6 组配置:GOGC=off 0.40–0.55s / 0 次 GC / 1625MB vs GOGC=100 2.35–3.08s / 13–14 次 GC
7.2GC trace 与延迟分析验算 goal = 存活堆 × (1 + GOGC/100);20 万请求下 p999 稳定 28–32µs 而 max 在 97µs–1.053ms 跳动
7.3减少分配与 GC 压力字符串拼接 2484–2633ns/63allocs → Builder 273–292ns/1alloc;GC 次数 6473 → 307

第五部分:编译器(第 8–9 章)

编译器决定了很多「运行时行为」——逃逸、内联、边界检查、接口调用,都在这层定下来。

节标题核心内容与实测亮点
8.1从源码到 SSA:编译阶段与 dumpssa.html 141.2KB;sum 经 58 个核心 pass;最贵 regalloc 21000ns
8.2SSA pass 与优化实测OpIsInBounds 在 divisible 列起 x0 —— 实测证明 prove 消除了边界检查
8.3内联、边界检查消除与 -gcflags内联代价 4/8/11/17 而 main 为 137 > budget 80;-d=ssa/check_bce/debug=1 实测输出
9.1类型系统与接口动态派发(itab/eface)接口派发 ≈ 直接调用(2.1–2.2 ns);装箱 7.6–8.0 ns;1.27 静态 itab 并入 moduledata
9.2反射与 unsafe 的运行时成本reflect.Value.Call 126.2–133.3 ns vs 提前断言成具体函数后 0.948–0.953 ns
9.3汇编 ABI 与运行时函数arm64 前 16 个整数参数走 R0–R15、第 17 个起溢出到栈;arm64 无 duffcopy/duffzero

第六部分:综合(第 10 章)

节标题核心内容与实测亮点
10.1一个服务的端到端调优每请求 1263–1339 ns → 71–73 ns(约 18 倍)、GC 510 次 → 0 次;消除分配 ≈18× ≫ GOGC 调参 ≈5%
10.2运行时决策清单与版本迁移影响1.26 vs 1.27 对照实测;决策清单分版本迁移 / 四大子系统 / 三条原则

怎么用这份索引

与其他卷、专题的分工

想了解去看
Go 语法、标准库、并发原语用法卷一《Go 语言编程入门》
工程化实践:API、缓存、消息、可观测、容器化卷二《Go 语言编程实战》
版本特性、内存模型、cgo/汇编/代码生成、结构化并发卷三《Go 语言高级编程》
运行时内部:调度、内存分配、GC、编译器本卷
概念性介绍文章Go 专题 /posts/golang/

与卷三的边界:卷三 6.1 是逃逸分析的应用侧决策表,本卷 4.2 是编译器实现;卷三 6.2 讲 GC 参数怎么取值,本卷 7.1 是实验矩阵;卷三 8.1/8.2 讲怎么写汇编,本卷 9.3 讲运行时函数的 ABI 约定。

相关阅读

全部文章 Golang Game SaaS Rust Python Java 游戏开发 客户端开发 GameDev Typescript
golang

《Go 语言运行时原理》全书目录与学习路线(30 篇)

《Go 语言运行时原理》全书目录与学习路线。本卷 10 章 29 节,全部采用实验驱动写法:每节给出可复现实验与实测数字、源码定位(文件与函数)、以及可落地的调优决策表。覆盖调度器、内存分配、GC、编译器四大子系统,适合想从「会用」走向「知其所以然」的 Go 开发者。

9 分钟阅读
Go Go 语言运行时原理 Go 1.27