Какие знаешь алгоритмы планирования

«Какие знаешь алгоритмы планирования» — вопрос из категории Linux, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go используются алгоритмы планирования горутин, основанные на work-stealing и cooperative scheduling.

  1. Work-stealing (M:N планирование):

    • Каждый поток (M) выполняет горутины (N) из своей локальной очереди.
    • Если очередь пуста, поток "ворует" задачи у других потоков.
  2. Cooperative scheduling:

    • Горутины добровольно отдают управление (через runtime.Gosched(), блокирующие вызовы или системные вызовы).
  3. Preemptive scheduling (с Go 1.14):

    • Горутины могут быть вытеснены по таймеру (10 мс), чтобы избежать голодания.

Пример:

go func() { // Запуск горутины  
    for i := 0; i < 10; i++ {  
        fmt.Println(i)  
        runtime.Gosched() // Явное переключение  
    }  
}()  

Основные структуры:

  • G (горутина), M (поток ОС), P (процессор, контекст выполнения).
  • Global queue + Local queues (у каждого P).