> В чем отличие планировщика Go от планировщика операционной системы (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Ozon
Стек: Go
> Пример ответа
Основное отличие - в уровне абстракции и модели выполнения. Планировщик ОС управляет потоками (kernel threads) на уровне ядра, распределяя их по физическим ядрам процессора. Он работает с системными вызовами, прерываниями и контекстом переключения, который является дорогим (сохранение/восстановление регистров, переключение стека ядра, смена адресного пространства).
Планировщик Go (Goroutine Scheduler) работает на уровне пользовательского пространства и управляет горутинами - легковесными потоками выполнения. Он реализован в рантайме Go и использует модель M:N, где M горутин мультиплексируются на N потоков ОС. Ключевые отличия:
-
Стоимость переключения: переключение между горутинами значительно дешевле, чем между потоками ОС, так как не требует системных вызовов и сохраняет только минимальный контекст (регистры, стек горутины).
-
Кооперативность: планировщик Go не вытесняет горутины по таймеру (до Go 1.14), а полагается на точки приостановки (ввод-вывод, системные вызовы, каналы,
runtime.Gosched()). Начиная с Go 1.14 добавлена асинхронная вытесняемость для предотвращения длительных вычислений. -
Локальность: планировщик Go использует локальные очереди горутин для каждого потока (P - processor), что уменьшает конкуренцию и улучшает кэш-локальность. Планировщик ОС оперирует глобальными очередями потоков.
-
Масштабирование: горутины позволяют запускать тысячи и миллионы параллельных задач без значительного оверхэда, в то время как потоки ОС ограничены ресурсами ядра (обычно тысячи).
Таким образом, планировщик Go оптимизирован для высококонкурентных приложений с большим количеством легковесных задач, минимизируя накладные расходы на переключение контекста и управление памятью.
> Похожие задачи по backend
Почему в Go нет гарантии порядка выполнения горутин
Почему вывод в цикле с горутинами в Go не гарантирован по порядку
Можно ли использовать map одновременно из нескольких горутин без синхронизации
Что происходит при чтении из пустого буферизованного канала в Go и записи в него другой горутиной
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью