Горутины выигрывают у потоков ОС по нескольким параметрам:
1. Память: горутина ~2-8 KB (стек растёт), поток ОС ~1-8 MB фиксированно 2. Создание: горутина — наносекунды, поток — микросекунды (syscall) 3. Переключение: горутины переключаются в userspace без syscall, потоки — через ядро 4. Количество: миллионы горутин vs тысячи потоков
Go scheduler реализует M:N модель: M горутин на N потоков ОС. Используется work-stealing: если один поток простаивает, он забирает горутины у загруженного.
Горутины кооперативно-преемптивные: точки вытеснения в вызовах функций и с Go 1.14 — асинхронная преемптивность через сигналы.