Ответ
В Go используются алгоритмы планирования горутин, основанные на work-stealing и cooperative scheduling.
-
Work-stealing (M:N планирование):
- Каждый поток (M) выполняет горутины (N) из своей локальной очереди.
- Если очередь пуста, поток "ворует" задачи у других потоков.
-
Cooperative scheduling:
- Горутины добровольно отдают управление (через
runtime.Gosched(), блокирующие вызовы или системные вызовы).
- Горутины добровольно отдают управление (через
-
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).