Go 1.26.4 超深度源码分析 --- 总体架构与模块全景
分析对象:Go 1.26.4 (
go1.26.4, build time2026-05-29T15:26:39Z)代码根目录:
github.com/go-go1.26.4非测试 Go 源码:5,065 文件,205,353 行
含测试:6,629 文件,161,452 行(纯非test非vendor统计如上)
一、项目定位
1.1 Go Runtime + 标准库是什么
Go 1.26.4 源码包含两大部分:
- Go Runtime --- 程序运行时基础设施:调度器(GMP)、内存分配器(tcmalloc式)、垃圾收集器(并发标记-清除)、goroutine 栈管理、channel 实现、接口类型系统、cgo 桥接
- Go 标准库 --- 通用编程库:io/os/net/sync/context/reflect/fmt/encoding/crypto 等
核心设计理念:
- 并发原生支持:goroutine + channel 是语言级原语,不是库
- 自动内存管理:并发 GC,写屏障,无需手动释放
- 简约即力量:少即是多,组合优于继承
- CSP 模型:Don't communicate by sharing memory; share memory by communicating
1.2 在编译/运行体系中的位置
#mermaid-svg-CJUUS9zOqNfMzjKw{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CJUUS9zOqNfMzjKw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CJUUS9zOqNfMzjKw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CJUUS9zOqNfMzjKw .error-icon{fill:#552222;}#mermaid-svg-CJUUS9zOqNfMzjKw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CJUUS9zOqNfMzjKw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CJUUS9zOqNfMzjKw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CJUUS9zOqNfMzjKw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CJUUS9zOqNfMzjKw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CJUUS9zOqNfMzjKw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CJUUS9zOqNfMzjKw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CJUUS9zOqNfMzjKw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CJUUS9zOqNfMzjKw .marker.cross{stroke:#333333;}#mermaid-svg-CJUUS9zOqNfMzjKw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CJUUS9zOqNfMzjKw p{margin:0;}#mermaid-svg-CJUUS9zOqNfMzjKw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CJUUS9zOqNfMzjKw .cluster-label text{fill:#333;}#mermaid-svg-CJUUS9zOqNfMzjKw .cluster-label span{color:#333;}#mermaid-svg-CJUUS9zOqNfMzjKw .cluster-label span p{background-color:transparent;}#mermaid-svg-CJUUS9zOqNfMzjKw .label text,#mermaid-svg-CJUUS9zOqNfMzjKw span{fill:#333;color:#333;}#mermaid-svg-CJUUS9zOqNfMzjKw .node rect,#mermaid-svg-CJUUS9zOqNfMzjKw .node circle,#mermaid-svg-CJUUS9zOqNfMzjKw .node ellipse,#mermaid-svg-CJUUS9zOqNfMzjKw .node polygon,#mermaid-svg-CJUUS9zOqNfMzjKw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CJUUS9zOqNfMzjKw .rough-node .label text,#mermaid-svg-CJUUS9zOqNfMzjKw .node .label text,#mermaid-svg-CJUUS9zOqNfMzjKw .image-shape .label,#mermaid-svg-CJUUS9zOqNfMzjKw .icon-shape .label{text-anchor:middle;}#mermaid-svg-CJUUS9zOqNfMzjKw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CJUUS9zOqNfMzjKw .rough-node .label,#mermaid-svg-CJUUS9zOqNfMzjKw .node .label,#mermaid-svg-CJUUS9zOqNfMzjKw .image-shape .label,#mermaid-svg-CJUUS9zOqNfMzjKw .icon-shape .label{text-align:center;}#mermaid-svg-CJUUS9zOqNfMzjKw .node.clickable{cursor:pointer;}#mermaid-svg-CJUUS9zOqNfMzjKw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CJUUS9zOqNfMzjKw .arrowheadPath{fill:#333333;}#mermaid-svg-CJUUS9zOqNfMzjKw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CJUUS9zOqNfMzjKw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CJUUS9zOqNfMzjKw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CJUUS9zOqNfMzjKw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CJUUS9zOqNfMzjKw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CJUUS9zOqNfMzjKw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CJUUS9zOqNfMzjKw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CJUUS9zOqNfMzjKw .cluster text{fill:#333;}#mermaid-svg-CJUUS9zOqNfMzjKw .cluster span{color:#333;}#mermaid-svg-CJUUS9zOqNfMzjKw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CJUUS9zOqNfMzjKw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CJUUS9zOqNfMzjKw rect.text{fill:none;stroke-width:0;}#mermaid-svg-CJUUS9zOqNfMzjKw .icon-shape,#mermaid-svg-CJUUS9zOqNfMzjKw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CJUUS9zOqNfMzjKw .icon-shape p,#mermaid-svg-CJUUS9zOqNfMzjKw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CJUUS9zOqNfMzjKw .icon-shape .label rect,#mermaid-svg-CJUUS9zOqNfMzjKw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CJUUS9zOqNfMzjKw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CJUUS9zOqNfMzjKw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CJUUS9zOqNfMzjKw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 标准库 (src/*)
Runtime (runtime/)
编译工具链 (cmd/)
生成目标码
嵌入 Runtime
嵌入 Runtime
嵌入 Runtime
go build/run/test
cmd/compile
(525 files, 551k lines)
cmd/link
(140 files, 43k lines)
cmd/asm
(18 files, 5.4k lines)
cmd/cgo
(304 files, 21.8k lines)
调度器 GMP
(proc.go 8125行)
垃圾收集
(mgc*.go 8k+行)
内存分配
(malloc*.go 12.5k+行)
Channel
(chan.go 970行)
栈管理
(stack.go 1430行)
sync
context
net
os
io
fmt
reflect
encoding/json
crypto/tls
1.3 核心能力
| # | 能力 | 对应模块 |
|---|---|---|
| 1 | GMP 调度器 | runtime/proc.go (8125行) + runtime2.go (1519行) |
| 2 | 并发 GC | runtime/mgc*.go (8k+行) |
| 3 | tcmalloc 式内存分配 | runtime/malloc*.go + mheap.go + mpagealloc.go |
| 4 | Channel 通信 | runtime/chan.go + select.go |
| 5 | Goroutine 栈管理 | runtime/stack.go (1430行) |
| 6 | Panic/Defer/Recover | runtime/panic.go (1704行) |
| 7 | 信号处理 | runtime/signal_unix.go (1472行) |
| 8 | 网络轮询 | runtime/netpoll.go (733行) |
| 9 | CGO 桥接 | runtime/cgocall.go (899行) |
| 10 | 符号表/追踪 | runtime/symtab.go + trace.go |
| 11 | Mutex/WaitGroup/Pool | sync/ + internal/sync/ |
| 12 | Context 取消传播 | context/context.go (806行) |
| 13 | 类型反射 | reflect/ (8760行) |
| 14 | 网络栈 | net/ (64044行) |
| 15 | TLS/加密 | crypto/tls/ (14719行) |
二、源码目录结构与行数
2.1 顶层模块行数(非test,非vendor)
| 模块 | 行数 | 文件数 | 功能 |
|---|---|---|---|
cmd/ |
816,969 | 1,529 | 编译器/链接器/go工具链 |
syscall/ |
165,971 | 272 | 系统调用封装 |
runtime/ |
145,057 | 700 | Go 运行时 |
internal/ |
101,009 | 1,007 | 内部工具包 |
crypto/ |
85,036 | 334 | 加密库 |
net/ |
64,044 | 225 | 网络库 |
go/ |
56,401 | 227 | go/ast/parser/vet 工具 |
encoding/ |
36,239 | 79 | 编码/序列化 |
simd/ |
24,826 | 41 | SIMD 向量化 |
math/ |
23,885 | 137 | 数学库 |
os/ |
15,970 | 151 | 操作系统接口 |
debug/ |
15,278 | 31 | 调试工具 |
unicode/ |
11,057 | 7 | Unicode 支持 |
image/ |
10,647 | 24 | 图像处理 |
reflect/ |
8,760 | 17 | 类型反射 |
testing/ |
8,165 | 22 | 测试框架 |
html/ |
7,326 | 20 | HTML 处理 |
text/ |
6,836 | 11 | 文本处理 |
time/ |
6,731 | 22 | 时间库 |
regexp/ |
6,529 | 12 | 正则表达式 |
compress/ |
5,571 | 17 | 压缩库 |
archive/ |
5,401 | 12 | 归档库 |
database/ |
5,275 | 5 | 数据库接口 |
log/ |
4,118 | 19 | 日志 |
fmt/ |
3,547 | 5 | 格式化I/O |
index/ |
3,102 | 4 | 后缀数组 |
mime/ |
2,766 | 16 | MIME |
sync/ |
2,566 | 17 | 同步原语 |
hash/ |
2,416 | 17 | 哈希 |
strings/ |
2,435 | 8 | 字符串操作 |
io/ |
2,243 | 14 | I/O 抽象 |
bytes/ |
2,211 | 4 | 字节操作 |
sort/ |
2,174 | 6 | 排序 |
strconv/ |
1,880 | 7 | 字符串转换 |
slices/ |
1,799 | 5 | 切片操作 |
path/ |
1,788 | 11 | 路径操作 |
bufio/ |
1,269 | 2 | 缓冲I/O |
flag/ |
1,238 | 1 | 命令行标志 |
context/ |
806 | 1 | 上下文 |
unique/ |
552 | 4 | 唯一化(interning) |
container/ |
489 | 3 | 容器(heap/list/ring) |
iter/ |
473 | 1 | 迭代器 |
embed/ |
436 | 1 | 嵌入文件 |
expvar/ |
417 | 1 | 导出变量 |
errors/ |
362 | 3 | 错误处理 |
builtin/ |
319 | 1 | 内建类型文档 |
plugin/ |
294 | 3 | 插件 |
unsafe/ |
271 | 1 | unsafe 操作 |
maps/ |
137 | 2 | Map 工具 |
arena/ |
108 | 1 | Arena 分配器 |
weak/ |
107 | 2 | 弱引用 |
cmp/ |
77 | 1 | 比较 |
structs/ |
40 | 2 | 结构体工具 |
2.2 runtime/ 核心文件行数
| 文件 | 行数 | 功能 |
|---|---|---|
malloc_generated.go |
10,041 | 内存分配查找表(自动生成) |
proc.go |
8,125 | GMP 调度器 |
mheap.go |
3,039 | 页堆管理 |
malloc.go |
2,501 | 内存分配器 |
mgc.go |
2,333 | 垃圾收集主控 |
mbitmap.go |
1,975 | 堆位图(GC标记) |
mgcmark.go |
1,792 | GC 标记阶段 |
traceback.go |
1,770 | 栈回溯 |
mprof.go |
1,734 | 内存/CPU profile |
panic.go |
1,704 | Panic/Defer/Recover |
mgcpacer.go |
1,539 | GC 调步器 |
time.go |
1,532 | 定时器管理 |
runtime2.go |
1,519 | G/M/P/schedt 核心结构 |
signal_unix.go |
1,472 | Unix 信号处理 |
stack.go |
1,430 | Goroutine 栈管理 |
mgcscavenge.go |
1,414 | GC 回收(归还OS) |
symtab.go |
1,339 | 符号表 |
mgcmark_greenteagc.go |
1,280 | Green Tea GC 标记 |
os_windows.go |
1,268 | Windows OS 支持 |
trace.go |
1,223 | 执行追踪器 |
arena.go |
1,130 | Arena 分配器 |
mpagealloc.go |
1,119 | 页分配器 |
metrics.go |
1,051 | 运行时指标 |
mgcsweep.go |
1,018 | GC 清除阶段 |
os_linux.go |
999 | Linux OS 支持 |
mstats.go |
985 | 内存统计 |
chan.go |
970 | Channel 实现 |
debuglog.go |
920 | 调试日志 |
cgocall.go |
899 | CGO 调用桥接 |
mcleanup.go |
838 | 清理回调 |
sema.go |
735 | 信号量 |
netpoll.go |
733 | 网络轮询器 |
select.go |
~700 | Select 实现 |
2.3 cmd/ 子模块行数
| 子模块 | 行数 | 文件数 | 功能 |
|---|---|---|---|
compile/ |
551,355 | 525 | Go 编译器 (前端+后端+SSA) |
internal/ |
101,812 | 181 | 编译器/链接器内部工具 |
go/ |
73,380 | 227 | go 命令 (build/test/vet/mod) |
link/ |
43,359 | 140 | 链接器 |
cgo/ |
21,812 | 304 | CGO 工具 |
dist/ |
6,049 | 18 | 构建引导 |
asm/ |
5,442 | 18 | 汇编器 |
trace/ |
4,068 | 16 | 执行追踪查看器 |
cover/ |
2,367 | 13 | 覆盖率 |
vet/ |
1,349 | 35 | 静态分析 |
gofmt/ |
1,337 | 5 | 代码格式化 |
三、四层架构
#mermaid-svg-Kf1AhmaiNSNxQhsM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Kf1AhmaiNSNxQhsM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Kf1AhmaiNSNxQhsM .error-icon{fill:#552222;}#mermaid-svg-Kf1AhmaiNSNxQhsM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Kf1AhmaiNSNxQhsM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Kf1AhmaiNSNxQhsM .marker.cross{stroke:#333333;}#mermaid-svg-Kf1AhmaiNSNxQhsM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Kf1AhmaiNSNxQhsM p{margin:0;}#mermaid-svg-Kf1AhmaiNSNxQhsM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Kf1AhmaiNSNxQhsM .cluster-label text{fill:#333;}#mermaid-svg-Kf1AhmaiNSNxQhsM .cluster-label span{color:#333;}#mermaid-svg-Kf1AhmaiNSNxQhsM .cluster-label span p{background-color:transparent;}#mermaid-svg-Kf1AhmaiNSNxQhsM .label text,#mermaid-svg-Kf1AhmaiNSNxQhsM span{fill:#333;color:#333;}#mermaid-svg-Kf1AhmaiNSNxQhsM .node rect,#mermaid-svg-Kf1AhmaiNSNxQhsM .node circle,#mermaid-svg-Kf1AhmaiNSNxQhsM .node ellipse,#mermaid-svg-Kf1AhmaiNSNxQhsM .node polygon,#mermaid-svg-Kf1AhmaiNSNxQhsM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Kf1AhmaiNSNxQhsM .rough-node .label text,#mermaid-svg-Kf1AhmaiNSNxQhsM .node .label text,#mermaid-svg-Kf1AhmaiNSNxQhsM .image-shape .label,#mermaid-svg-Kf1AhmaiNSNxQhsM .icon-shape .label{text-anchor:middle;}#mermaid-svg-Kf1AhmaiNSNxQhsM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Kf1AhmaiNSNxQhsM .rough-node .label,#mermaid-svg-Kf1AhmaiNSNxQhsM .node .label,#mermaid-svg-Kf1AhmaiNSNxQhsM .image-shape .label,#mermaid-svg-Kf1AhmaiNSNxQhsM .icon-shape .label{text-align:center;}#mermaid-svg-Kf1AhmaiNSNxQhsM .node.clickable{cursor:pointer;}#mermaid-svg-Kf1AhmaiNSNxQhsM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Kf1AhmaiNSNxQhsM .arrowheadPath{fill:#333333;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Kf1AhmaiNSNxQhsM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Kf1AhmaiNSNxQhsM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Kf1AhmaiNSNxQhsM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Kf1AhmaiNSNxQhsM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Kf1AhmaiNSNxQhsM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Kf1AhmaiNSNxQhsM .cluster text{fill:#333;}#mermaid-svg-Kf1AhmaiNSNxQhsM .cluster span{color:#333;}#mermaid-svg-Kf1AhmaiNSNxQhsM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Kf1AhmaiNSNxQhsM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Kf1AhmaiNSNxQhsM rect.text{fill:none;stroke-width:0;}#mermaid-svg-Kf1AhmaiNSNxQhsM .icon-shape,#mermaid-svg-Kf1AhmaiNSNxQhsM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Kf1AhmaiNSNxQhsM .icon-shape p,#mermaid-svg-Kf1AhmaiNSNxQhsM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Kf1AhmaiNSNxQhsM .icon-shape .label rect,#mermaid-svg-Kf1AhmaiNSNxQhsM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Kf1AhmaiNSNxQhsM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Kf1AhmaiNSNxQhsM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Kf1AhmaiNSNxQhsM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Layer 4: 标准库 (net/os/io/fmt/encoding/crypto)
Layer 3: 同步与抽象 (sync + context + reflect)
Layer 2: Runtime 核心 (runtime/)
Layer 1: 编译工具链 (cmd/)
嵌入
嵌入
嵌入
go build/run/test
compile (SSA)
link (elf/macho/pe)
asm (plan9)
cgo (C interop)
调度器 GMP
(proc.go 8125行)
GC 垃圾收集
(mgc*.go 8k+行)
内存分配 tcmalloc
(malloc*.go + mheap 12k+行)
Channel + Select
(chan.go + select.go)
栈管理
(stack.go 1430行)
信号/网络轮询
(signal/netpoll)
sync
(Mutex/WaitGroup/Pool/Once/Map)
context
(cancel/deadline/value)
reflect
(Type/Value/Method)
sync/atomic
(CAS/Load/Store)
net (TCP/UDP/DNS)
os (文件/进程/信号)
io (Reader/Writer)
fmt (格式化)
encoding/json
crypto/tls
四、GMP 调度器核心概念
4.1 G/M/P 三元素
#mermaid-svg-5T1RRyagm14STIxm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5T1RRyagm14STIxm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5T1RRyagm14STIxm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5T1RRyagm14STIxm .error-icon{fill:#552222;}#mermaid-svg-5T1RRyagm14STIxm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5T1RRyagm14STIxm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5T1RRyagm14STIxm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5T1RRyagm14STIxm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5T1RRyagm14STIxm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5T1RRyagm14STIxm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5T1RRyagm14STIxm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5T1RRyagm14STIxm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5T1RRyagm14STIxm .marker.cross{stroke:#333333;}#mermaid-svg-5T1RRyagm14STIxm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5T1RRyagm14STIxm p{margin:0;}#mermaid-svg-5T1RRyagm14STIxm g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-5T1RRyagm14STIxm g.classGroup text .title{font-weight:bolder;}#mermaid-svg-5T1RRyagm14STIxm .cluster-label text{fill:#333;}#mermaid-svg-5T1RRyagm14STIxm .cluster-label span{color:#333;}#mermaid-svg-5T1RRyagm14STIxm .cluster-label span p{background-color:transparent;}#mermaid-svg-5T1RRyagm14STIxm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5T1RRyagm14STIxm .cluster text{fill:#333;}#mermaid-svg-5T1RRyagm14STIxm .cluster span{color:#333;}#mermaid-svg-5T1RRyagm14STIxm .nodeLabel,#mermaid-svg-5T1RRyagm14STIxm .edgeLabel{color:#131300;}#mermaid-svg-5T1RRyagm14STIxm .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-5T1RRyagm14STIxm .label text{fill:#131300;}#mermaid-svg-5T1RRyagm14STIxm .labelBkg{background:#ECECFF;}#mermaid-svg-5T1RRyagm14STIxm .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-5T1RRyagm14STIxm .classTitle{font-weight:bolder;}#mermaid-svg-5T1RRyagm14STIxm .node rect,#mermaid-svg-5T1RRyagm14STIxm .node circle,#mermaid-svg-5T1RRyagm14STIxm .node ellipse,#mermaid-svg-5T1RRyagm14STIxm .node polygon,#mermaid-svg-5T1RRyagm14STIxm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5T1RRyagm14STIxm .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm g.clickable{cursor:pointer;}#mermaid-svg-5T1RRyagm14STIxm g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-5T1RRyagm14STIxm g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-5T1RRyagm14STIxm .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-5T1RRyagm14STIxm .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-5T1RRyagm14STIxm .dashed-line{stroke-dasharray:3;}#mermaid-svg-5T1RRyagm14STIxm .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-5T1RRyagm14STIxm #compositionStart,#mermaid-svg-5T1RRyagm14STIxm .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm #compositionEnd,#mermaid-svg-5T1RRyagm14STIxm .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm #dependencyStart,#mermaid-svg-5T1RRyagm14STIxm .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm #dependencyStart,#mermaid-svg-5T1RRyagm14STIxm .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm #extensionStart,#mermaid-svg-5T1RRyagm14STIxm .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm #extensionEnd,#mermaid-svg-5T1RRyagm14STIxm .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm #aggregationStart,#mermaid-svg-5T1RRyagm14STIxm .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm #aggregationEnd,#mermaid-svg-5T1RRyagm14STIxm .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm #lollipopStart,#mermaid-svg-5T1RRyagm14STIxm .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm #lollipopEnd,#mermaid-svg-5T1RRyagm14STIxm .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-5T1RRyagm14STIxm .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-5T1RRyagm14STIxm .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5T1RRyagm14STIxm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5T1RRyagm14STIxm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5T1RRyagm14STIxm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} "g.m"
"m.curg"
"m.p"
"p.m"
"p.runq"
"全局调度"
"全局调度"
"全局调度"
1
1
1
1
1
1
1
1
1
1
1
1
0..*
0..*
0..*
0..*
G
+stack stack
+stackguard0 uintptr
+stackguard1 uintptr
+_panic *_panic
+_defer *_defer
+m *m
+sched gobuf
+atomicstatus atomic.Uint32
+goid uint64
+waitsince int64
+waitreason waitReason
+preempt bool
+preemptStop bool
+lockedm muintptr
+param unsafe.Pointer
+timer *timer
+gcAssistBytes int64
M
+g0 *g
+curg *g
+p puintptr
+nextp puintptr
+oldp puintptr
+id int64
+spinning bool
+blocked bool
+park note
+mallocing int32
+throwing throwType
+preemptoff string
+locks int32
+ncgocall uint64
+incgo bool
+signalPending atomic.Uint32
+preemptGen atomic.Uint32
P
+id int32
+status uint32
+link puintptr
+m muintptr
+mcache *mcache
+runqhead uint32
+runqtail uint32
+runq 256guintptr
+runnext guintptr
+gFree gList
+gcw gcWork
+wbBuf wbBuf
+timers timers
+deferpool \[\]*_defer
+goidcache uint64
schedt
+goidgen atomic.Uint64
+lock mutex
+midle listHeadManual
+nmidle int32
+pidle puintptr
+npidle atomic.Int32
+nmspinning atomic.Int32
+runq gQueue
+gFree struct
+gcwaiting atomic.Bool
+profilehz int32
4.2 G 状态转换
#mermaid-svg-3FieEgjdAwkuONWY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3FieEgjdAwkuONWY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3FieEgjdAwkuONWY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3FieEgjdAwkuONWY .error-icon{fill:#552222;}#mermaid-svg-3FieEgjdAwkuONWY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3FieEgjdAwkuONWY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3FieEgjdAwkuONWY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3FieEgjdAwkuONWY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3FieEgjdAwkuONWY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3FieEgjdAwkuONWY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3FieEgjdAwkuONWY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3FieEgjdAwkuONWY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3FieEgjdAwkuONWY .marker.cross{stroke:#333333;}#mermaid-svg-3FieEgjdAwkuONWY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3FieEgjdAwkuONWY p{margin:0;}#mermaid-svg-3FieEgjdAwkuONWY defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-3FieEgjdAwkuONWY g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-3FieEgjdAwkuONWY g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-3FieEgjdAwkuONWY g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-3FieEgjdAwkuONWY g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-3FieEgjdAwkuONWY g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-3FieEgjdAwkuONWY .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-3FieEgjdAwkuONWY .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-3FieEgjdAwkuONWY .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-3FieEgjdAwkuONWY .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-3FieEgjdAwkuONWY .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-3FieEgjdAwkuONWY .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-3FieEgjdAwkuONWY .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-3FieEgjdAwkuONWY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3FieEgjdAwkuONWY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3FieEgjdAwkuONWY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3FieEgjdAwkuONWY .edgeLabel .label text{fill:#333;}#mermaid-svg-3FieEgjdAwkuONWY .label div .edgeLabel{color:#333;}#mermaid-svg-3FieEgjdAwkuONWY .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-3FieEgjdAwkuONWY .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-3FieEgjdAwkuONWY .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-3FieEgjdAwkuONWY .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-3FieEgjdAwkuONWY .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-3FieEgjdAwkuONWY .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3FieEgjdAwkuONWY .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3FieEgjdAwkuONWY #statediagram-barbEnd{fill:#333333;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3FieEgjdAwkuONWY .cluster-label,#mermaid-svg-3FieEgjdAwkuONWY .nodeLabel{color:#131300;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-3FieEgjdAwkuONWY .note-edge{stroke-dasharray:5;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-note text{fill:black;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram-note .nodeLabel{color:black;}#mermaid-svg-3FieEgjdAwkuONWY .statediagram .edgeLabel{color:red;}#mermaid-svg-3FieEgjdAwkuONWY #dependencyStart,#mermaid-svg-3FieEgjdAwkuONWY #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-3FieEgjdAwkuONWY .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3FieEgjdAwkuONWY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} newproc()
初始化
ready()
execute()
系统调用
gopark()
gosched()
goexit()
exitsyscall()
park_m()
goready()
free
_Gidle
_Gdead
_Grunnable
_Grunning
_Gsyscall
_Gwaiting
执行用户代码\n拥有栈
系统调用中\n不执行用户代码
阻塞等待\n(chan/lock/select)
4.3 P 状态
| 状态 | 值 | 描述 |
|---|---|---|
_Pidle |
0 | 空闲,不在运行用户代码 |
_Prunning |
1 | 被 M 持有,运行用户代码 |
_Psyscall |
2 | M 在系统调用中,P 可能被偷走 |
_Pgcstop |
3 | STW 期间 |
_Pdead |
4 | 已死亡(减少 GOMAXPROCS) |
五、内存分配器架构
5.1 tcmalloc 式层级
#mermaid-svg-5JdvsBR86BqMUJYm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5JdvsBR86BqMUJYm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5JdvsBR86BqMUJYm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5JdvsBR86BqMUJYm .error-icon{fill:#552222;}#mermaid-svg-5JdvsBR86BqMUJYm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5JdvsBR86BqMUJYm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5JdvsBR86BqMUJYm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5JdvsBR86BqMUJYm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5JdvsBR86BqMUJYm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5JdvsBR86BqMUJYm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5JdvsBR86BqMUJYm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5JdvsBR86BqMUJYm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5JdvsBR86BqMUJYm .marker.cross{stroke:#333333;}#mermaid-svg-5JdvsBR86BqMUJYm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5JdvsBR86BqMUJYm p{margin:0;}#mermaid-svg-5JdvsBR86BqMUJYm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5JdvsBR86BqMUJYm .cluster-label text{fill:#333;}#mermaid-svg-5JdvsBR86BqMUJYm .cluster-label span{color:#333;}#mermaid-svg-5JdvsBR86BqMUJYm .cluster-label span p{background-color:transparent;}#mermaid-svg-5JdvsBR86BqMUJYm .label text,#mermaid-svg-5JdvsBR86BqMUJYm span{fill:#333;color:#333;}#mermaid-svg-5JdvsBR86BqMUJYm .node rect,#mermaid-svg-5JdvsBR86BqMUJYm .node circle,#mermaid-svg-5JdvsBR86BqMUJYm .node ellipse,#mermaid-svg-5JdvsBR86BqMUJYm .node polygon,#mermaid-svg-5JdvsBR86BqMUJYm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5JdvsBR86BqMUJYm .rough-node .label text,#mermaid-svg-5JdvsBR86BqMUJYm .node .label text,#mermaid-svg-5JdvsBR86BqMUJYm .image-shape .label,#mermaid-svg-5JdvsBR86BqMUJYm .icon-shape .label{text-anchor:middle;}#mermaid-svg-5JdvsBR86BqMUJYm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5JdvsBR86BqMUJYm .rough-node .label,#mermaid-svg-5JdvsBR86BqMUJYm .node .label,#mermaid-svg-5JdvsBR86BqMUJYm .image-shape .label,#mermaid-svg-5JdvsBR86BqMUJYm .icon-shape .label{text-align:center;}#mermaid-svg-5JdvsBR86BqMUJYm .node.clickable{cursor:pointer;}#mermaid-svg-5JdvsBR86BqMUJYm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5JdvsBR86BqMUJYm .arrowheadPath{fill:#333333;}#mermaid-svg-5JdvsBR86BqMUJYm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5JdvsBR86BqMUJYm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5JdvsBR86BqMUJYm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5JdvsBR86BqMUJYm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5JdvsBR86BqMUJYm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5JdvsBR86BqMUJYm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5JdvsBR86BqMUJYm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5JdvsBR86BqMUJYm .cluster text{fill:#333;}#mermaid-svg-5JdvsBR86BqMUJYm .cluster span{color:#333;}#mermaid-svg-5JdvsBR86BqMUJYm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5JdvsBR86BqMUJYm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5JdvsBR86BqMUJYm rect.text{fill:none;stroke-width:0;}#mermaid-svg-5JdvsBR86BqMUJYm .icon-shape,#mermaid-svg-5JdvsBR86BqMUJYm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5JdvsBR86BqMUJYm .icon-shape p,#mermaid-svg-5JdvsBR86BqMUJYm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5JdvsBR86BqMUJYm .icon-shape .label rect,#mermaid-svg-5JdvsBR86BqMUJYm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5JdvsBR86BqMUJYm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5JdvsBR86BqMUJYm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5JdvsBR86BqMUJYm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} OS
Page Heap (全局锁)
Central Cache (加锁)
Per-P Cache (无锁)
span 无空闲
无可用 span
无足够页面
批量分配
获取 span
mcache
每个 P 一个
~70个 size class
mspan
(当前 P 的空闲 span)
mcentral
每个 size class 一个
partial list + full list
mheap
页堆管理器
pageAlloc
页面分配位图
arena (64MB)
mmap/munmap
至少1MB批量申请
5.2 分配路径
| 大小 | 路径 | 描述 |
|---|---|---|
| 微对象 (≤16B, no pointer) | tiny allocator |
mcache 中的微小分配器,合并多个微小对象到一个 span |
| 小对象 (≤32KB) | mcache → mcentral → mheap |
~70 个 size class,按大小向上取整 |
| 大对象 (>32KB) | mheap 直接分配 |
直接从页堆分配 |
六、GC 架构
6.1 并发标记-清除
#mermaid-svg-rQESouxBQQtYUWG4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rQESouxBQQtYUWG4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rQESouxBQQtYUWG4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rQESouxBQQtYUWG4 .error-icon{fill:#552222;}#mermaid-svg-rQESouxBQQtYUWG4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rQESouxBQQtYUWG4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rQESouxBQQtYUWG4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rQESouxBQQtYUWG4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rQESouxBQQtYUWG4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rQESouxBQQtYUWG4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rQESouxBQQtYUWG4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rQESouxBQQtYUWG4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rQESouxBQQtYUWG4 .marker.cross{stroke:#333333;}#mermaid-svg-rQESouxBQQtYUWG4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rQESouxBQQtYUWG4 p{margin:0;}#mermaid-svg-rQESouxBQQtYUWG4 defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-rQESouxBQQtYUWG4 g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-rQESouxBQQtYUWG4 g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-rQESouxBQQtYUWG4 g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-rQESouxBQQtYUWG4 g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-rQESouxBQQtYUWG4 g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-rQESouxBQQtYUWG4 .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-rQESouxBQQtYUWG4 .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-rQESouxBQQtYUWG4 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-rQESouxBQQtYUWG4 .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-rQESouxBQQtYUWG4 .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-rQESouxBQQtYUWG4 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-rQESouxBQQtYUWG4 .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-rQESouxBQQtYUWG4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rQESouxBQQtYUWG4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rQESouxBQQtYUWG4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rQESouxBQQtYUWG4 .edgeLabel .label text{fill:#333;}#mermaid-svg-rQESouxBQQtYUWG4 .label div .edgeLabel{color:#333;}#mermaid-svg-rQESouxBQQtYUWG4 .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-rQESouxBQQtYUWG4 .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-rQESouxBQQtYUWG4 .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-rQESouxBQQtYUWG4 .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-rQESouxBQQtYUWG4 .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-rQESouxBQQtYUWG4 .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rQESouxBQQtYUWG4 .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rQESouxBQQtYUWG4 #statediagram-barbEnd{fill:#333333;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rQESouxBQQtYUWG4 .cluster-label,#mermaid-svg-rQESouxBQQtYUWG4 .nodeLabel{color:#131300;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-rQESouxBQQtYUWG4 .note-edge{stroke-dasharray:5;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-note text{fill:black;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram-note .nodeLabel{color:black;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagram .edgeLabel{color:red;}#mermaid-svg-rQESouxBQQtYUWG4 #dependencyStart,#mermaid-svg-rQESouxBQQtYUWG4 #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-rQESouxBQQtYUWG4 .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rQESouxBQQtYUWG4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 正常运行
GC 触发
(STW: 启用写屏障)
标记完成
(STW: 刷新mcaches)
清除准备
(STW: 禁用写屏障)
_GCoff
_GCmark
_GCmarktermination
正常分配
无写屏障
并发标记
写屏障启用
Mutator 协助
标记终止
短暂 STW
6.2 GC 四步流程
| 步骤 | 阶段 | STW | 描述 |
|---|---|---|---|
| 1 | Sweep termination | ✅ | STW,清除上轮未清除的 span |
| 2 | Mark phase | ❌ | 启用写屏障,并发标记(Workers + Assists) |
| 3 | Mark termination | ✅ | STW,刷新缓存,计算下一轮触发阈值 |
| 4 | Sweep phase | ❌ | 并发清除,回收白色对象 |
七、Channel + Select 架构
7.1 hchan 结构
#mermaid-svg-0q1AeLCr3cZWZzYU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0q1AeLCr3cZWZzYU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0q1AeLCr3cZWZzYU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0q1AeLCr3cZWZzYU .error-icon{fill:#552222;}#mermaid-svg-0q1AeLCr3cZWZzYU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0q1AeLCr3cZWZzYU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0q1AeLCr3cZWZzYU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0q1AeLCr3cZWZzYU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0q1AeLCr3cZWZzYU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0q1AeLCr3cZWZzYU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0q1AeLCr3cZWZzYU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0q1AeLCr3cZWZzYU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0q1AeLCr3cZWZzYU .marker.cross{stroke:#333333;}#mermaid-svg-0q1AeLCr3cZWZzYU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0q1AeLCr3cZWZzYU p{margin:0;}#mermaid-svg-0q1AeLCr3cZWZzYU g.classGroup text{fill:#9370DB;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-0q1AeLCr3cZWZzYU g.classGroup text .title{font-weight:bolder;}#mermaid-svg-0q1AeLCr3cZWZzYU .cluster-label text{fill:#333;}#mermaid-svg-0q1AeLCr3cZWZzYU .cluster-label span{color:#333;}#mermaid-svg-0q1AeLCr3cZWZzYU .cluster-label span p{background-color:transparent;}#mermaid-svg-0q1AeLCr3cZWZzYU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0q1AeLCr3cZWZzYU .cluster text{fill:#333;}#mermaid-svg-0q1AeLCr3cZWZzYU .cluster span{color:#333;}#mermaid-svg-0q1AeLCr3cZWZzYU .nodeLabel,#mermaid-svg-0q1AeLCr3cZWZzYU .edgeLabel{color:#131300;}#mermaid-svg-0q1AeLCr3cZWZzYU .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-0q1AeLCr3cZWZzYU .label text{fill:#131300;}#mermaid-svg-0q1AeLCr3cZWZzYU .labelBkg{background:#ECECFF;}#mermaid-svg-0q1AeLCr3cZWZzYU .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-0q1AeLCr3cZWZzYU .classTitle{font-weight:bolder;}#mermaid-svg-0q1AeLCr3cZWZzYU .node rect,#mermaid-svg-0q1AeLCr3cZWZzYU .node circle,#mermaid-svg-0q1AeLCr3cZWZzYU .node ellipse,#mermaid-svg-0q1AeLCr3cZWZzYU .node polygon,#mermaid-svg-0q1AeLCr3cZWZzYU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0q1AeLCr3cZWZzYU .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU g.clickable{cursor:pointer;}#mermaid-svg-0q1AeLCr3cZWZzYU g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-0q1AeLCr3cZWZzYU g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-0q1AeLCr3cZWZzYU .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-0q1AeLCr3cZWZzYU .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-0q1AeLCr3cZWZzYU .dashed-line{stroke-dasharray:3;}#mermaid-svg-0q1AeLCr3cZWZzYU .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-0q1AeLCr3cZWZzYU #compositionStart,#mermaid-svg-0q1AeLCr3cZWZzYU .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU #compositionEnd,#mermaid-svg-0q1AeLCr3cZWZzYU .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU #dependencyStart,#mermaid-svg-0q1AeLCr3cZWZzYU .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU #dependencyStart,#mermaid-svg-0q1AeLCr3cZWZzYU .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU #extensionStart,#mermaid-svg-0q1AeLCr3cZWZzYU .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU #extensionEnd,#mermaid-svg-0q1AeLCr3cZWZzYU .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU #aggregationStart,#mermaid-svg-0q1AeLCr3cZWZzYU .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU #aggregationEnd,#mermaid-svg-0q1AeLCr3cZWZzYU .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU #lollipopStart,#mermaid-svg-0q1AeLCr3cZWZzYU .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU #lollipopEnd,#mermaid-svg-0q1AeLCr3cZWZzYU .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-0q1AeLCr3cZWZzYU .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-0q1AeLCr3cZWZzYU .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0q1AeLCr3cZWZzYU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0q1AeLCr3cZWZzYU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0q1AeLCr3cZWZzYU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} recvq
sendq
linked list
hchan
+qcount uint
+dataqsiz uint
+buf unsafe.Pointer
+elemsize uint16
+closed uint32
+timer *timer
+elemtype *_type
+sendx uint
+recvx uint
+recvq waitq
+sendq waitq
+lock mutex
waitq
+first *sudog
+last *sudog
sudog
+g *g
+next *sudog
+prev *sudog
+elem unsafe.Pointer
+acquiretime int64
+ticket uint32
+isSelect bool
+success bool
recvq
sendq
八、核心数据流
8.1 Goroutine 创建与调度完整流程
G (Goroutine) M (Thread) P (Processor) Runtime 编译器 用户代码 G (Goroutine) M (Thread) P (Processor) Runtime 编译器 用户代码 #mermaid-svg-isgepm14PfjIqZ9u{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-isgepm14PfjIqZ9u .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-isgepm14PfjIqZ9u .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-isgepm14PfjIqZ9u .error-icon{fill:#552222;}#mermaid-svg-isgepm14PfjIqZ9u .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-isgepm14PfjIqZ9u .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-isgepm14PfjIqZ9u .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-isgepm14PfjIqZ9u .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-isgepm14PfjIqZ9u .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-isgepm14PfjIqZ9u .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-isgepm14PfjIqZ9u .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-isgepm14PfjIqZ9u .marker{fill:#333333;stroke:#333333;}#mermaid-svg-isgepm14PfjIqZ9u .marker.cross{stroke:#333333;}#mermaid-svg-isgepm14PfjIqZ9u svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-isgepm14PfjIqZ9u p{margin:0;}#mermaid-svg-isgepm14PfjIqZ9u .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-isgepm14PfjIqZ9u text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-isgepm14PfjIqZ9u .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-isgepm14PfjIqZ9u .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-isgepm14PfjIqZ9u .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-isgepm14PfjIqZ9u .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-isgepm14PfjIqZ9u #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-isgepm14PfjIqZ9u .sequenceNumber{fill:white;}#mermaid-svg-isgepm14PfjIqZ9u #sequencenumber{fill:#333;}#mermaid-svg-isgepm14PfjIqZ9u #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-isgepm14PfjIqZ9u .messageText{fill:#333;stroke:none;}#mermaid-svg-isgepm14PfjIqZ9u .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-isgepm14PfjIqZ9u .labelText,#mermaid-svg-isgepm14PfjIqZ9u .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-isgepm14PfjIqZ9u .loopText,#mermaid-svg-isgepm14PfjIqZ9u .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-isgepm14PfjIqZ9u .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-isgepm14PfjIqZ9u .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-isgepm14PfjIqZ9u .noteText,#mermaid-svg-isgepm14PfjIqZ9u .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-isgepm14PfjIqZ9u .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-isgepm14PfjIqZ9u .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-isgepm14PfjIqZ9u .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-isgepm14PfjIqZ9u .actorPopupMenu{position:absolute;}#mermaid-svg-isgepm14PfjIqZ9u .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-isgepm14PfjIqZ9u .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-isgepm14PfjIqZ9u .actor-man circle,#mermaid-svg-isgepm14PfjIqZ9u line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-isgepm14PfjIqZ9u :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} runnext = G (优先调度) altG 阻塞 (chan/channel)G 完成 go f()runtime.newproc(f)newproc1(): 分配 G + 栈put G 到 runnext 或 runqfindRunnable() 选取 Ggogo() 切换到 G 的栈执行 f()gopark()从 M 上移除 GfindRunnable() 选取下一个 Ggoexit()将 G 放入 gFree 池
8.2 Channel 发送-接收流程
G2 (接收者) hchan G1 (发送者) G2 (接收者) hchan G1 (发送者) #mermaid-svg-cLiOa4vfCF06Jptk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cLiOa4vfCF06Jptk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cLiOa4vfCF06Jptk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cLiOa4vfCF06Jptk .error-icon{fill:#552222;}#mermaid-svg-cLiOa4vfCF06Jptk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cLiOa4vfCF06Jptk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cLiOa4vfCF06Jptk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cLiOa4vfCF06Jptk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cLiOa4vfCF06Jptk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cLiOa4vfCF06Jptk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cLiOa4vfCF06Jptk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cLiOa4vfCF06Jptk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cLiOa4vfCF06Jptk .marker.cross{stroke:#333333;}#mermaid-svg-cLiOa4vfCF06Jptk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cLiOa4vfCF06Jptk p{margin:0;}#mermaid-svg-cLiOa4vfCF06Jptk .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-cLiOa4vfCF06Jptk text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-cLiOa4vfCF06Jptk .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-cLiOa4vfCF06Jptk .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-cLiOa4vfCF06Jptk .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-cLiOa4vfCF06Jptk .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-cLiOa4vfCF06Jptk #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-cLiOa4vfCF06Jptk .sequenceNumber{fill:white;}#mermaid-svg-cLiOa4vfCF06Jptk #sequencenumber{fill:#333;}#mermaid-svg-cLiOa4vfCF06Jptk #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-cLiOa4vfCF06Jptk .messageText{fill:#333;stroke:none;}#mermaid-svg-cLiOa4vfCF06Jptk .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-cLiOa4vfCF06Jptk .labelText,#mermaid-svg-cLiOa4vfCF06Jptk .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-cLiOa4vfCF06Jptk .loopText,#mermaid-svg-cLiOa4vfCF06Jptk .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-cLiOa4vfCF06Jptk .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-cLiOa4vfCF06Jptk .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-cLiOa4vfCF06Jptk .noteText,#mermaid-svg-cLiOa4vfCF06Jptk .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-cLiOa4vfCF06Jptk .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-cLiOa4vfCF06Jptk .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-cLiOa4vfCF06Jptk .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-cLiOa4vfCF06Jptk .actorPopupMenu{position:absolute;}#mermaid-svg-cLiOa4vfCF06Jptk .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-cLiOa4vfCF06Jptk .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-cLiOa4vfCF06Jptk .actor-man circle,#mermaid-svg-cLiOa4vfCF06Jptk line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-cLiOa4vfCF06Jptk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} alt接收队列非空缓冲区有空位无缓冲且无接收者 alt发送队列非空缓冲区有数据无缓冲且无发送者 chansend(c, elem)直接拷贝到接收者 elemgoready(唤醒)拷贝到 bufsendxsendx++将 G1 包装为 sudog 入 sendqgopark(阻塞)chanrecv(c, elem)从 bufrecvx 拷贝到 elem唤醒发送者拷贝 bufrecvx 到 elemrecvx++将 G2 包装为 sudog 入 recvqgopark(阻塞)