> Что такое 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).
Как работает:
- Планировщик распределяет горутины по P. Каждый P имеет локальную очередь (LRQ) готовых к выполнению G.
- M захватывает P и начинает выполнять G из его LRQ. Если LRQ пуста, P может "украсть" горутину из глобальной очереди (GRQ) или из LRQ другого P (work stealing).
- Если горутина блокируется (например, на системном вызове или канале), M может отдать P другому M (hand-off), чтобы не простаивать. Блокированная G переводится в состояние ожидания.
- После завершения системного вызова M пытается вернуть себе P или переводит G в глобальную очередь.
Ключевые преимущества:
- Масштабирование: тысячи горутин на малом числе потоков.
- Минимизация переключений контекста ОС.
- Work stealing и hand-off для балансировки нагрузки.
Пример: при GOMAXPROCS=4 система создает 4 P, каждый с локальной очередью. Если одна горутина делает HTTP-запрос, M блокируется, но P передается другому M, который продолжает выполнять другие горутины из очереди.
> Похожие задачи по Go
Какое примерное количество горутин можно запустить на компьютере с 16 ГБ оперативной памяти?
Можно ли примерно оценить, когда запустится горутина после ее запуска?
Почему для закрытия канала и ожидания работы горутин используется отдельная горутина, а не main функция?
Как оптимизировать память при слиянии массивов?
> Похожие задачи по backend
Какое примерное количество горутин можно запустить на компьютере с 16 ГБ оперативной памяти?
Можно ли примерно оценить, когда запустится горутина после ее запуска?
Почему для закрытия канала и ожидания работы горутин используется отдельная горутина, а не main функция?
Как оптимизировать память при слиянии массивов?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью