Как устроен стейт планировщика

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

Ответ

В Go планировщик (scheduler) управляет горутинами, используя три основных состояния:

  1. Runnable - горутина готова к выполнению, но ожидает свободного потока (M)
  2. Running - горутина выполняется в потоке
  3. Waiting - горутина заблокирована (I/O, каналы, мьютексы)

Планировщик использует очередь runqueue (глобальную и локальные для каждого P) для хранения Runnable-горутин. Каждый логический процессор (P) выбирает следующую горутину по алгоритму work-stealing.

Пример перехода состояний:

func worker() {
    // Running -> Waiting (блокировка)
    time.Sleep(time.Second) 
    // Waiting -> Runnable
    // Runnable -> Running (когда планировщик выделит поток)
}