G = Goroutine(协程任务) M = Machine(内核线程) P = Processor(逻辑处理器,持有本地队列)。 点击「下一步」逐步观察调度器如何在全局队列 / 本地队列之间分发任务、执行 work stealing(工作窃取), 以及遇到阻塞系统调用时 M 与 P 如何解绑、重新绑定。演示固定 GOMAXPROCS = 4,简化了部分细节以突出核心机制。
🖱️ 把鼠标停留在任意 G / M / P 图形或队列区域上,会弹出它对应的 Go 运行时结构体(runtime.g / runtime.m / runtime.p / runtime.schedt)当前字段值。
⌨️ 快捷键:空格 暂停/播放 ← 上一步 → 下一步(自由体验模式下 → 为单步调度,没有"上一步")。
固定的 12 步剧本,用「上一步 / 下一步 / 自动播放」按顺序讲解一次典型调度过程。
这是一个真正会“跑”的迷你调度器:自己创建 goroutine、手动让某个正在运行的 G 陷入阻塞系统调用(syscall)或主动等待(park,如阻塞在 channel/mutex 上)、 调整 P 的数量(GOMAXPROCS),再开始自动调度或单步观察调度器如何应对。G/M/P 的方块颜色和右上角徽标会实时反映各自的调度状态(悬浮可查看对应结构体字段)。