Go面试核心考点之GMP调度器源码级深度解析

Go面试核心考点之GMP调度器源码级深度解析 Go面试核心考点之GMP调度器源码级深度解析文章导语GMP调度器是Go面试中最高频的考点之一。面试官不会满足于G是goroutineM是线程P是处理器这样的浅层回答。本文从源码级别剖析GMP调度的完整机制助你面试不虚。一、GMP核心结构// G: goroutinetypegstruct{stack stack// 栈内存m*m// 当前绑定的Msched gobuf// 调度信息(sp/pc)atomicstatusuint32// G状态}// M: machine (OS线程)typemstruct{g0*g// 调度goroutinecurg*g// 当前运行的Gp puintptr// 绑定的P}// P: processor (逻辑处理器)typepstruct{m muintptr// 绑定的Mrunqheaduint32runqtailuint32runq[256]guintptr// 本地运行队列runnext guintptr// 下一个优先运行的G}二、调度流程1. M与P绑定后从P的runq获取G执行 2. runq为空→从全局队列取 3. 全局队列也为空→从其他P窃取(work stealing) 4. 仍为空→M进入自旋或休眠三、工作窃取(Work Stealing)// findrunnable的核心流程// 1. 每61次调度检查一次全局队列防止全局队列饿死// 2. 检查P.runnext// 3. 从P.runq取// 4. 从全局队列取// 5. 从netpoller取// 6. 从其他P窃取四、面试高频问答Q: 何时发生调度A: 系统调用阻塞、channel操作、timeSleep、抢占调度Q: GOMAXPROCS的作用A: 决定同时运行的P的数量即并行度Q: 为什么要有PA: 解耦G和MM是OS资源G是用户态协程五、全文总结掌握GMP源码能让你在面试中降维打击。核心记忆点本地队列→全局队列→窃取→netpoller→休眠。参考文献Go源码 runtime/proc.goGo调度器设计文档《Go语言设计与实现》调度器章节