Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: goroutine, scheduler, concurrency, gmp

Как работает планировщик задач в Go (кооперативная vs вытесняющая многозадачность)?

Вопрос проверяет понимание работы планировщика Go (Goroutine Scheduler) и различий между кооперативной и вытесняющей многозадачностью.

Короткий ответ

Go использует вытесняющую многозадачность на уровне потоков ОС, но кооперативную внутри самих горутин. Планировщик Go (GMP-модель) распределяет горутины по потокам (M), переключая их при блокировках (I/O, каналы) или через вызов runtime.Gosched().

Длинный ответ

1. Кооперативная vs вытесняющая многозадачность

  • Кооперативная (Cooperative):

    • Горутина сама передаёт управление (например, при блокировке).

    • Плюс: меньше накладных расходов.

    • Минус: если горутина не отдаст управление, другие "зависнут".

  • Вытесняющая (Preemptive):

    • ОС принудительно переключает потоки.

    • В Go это работает на уровне потоков (M), но не горутин.

2. GMP-модель в Go

  • G (Goroutine) – легковесный поток.

  • M (Machine) – поток ОС (1 M = 1 ядро CPU).

  • P (Processor) – контекст выполнения (управляет очередью горутин).

3. Когда горутина передаёт управление?

  • При блокирующих операциях (каналы, системные вызовы).

  • При вызове runtime.Gosched().

  • Каждые ~10 мс (планировщик проверяет, не пора ли переключиться).

Пример:

func main() {
    go func() {
        for {
            runtime.Gosched() // Явно передаём управление
        }
    }()
}

Вывод:
Go сочетает эффективность кооперативной модели с надёжностью вытеснения на уровне потоков.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Golang

    Golang

Ключевые слова

#goroutine

#scheduler

#concurrency

#gmp

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.