> Как устроена многозадачность в Go и какой механизм планирования используется (Go)

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

Компании: ЦУМ

Стек: Go

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

В Go многозадачность основана на модели goroutine - легковесных потоков выполнения, которые управляются собственным планировщиком языка, а не операционной системой. Планировщик Go реализует кооперативную многозадачность (с возможностью вытеснения начиная с Go 1.14) и использует механизм M:N scheduling, где M goroutine отображаются на N потоков ОС.

Ключевые компоненты планировщика:

  • G (goroutine) - единица выполнения.
  • M (machine) - поток ОС, который выполняет goroutine.
  • P (processor) - логический процессор, который управляет очередью goroutine и связывает G с M.

Планировщик работает по принципу work-stealing: каждый P имеет локальную очередь goroutine. Если очередь пуста, P может "украсть" работу из очереди другого P или из глобальной очереди. Это обеспечивает балансировку нагрузки и эффективное использование ядер.

Вытеснение происходит в точках, где goroutine делает системные вызовы, операции ввода-вывода, блокировки каналов или явно вызывает runtime.Gosched(). С Go 1.14 добавлено асинхронное вытеснение через сигналы ОС, что предотвращает "залипание" долгих вычислений без точек кооперации.

Пример работы:

GO
func main() {
go func() {
fmt.Println("goroutine")
}()
time.Sleep(time.Second) // планировщик переключает контекст
}

Здесь go создаёт новую goroutine, которая помещается в очередь P. Планировщик автоматически распределяет выполнение между доступными M, обеспечивая параллелизм на многоядерных системах.

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

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