До Go 1.14 планировщик был кооперативным — горутина отдавала управление только при вызове функции или I/O. Если горутина крутила пустой цикл for {}, она блокировала весь поток и другие горутины на этом M голодали.
В Go 1.14 добавили асинхронную preemption на основе сигналов. Рантайм шлёт сигнал SIGURG потоку ОС, тот прерывает горутину и ставит её обратно в очередь. Теперь даже tight loop без вызовов функций можно прервать.
Технически это работает так: sysmon (фоновый мониторинг) замечает, что горутина бежит дольше 10ms, и помечает её для preemption. При следующем safe point или через сигнал горутина приостанавливается. Это критично для честного распределения CPU между горутинами и для работы GC, которому нужно остановить все горутины (STW).