搜索

pdf文档 2.2.3 Go语言的抢占式调度

7.43 MB 44 页 2 下载 192 浏览 0 评论 0 收藏
所属分类: 后端开发 / Go
语言 格式 评分
中文(简体)
.pdf
3
摘要
文档详细讲解了Go语言的抢占式调度机制,包括调度循环的实现、抢占的触发时机以及新旧版本的抢占实现。内容涉及Goroutine的调度、M的创建与管理、全局和本地运行队列的处理,以及信号式抢占和GC中的栈扫描抢占流程。文档还讨论了在不同场景下抢占的实现方式及其对系统性能的影响。
AI总结
### Go语言的抢占式调度总结 本文主要介绍了Go语言的抢占式调度机制,重点围绕GMP(Goroutine、Machine、Process)模型、调度循环的实现、抢占式调度的触发时机以及GC(垃圾收集)与抢占式调度的关系进行了详细阐述。以下是核心内容的总结: --- #### 1. **GMP模型与调度循环** - **GMP模型**:Go语言通过GMP模型实现轻量级线程支持,Goroutine是用户级线程,由Machine(M)映射到OS线程,并通过Process(P)管理核心资源。 - **调度循环**:调度循环负责在M和P之间分配Goroutine,确保Goroutine在不同的M之间迁移执行,实现任务调度。 --- #### 2. **抢占式调度的实现** - **老版本抢占实现**:通过信号式抢占和栈扫描实现。当Goroutine运行时间过长(如超过10ms),GC或后台监控(sysmon)会触发抢占。 - **GC触发**:GC启动时会暂停运行的Goroutine,扫描栈并恢复。 - **栈扫描**:通过suspendG和resumeG函数实现对Goroutine栈的扫描。 - **新版本抢占实现**:引入了更高效的抢占机制,通过设置预emption标志(preempt flag)和后台监控(sysmon)实现。 - **预emption标志**:当标志被设置时,调度器会暂停当前Goroutine并将其加入全局运行队列。 - **sysmon监控**:sysmon负责监控Goroutine的运行时间,若超过阈值则触发抢占。 --- #### 3. **抢占式调度的触发时机** - **GC触发**:在GC的STW(Stop The World)阶段,调度器会暂停运行的Goroutine,完成标记和清理工作。 - **后台监控**:sysmon负责监控Goroutine的运行时间,若超过阈值则触发抢占。 - **信号处理**:在处理信号时,调度器会切换到特定栈(如gsignal栈)以确保信号处理优先级。 --- #### 4. **调度循环的逻辑** - **本地运行队列与全局运行队列**:调度器通过本地运行队列(local run queue)和全局运行队列(global run queue)管理Goroutine的执行。 - **调度循环流程**: 1. 从本地运行队列或全局运行队列中获取Goroutine。 2. 切换到Goroutine的栈并执行。 3. 在需要抢占时,将当前Goroutine暂停并放入全局运行队列。 --- #### 5. **GC与抢占式调度的关系** - 在GC的标记和清除阶段,调度器会暂停运行的Goroutine,确保GC操作顺利完成。 - GC过程中,若Goroutine运行时间过长,调度器会触发抢占,以保证GC的效率和系统的响应性。 --- #### 6. **信号式抢占** - **信号处理**:在处理信号时,调度器会切换到特定栈(如gsignal栈),确保信号处理优先级高于用户逻辑。 - **调度切换**:在执行调度代码时,调度器会切换到m.g0栈,确保调度逻辑的正确性。 --- #### 7. **当前Go语言的挑战** - 虽然新版本的抢占式调度机制有所改进,但仍存在一些问题,例如旧版本的效率问题以及在复杂场景下的调度优化空间。 --- ### 总结 Go语言的抢占式调度机制通过GMP模型和调度循环实现了高效的Goroutine调度。老版本通过栈扫描和GC触发抢占,而新版本通过预emption标志和后台监控(sysmon)优化了抢占逻辑。GC和信号处理是抢占式调度的重要触发场景,确保了系统的高效性和响应性。
P1
P2
P3
P4
P5
P6
P7
下载文档到本地,方便使用
- 可预览页数已用完,剩余 37 页请下载阅读 -
文档评分
请文明评论,理性发言.