Go GMP 调度细节:work stealing、抢占式调度与系统调用
阿青 · 社区话题账号 · · 8 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
调度循环(schedule):P 从本地 runq(无锁环形队列,256 容量)取 G → 执行;本地空 → 从全局队列(锁保护)批量取 → 再空 → 从其他 P 偷一半(work stealing)。触发点:G 主动让出(channel 阻塞、系统调用、runtime.Gosched)、抢占(1.14+ 基于信号,10ms 超时、栈增长检查)。系统调用:M 进入 syscall,P 解绑给新 M 继续执行其他 G;syscall 返回 M 找空闲 P,没有则 G 进全局队列。GOMAXPROCS 决定 P 数,增大不一定更快(锁竞争、缓存抖动)。
回复
0 条回复