Go 调度相关的四个基本单元是 g、m、p、schedt。g 是协程任务信息单元,m 实际执行体,p 是本地资源池和 g 任务池,schedt 是全局资源池和任务池。这里的 m 对应一个 os 线程,所以整个执行逻辑简单来说就是 "某个 os 线程 m 不断尝试拿资源 p 并找任务 g 执行,没有可执行 g 则睡眠,等待唤醒并重复此过程",这个执行逻辑加上 sysmon 系统线程的定时抢占逻辑实际上就是整个宏观的调度逻辑了 (其中穿插了很多唤醒 m、system goroutine 等等复杂的细节),而找协程任务 g 的过程占据了其中大部分。g 的主要来源有本地队列、全局队列、其他 p 的本地队列、poller(net 和 file),以及一些 system goroutine 比如 timerproc、bgsweeper、gcMarkWorker、runfinq、forcegchelper 等。