> Как планировщик Go распределяет goroutine между потоками (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: InDrive, YADRO, VK

Стек: Go

> Пример ответа

Планировщик Go (GMP-модель) распределяет goroutine между потоками ОС через три ключевых компонента: G (goroutine), M (machine - поток ОС) и P (processor - логический процессор). Каждый P имеет локальную очередь готовых к выполнению goroutine (runqueue), а также существует глобальная очередь. Планировщик использует стратегию work-stealing: когда M, связанный с P, завершает выполнение всех goroutine из своей локальной очереди, он пытается «украсть» половину goroutine из очереди другого P. Если и это не удаётся, M обращается к глобальной очереди или к сетевому поллеру (netpoller) для обработки заблокированных на вводе-выводе goroutine. При системных вызовах, блокирующих поток (например, файловый I/O), планировщик может отсоединить M от P и передать P другому свободному M, чтобы не простаивать процессор. Количество P по умолчанию равно GOMAXPROCS (обычно числу ядер CPU), что ограничивает параллельное выполнение goroutine на уровне потоков ОС.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью