【Go 1.26.4】(Part 1) Go 1.26.4 超深度源码分析 — 总体架构与模块全景

Go 1.26.4 超深度源码分析 --- 总体架构与模块全景

分析对象:Go 1.26.4 (go1.26.4, build time 2026-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 源码包含两大部分:

  1. Go Runtime --- 程序运行时基础设施:调度器(GMP)、内存分配器(tcmalloc式)、垃圾收集器(并发标记-清除)、goroutine 栈管理、channel 实现、接口类型系统、cgo 桥接
  2. 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(阻塞)


相关推荐
guygg881 小时前
C# 生成中间带 Logo 头像的二维码
开发语言·c#
闪电悠米1 小时前
黑马点评-Redis 消息队列-03_stream_consumer_group
开发语言·数据库·redis·分布式·缓存·junit·lua
8125035331 小时前
第 9 篇:子网掩码:如何划分“小区”
开发语言·php
Jun6261 小时前
QT(12)-制作lib库
开发语言·qt
Java面试题总结1 小时前
C#12 中的 Using Alias
开发语言·windows·c#
加号32 小时前
【C#】 ASCII 码转字符串技术解析
开发语言·c#
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 33 - 35)
开发语言·人工智能·笔记·python·学习方法
星恒随风2 小时前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
艾利克斯冰2 小时前
Java 设计模式-行为型模式(更新中)
java·开发语言·设计模式