🔴 Сложный · 3 очк. Go runtime
Что такое work stealing в планировщике Go?
A Горутина забирает ресурсы у другой горутины
B Когда у процессора (P) заканчиваются горутины в локальной очереди, он крадет половину горутин из очереди другого P
C Планировщик останавливает все горутины для перебалансировки
D Механизм приоритизации горутин
Объяснение вопроса

Work stealing - алгоритм балансировки нагрузки в планировщике Go (модель GMP):

// Каждый P (logical processor) имеет:
// - Локальную очередь горутин (до 256)
// - Доступ к глобальной очереди

// Порядок поиска работы для P:
// 1. Взять горутину из своей локальной очереди
// 2. Если пуста - проверить глобальную очередь
// 3. Если пуста - проверить netpoller
// 4. Если пуста - украсть половину из очереди случайного P

Почему это эффективно:

  • Локальность: большинство горутин выполняются на том же P, где были созданы (cache-friendly)
  • Без глобальной блокировки: каждый P работает со своей очередью без мьютекса
  • Балансировка: если один P перегружен, другие помогают, забирая часть работы
  • Крадется половина, а не одна горутина - амортизация накладных расходов

Work stealing - стандартный алгоритм для планировщиков (используется также в Java ForkJoinPool, Tokio в Rust).

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.