pdf文档 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 页请下载阅读 -
文档评分
请文明评论,理性发言.