Каков алгоритм поиска готовых к выполнению горутин у планировщика Go, если локальная и глобальная очереди пусты?

Ответ

Когда рабочий поток (M), связанный с процессором (P), не находит горутин в своей локальной и глобальной очередях, он не простаивает, а активно ищет работу, следуя чёткому алгоритму:


  1. Проверка сетевого поллера (Netpoller).

    Планировщик проверяет, нет ли горутин, которые были заблокированы на сетевых операциях ввода-вывода и теперь готовы к выполнению. Это частый источник новых задач в веб-серверах.



  2. Воровство работы (Work Stealing).

    Если сетевой поллер пуст, процессор (P) пытается «украсть» половину горутин из локальной очереди другого, случайно выбранного процессора. Это эффективный механизм балансировки нагрузки между ядрами CPU.



  3. Повторная проверка.

    После попытки воровства планировщик может снова проверить глобальную очередь и сетевой поллер, так как за это время там могли появиться новые задачи.



  4. Переход в режим ожидания.

    Если после всех этих шагов работа так и не найдена, рабочий поток (M) отсоединяется от своего процессора (P) и может быть переведён операционной системой в спящий режим до тех пор, пока не появится новая работа (например, из-за системного вызова или другой горутины).