2.2.3 Go语言的抢占式调度
7.43 MB
44 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
中文(简体) | .pdf | 3 |
摘要 | ||
文档探讨了Go语言的抢占式调度机制,包括协作式抢占和信号式抢占的实现过程。协作式抢占通过保存运行现场并切换到m.g0执行newstack实现,信号式抢占则通过系统调用tgkill向特定线程发送信号。文档还详细介绍了调度循环的实现和GMP模型的本质,并分析了不同版本Go语言中抢占式调度的实现变化。最后,文档指出了当前Go语言调度器在性能和优化方面存在的问题。 | ||
AI总结 | ||
《2.2.3 Go语言的抢占式调度》文档总结:
本文主要探讨了Go语言的抢占式调度机制,围绕GMP模型(Goroutine、M、P)展开,分为启动过程、调度循环、旧版本抢占实现、新版本抢占优化以及当前存在的问题进行详细阐述。
1. **启动过程**:
- Go程序启动后创建第一个线程m0,初始化全局数据结构。
- 获取CPU核心数,处理命令行参数。
- 初始化内置结构,开始执行用户主函数,进入调度循环。
2. **GMP的本质**:
- G:表示Goroutine,用户态轻量级线程。
- M:代表系统OS线程,可与P绑定。
- P:处理器,承担调度责任,维护Goroutine队列。
3. **旧版本协作式抢占**:
- **协作式抢占**:通过保存当前Goroutine上下文,切换到g0栈,执行调度循环,使用`gopreempt_m`函数将当前Goroutine放入全局队列。
- **信号式抢占**:通过系统调用`tgkill`向特定线程发送信号强制抢占。
4. **旧版本实现**:
- Morestack逻辑用于Goroutine栈扩展,在栈空间不足时触发。
- 切入点包括栈扩展、调度循环及函数返回时进行抢占。
5. **新版本实现**:
-减少抢占切入点,仅在特定位置抢占。
- 验证阶段增加可抢占标志,合理安排协作式抢占时机。
- 优化后性能提升显著。
6. **当前问题**:
- 系统调用路径的延迟问题。
- 窗口抢占难度较大,需权衡抢占时机。
- 克服轮询和优先级反转等困难。 |
P1
P2
P3
P4
P5
P6
P7
下载文档到本地,方便使用
- 可预览页数已用完,剩余
37 页请下载阅读 -
文档评分