Go 原理
2023-06-16 14:36:53 0 举报
AI智能生成
登录查看完整内容
Go
作者其他创作
大纲/内容
Go 原理
进程与线程
发展历史
单线程调度器
多线程调度器
工作窃取
G-M-P
任务窃取调度器
基于协作(1.2)
基于信号(1.14)
抢占式调度器
非均匀内存访问调度器
设计原理
runtime.g 结构
核心状态机
状态
G:Goroutine
runtime.m 结构
M:操作系统线程
runtime.p 结构
P:处理器
数据结构
初始化
更新处理器
初始化与启动
初始化结构体
运行队列
调度信息
创建 Goroutine
调度循环
触发路径
主动挂起
准备工作
快速路径
缓慢路径
恢复工作
系统调用
协作式调度
触发调度
线程生命周期
线程管理
调度器
状态协程
何时委托?
同步调用
回调函数
异步调用
由调用者控制并发
生命周期管理
协程(Goroutine)
数据传递
管理应用生命周期
基本规则
多通道选择
通道(Channel)
Add 和 Done
Wait
实现细节
使用须知
等待组(WaitGroup)
race detector
申请者释放
非公平竞争
自旋锁
避免饥饿
TryLock
获取 Waiter 数量等指标
线程安全队列
扩展功能
互斥锁(Mutex)
应用实例
RLock 和 RUnlock
Lock
Unlock
读写锁(RWMutex)
锁(Lock)
阻塞队列
条件(Cond)
单例(Once)
Get
Put
内存泄漏
内存浪费
Work Pool
对象池(Pool)
WithValue
WithCancel
WithTimeout
WithDeadline
管理 Goroutine 生命周期
参数传递
级联取消
超时调用
作用域
上下文(Context)
Add
CAS
Load 和 Store
Value
基本使用
撕裂写
内存屏障
底层原理
无锁队列
功能扩展
原子操作(Atomic)
P/V 操作
Acquire 和 Release
标准库实现
Channel 实现
Worker Pool
信号量(Semaphore)
顺序执行
单例模式
对象池
对象缓存
限流器
互斥锁
单向通道
异步任务
周期任务
取消任务
定时任务
流式管道
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)
首次适应(First-Fit)
循环首次适应(Next-Fit)
最优适应(Best-Fit)
隔离适应(Segregated-Fit)
选择内存块
空闲链表分配器(Free-List Allocator)
分配方法
对象大小
多级缓存
分级分配
线性内存(<= 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 条评论
回复 删除
下一页