Go 原理
2023-06-16 14:36:53 0 举报
AI智能生成
Go
作者其他创作
大纲/内容
调度器
进程与线程
设计原理
发展历史
单线程调度器
多线程调度器
任务窃取调度器
工作窃取
G-M-P
抢占式调度器
基于协作(1.2)
基于信号(1.14)
非均匀内存访问调度器
数据结构
G:Goroutine
runtime.g 结构
状态
核心状态机
M:操作系统线程
runtime.m 结构
P:处理器
runtime.p 结构
初始化与启动
初始化
更新处理器
创建 Goroutine
初始化结构体
运行队列
调度信息
调度循环
触发调度
触发路径
主动挂起
系统调用
准备工作
恢复工作
快速路径
缓慢路径
协作式调度
线程管理
线程生命周期
并发编程
协程(Goroutine)
状态协程
何时委托?
由调用者控制并发
同步调用
异步调用
回调函数
生命周期管理
通道(Channel)
数据传递
管理应用生命周期
多通道选择
基本规则
等待组(WaitGroup)
实现细节
Add 和 Done
Wait
使用须知
锁(Lock)
互斥锁(Mutex)
race detector
实现细节
申请者释放
非公平竞争
自旋锁
避免饥饿
使用须知
扩展功能
TryLock
获取 Waiter 数量等指标
线程安全队列
读写锁(RWMutex)
应用实例
实现细节
RLock 和 RUnlock
Lock
Unlock
使用须知
条件(Cond)
实现细节
扩展功能
阻塞队列
单例(Once)
实现细节
使用须知
对象池(Pool)
实现细节
Get
Put
使用须知
内存泄漏
内存浪费
Work Pool
上下文(Context)
实现细节
WithValue
WithCancel
WithTimeout
WithDeadline
管理 Goroutine 生命周期
使用须知
参数传递
级联取消
超时调用
作用域
原子操作(Atomic)
基本使用
Add
CAS
Load 和 Store
Value
底层原理
撕裂写
内存屏障
功能扩展
无锁队列
使用须知
信号量(Semaphore)
P/V 操作
标准库实现
Acquire 和 Release
Channel 实现
功能扩展
Worker Pool
使用须知
并发设计模式
顺序执行
单例模式
对象池
对象缓存
限流器
通道
互斥锁
单向通道
异步任务
周期任务
取消任务
定时任务
流式管道
Fan In / Fan Out
All Done
Or Done
流水线模式
Map Reduce
信号通知
内存模型
先行发生规则
初始化零值
写入大于单机机器字的变量
同步场景
初始化
Goroutine 创建
Goroutine 销毁
Channel 通信
Channel 关闭
缓冲 / 无缓冲 Channel
实例
锁
Once
错误的同步
大纲
编译原理
编译过程
词法分析
语法分析
类型检查
中间代码生成
机器码生成
编译优化
编译流程
逃逸分析
内联优化
静态单赋值
公共子表达式消除
循环不变式外提
尾递归优化
分支预测优化
内存管理
内存分配
堆和栈
初始化
分配器
堆管理
缓存管理
自由列表
活跃对象列表
分配缓存
并发模型
分配算法
内存复制
优化
使用栈分配
使用零拷贝
避免碎片
预分配
内存池
缓存
避免使用无用的缓存
增量预分配
内存释放
手动释放
自动释放
标记 - 清除
堆和栈
标记过程
清除过程
分代收集
写屏障
并发清除
并发标记
标记终止
清除
增量式收集
任务分解
并发标记
增量式清除
源码解析
调度器
Goroutine
调度模型
非抢占式调度
M 和 G 的关系
P 的作用和状态转换
全局队列和本地队列
手工触发和自动触发
优化与扩展
GOMAXPROCS
抢占调度和时间片
本地队列大小和全局队列大小
自适应和负载均衡
同步与通信
内存管理
内存分配
设计原理
分配方法
线性分配器(Sequential Allocator,Bump Allocator)
空闲链表分配器(Free-List Allocator)
选择内存块
首次适应(First-Fit)
循环首次适应(Next-Fit)
最优适应(Best-Fit)
隔离适应(Segregated-Fit)
分级分配
对象大小
多级缓存
虚拟内存布局演进
线性内存(<= 1.10)
稀疏内存(> 1.10)
地址空间
地址空间状态
None
Reserved
Prepared
Ready
状态转换方法
runtime.sysAlloc
runtime.sysFree
runtime.sysReserve
runtime.sysMap
runtime.sysUsed
runtime.sysUnused
runtime.sysFault
内存管理组件
内存管理单元:runtime.mspan
页和内存
状态
跨度类
线程缓存:runtime.mcache
初始化
替换
微分配器
中心缓存:runtime.mcentral
内存管理单元
扩容
页堆:runtime.mheap
初始化
内存管理单元
扩容
内存分配
微对象
小对象
大对象
垃圾收集
演进过程
并发垃圾收集(1.5)
回收堆目标(1.5)
混合写屏障(1.8)
设计原理
背景
标记清除
标记阶段
清除阶段
三色抽象
工作流程
悬挂指针
内存屏障
三色不变性
插入写屏障
标记过程
存在问题
删除写屏障
标记过程
增量和并发
背景
增量收集器
并发收集器
实现原理
具体流程
清理终止阶段
标记阶段
标记终止阶段
清理阶段
全局变量
runtime.gcphase
runtime.gcBlackenEnabled
runtime.gcController
runtime.gcpercent
runtime.writeBarrier
runtime.worldsema
runtime.work
触发时机
后台触发
手动触发
自动触发
触发条件
存活计算
垃圾收集启动
暂停与恢复程序
后台标记模式
并发扫描与标记辅助
工作池
扫描对象
写屏障
标记辅助
标记终止
内存清理
栈内存管理
设计原理
寄存器
线程栈
逃逸分析
栈内存空间
分段栈
连续栈
栈操作
栈初始化
栈分配
栈扩容
栈缩容
数据结构
数组 (Array)
内存布局
值类型
固定大小
索引访问
源码解析
初始化
上限推导
语句转换
访问和赋值
编译期判断
运行时判断
赋值和更新
切片(Slice)
底层数组
切片结构
切片操作
动态扩容
内存管理
源码解析
数据结构
初始化
下标
字面量
关键字
访问元素
追加元素
切片扩容
计算容量
内存对齐
分配内存和拷贝
拷贝切片
映射 (Map)
哈希表
哈希函数
负载因子
哈希冲突
开放寻址法
装载因子
拉链法
装载因子
并发安全
源码解析
数据结构
哈希桶
初始化
字面量
运行时
读写操作
访问
写入
扩容
删除
字符串
源码解析
数据结构
解析
拼接
类型转换
结构体(Struct)
内存布局
方法
嵌入
0 条评论
下一页