Вопрос проверяет понимание работы планировщика Go и того, как runtime управляет блокирующими операциями.
Когда goroutine выполняет блокирующую операцию, она не блокирует поток целиком. Runtime переводит goroutine в состояние ожидания и может запустить другую goroutine на том же потоке. Когда операция завершается, goroutine возвращается в очередь выполнения. Это позволяет эффективно использовать ресурсы.
В Go блокирующая операция блокирует goroutine, но не обязательно системный поток.
Когда goroutine:
Читает из пустого канала.
Пишет в заполненный канал.
Ожидает mutex.
Ждет I/O.
Runtime:
Помечает goroutine как ожидающую (park).
Освобождает поток для выполнения других goroutine.
Когда ресурс становится доступным:
Runtime переводит goroutine в очередь выполнения (unpark).
Планировщик назначает ее на поток.
Это позволяет:
Запускать тысячи goroutine.
Не тратить потоки на ожидание.
Повышать производительность I/O-нагруженных систем.
При блокирующих операциях goroutine “засыпает”, а поток продолжает выполнять другие задачи, что делает модель конкурентности Go эффективной.