G (goroutine) - горутина. M (machine) - поток ОС. P (processor) - логический процессор, у каждого есть локальная очередь горутин (run queue). Один P привязан к одному M; M выполняет G из очереди своего P.
Если у P очередь пуста, он может "украсть" половину горутин из очереди другого P. Так нагрузка распределяется между ядрами.
M1-P1 -> [G, G, G] M2-P2 -> [G, G]
| |
выполнение выполнение
Глобальная очередь горутин (редко используется)
Локальные очереди уменьшают конкуренцию за общую очередь и улучшают кеш-локальность.