> Что такое GPM модель планировщика в Go и как она работает? (Go)

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

Компании: Aston

Стек: Go

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

GPM - это модель планировщика Go, основанная на трех сущностях: G (goroutine), P (processor) и M (machine/thread). Она позволяет эффективно выполнять тысячи горутин на ограниченном числе потоков ОС.

  • G - легковесный поток (горутина), содержит стек, контекст и состояние (выполняется, ожидает и т.д.).
  • M - поток ОС, который выполняет код. Один M может работать только с одним P в данный момент.
  • P - логический процессор, управляющий очередью горутин (локальный runqueue). Количество P обычно равно GOMAXPROCS (по умолчанию - числу ядер CPU).

Как работает:

  1. Планировщик распределяет горутины по P. Каждый P имеет локальную очередь (LRQ) готовых к выполнению G.
  2. M захватывает P и начинает выполнять G из его LRQ. Если LRQ пуста, P может "украсть" горутину из глобальной очереди (GRQ) или из LRQ другого P (work stealing).
  3. Если горутина блокируется (например, на системном вызове или канале), M может отдать P другому M (hand-off), чтобы не простаивать. Блокированная G переводится в состояние ожидания.
  4. После завершения системного вызова M пытается вернуть себе P или переводит G в глобальную очередь.

Ключевые преимущества:

  • Масштабирование: тысячи горутин на малом числе потоков.
  • Минимизация переключений контекста ОС.
  • Work stealing и hand-off для балансировки нагрузки.

Пример: при GOMAXPROCS=4 система создает 4 P, каждый с локальной очередью. Если одна горутина делает HTTP-запрос, M блокируется, но P передается другому M, который продолжает выполнять другие горутины из очереди.

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

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