- 2.1 并行、并发的基本概念
- 2.2 缓存技术
- UMA
- NUMA
- 一致性协议
- 真假共享
- 2.3 性能模型
- 2.4 分布式计算的基本概念
- 2.5 共识技术
- 内存屏障技术
- 三色不变性原理
- 强、弱不变性
- 赋值器的颜色
- 新分配对象的颜色
- 赋值器屏障技术
- 灰色赋值器的 Dijkstra 插入屏障
- 黑色赋值器的 Yuasa 删除屏障
- 进一步阅读的参考文献
- 三色不变性原理
- 垃圾回收统一理论
- 5.1 程序引导
- 入口
- 引导
- 总结
- 进一步阅读的参考文献
- 5.2 初始化概览
- CPU 相关信息的初始化
- 运行时算法初始化
- 模块链接初始化
- 核心组件的初始化
- 总结
- 5.3 主 goroutine
- 概览
- pkg.init 顺序
- 何去何从?
- 6.1 基本结构
- 工作线程的暂止和复始
- 主要结构
- M 的结构
- P 的结构
- G 的结构
- 调度器 sched 的结构
- 总结
- 进一步阅读的参考文献
- 6.2 调度器初始化
- M 的初始化
- P 的初始化
- G 的初始化
- 一些细节
- 总结
- 6.3 调度循环
- 执行前的准备
- mstart 和 mstart1
- M 与 P 的绑定
- M 的暂止和复始
- 核心调度
- 偷取工作
- M 的唤醒
- M 的创生
- 系统线程的创建 (darwin)
- 系统线程的创建 (linux)
- M/G 解绑
- M 的死亡
- 总结
- 进一步阅读的参考文献
- 执行前的准备
- 6.4 线程管理
- LockOSThread
- UnlockOSThread
- lockedg/lockedm 与调度循环
- 模板线程
- 总结
- 进一步阅读的参考文献
- 6.5 信号处理机制
- 信号与软中断
- 初始化
- 获取原始信号屏蔽字
- 初始化信号栈
- 初始化信号屏蔽字
- 信号处理
- Extra M
- 总结
- 进一步阅读的参考文献
- 6.6 执行栈管理
- goroutine 栈结构
- 执行栈初始化
- G 的创生
- 执行栈的分配
- 小栈分配
- 大栈分配
- 堆上分配
- 执行栈的伸缩
- 分段标记
- 栈的扩张
- 栈的拷贝
- 栈的收缩
- 总结
- 6.7 协作与抢占
- 协作式调度
- 主动用户让权: Gosched
- 主动调度弃权: 栈扩张与抢占标记
- 被动监控弃权: 阻塞监控
- 抢占式调度
- 总结
- 进一步阅读的参考文献
- 协作式调度
- 6.8 运行时同步原语
- 运行时通知机制 note
- 结构
- 注册通知
- 发送通知
- 清除通知
- 运行时互斥量机制 mutex
- 结构
- lock
- unlock
- 运行时信号量机制 semaphore
- sudog 缓存
- 基于 goroutine 抽象的信号量
- 总结
- 进一步阅读的参考文献
- 运行时通知机制 note
- 6.9 系统监控
- 监控循环
- 总结
- 6.10 过去、现在与未来
- 演进史
- 单线程版调度器
- 多线程版调度器
- 工作窃取调度器
- 改进展望:非均匀访存感知的调度器设计
- 总结
- 进一步阅读的参考文献
- 演进史
- 6.11 用户层 APIs
- 7.1 基本知识
- 主要结构
- Arena
- heapArena
- arenaHint
- mspan
- mcache
- mcentral
- mheap
- 分配概览
- 分配入口
- 小对象分配
- 微对象分配
- 大对象分配
- 总结
- 进一步阅读的参考文献
- 7.2 组件
- fixalloc
- 结构
- 初始化
- 分配
- 回收
- linearAlloc
- mcache
- 分配
- 释放
- per-P? per-M?
- 其他
- memclrNoHeapPointers
- 系统级内存管理调用
- fixalloc
- 7.3 初始化
- 7.4 大对象分配
- 从堆上分配
- 从操作系统申请
- 7.5 小对象分配
- 从 mcache 获取
- 从 mecentral 获取
- 从 mheap 获取
- 7.6 微对象分配
- 7.7 内存统计
- 7.8 过去、现在与未来
- 8.1 基本知识
- 并发三色回收一瞥
- 原始的标记清扫算法
- 内存模型
- 进一步阅读的参考文献
- 8.2 混合写屏障技术
- 基本思想
- 可靠性、完备性和有界性的证明
- 实现细节
- 总结
- 进一步阅读的参考文献
- 8.3 并发标记清扫
- 并发标记
- 并发清扫
- 并行三色标记
- 进一步阅读的参考文献
- 8.4 初始化
- 引导阶段的 GC 初始化
- GC 的后台工作
- 8.5 触发机制与调步算法
- GC 的调控方式
- 调步算法的设计
- 实现
- 8.6 GC 周期概述
- GC 周期的不同阶段
- STW 的启动
- STW 的结束
- GC 的启动
- 标记准备阶段
- 8.7 扫描标记阶段
- 8.8 标记终止阶段
- 8.9 内存清扫阶段
- 9.10 内存归还阶段
- 8.11 过去、现在与未来
- 8.12 用户层 APIs
- 存活与终结
- SetFinalizer
- KeepAlive
- 存活与终结
- 10.1 参与运行时的系统调用: Linux 篇
- 案例研究 runtime.clone
- 运行时实现的系统调用清单
- 进一步阅读的参考文献
- 10.2 参与运行时的系统调用: Darwin 篇
- libcCall 调用
- 案例研究: runtime.pthread_create
- 运行时实现的 libc 调用清单
- 10.3 cgo
- 入口
- cgocall
- 原理概述: Go 调用 C
- 实际代码
- cgocallbackg
- 原理概述: C 调用 Go
- 实际代码
- 总结
- 进一步阅读的参考文献
- 10.4 WebAssembly
- 10.5 系统调用包 syscall
- 由运行时提供支持的系统调用
- 通用型系统调用
runtime.entersyscall
和runtime.exitsyscall
- 返回的错误处理
- 进一步阅读的参考文献
- 11.1
go
- 11.2
defer
- 11.3
panic
与recover
- gopanic 和 gorecover
- 总结
- 11.4
map
- 11.5
chan
与select
- channel 的本质
- 基本使用
- channel 的创生
- 向 channel 发送数据
- 从 channel 接收数据
- channel 的死亡
- select 的本质
- 随机化分支
- 发送数据的分支
- 接收数据的分支
- channel 的 lock-free 实现
- 总结
- 进一步阅读的参考文献
- channel 的本质
- 11.6
interface{}
- 11.7 slice
- 11.8 string
- 11.9 运行时类型系统与 reflect 包
- [12.1 泛型的历史及其演化]
- [12.2 泛型的实现]
- 15.1 错误处理的历史及其演化
error
类型的历史形态- 错误处理的基本策略
- 哨兵错误
- 自定义错误
- 隐式错误
pkg/errors
的错误处理原语- 争议
- 对错误处理进行改进的反馈
- check/handle 关键字
- 内建函数 try
- 16.2
errors
包与错误检查- 错误检查
- Unwrap
- As 与 Is
- fmt.Errorf 中的
%w
- 错误检查
- 16.1
sync.Pool
- 底层结构
- Get
- Put
- 偷取细节
- pin 和 pinSlow
- getSlow
- 缓存的回收
- poolChain
- poolChain 的 popHead, pushHead 和 popTail
- poolDequeue 的 popHead, pushHead popTail
- noCopy
- 总结
- 进一步阅读的参考文献
- 16.2
sync.Once
- 16.3
sync.Map
- 结构
- Store
- Load
- Delete
- Range
- LoadOrStore
- 总结
- 16.4
sync.WaitGroup
- 结构
- Add/Done
- Wait
- 16.5
sync.Mutex
- 16.6
sync.Cond
- 结构
- copyChecker
- Wait/Signal/Broadcast
- notifyList
- 16.7
sync/atomic.*
- 公共包方法
- atomic.Value
- atomic.CompareAndSwapPointer
- 运行时实现
- 原子操作的内存模型
- 进一步阅读的参考文献
- 公共包方法