G — горутина, M — машинный тред (OS thread), P — логический процессор (по умолчанию = GOMAXPROCS = кол-во ядер). P содержит локальную очередь горутин и mcache. M берёт P, достаёт G из его очереди и выполняет.
Если очередь пуста — M ворует горутины из очередей других P (work stealing). Если горутина заблокировалась на syscall — M отдаёт P другому треду, чтобы остальные горутины не простаивали.
Есть и глобальная очередь, но она проверяется редко (каждый 61-й тик). Эта модель даёт M:N планирование — множество горутин на меньшее число тредов.