🔴 Сложный · 3 очк. Go runtime
Как Go runtime обрабатывает сетевые операции, не блокируя потоки ОС?
A Каждая горутина получает отдельный поток для I/O
B Через netpoller: сетевые операции переводятся в неблокирующий режим (epoll/kqueue), горутина паркуется без блокировки потока ОС
C Go использует только блокирующий I/O
D Через пул потоков для I/O операций
Объяснение вопроса

Netpoller - компонент Go runtime, который превращает блокирующий сетевой API в неблокирующий:

// Разработчик пишет синхронный код:
conn, _ := net.Dial("tcp", "example.com:80")
data := make([]byte, 1024)
n, _ := conn.Read(data) // "блокируется"

// Под капотом Go runtime:
// 1. Сокет переводится в неблокирующий режим
// 2. При Read(): если данных нет - горутина паркуется
// 3. Сокет регистрируется в epoll/kqueue
// 4. Поток ОС (M) освобождается для других горутин
// 5. Когда данные приходят - epoll уведомляет runtime
// 6. Горутина разпарковывается и продолжает работу

Платформенные механизмы:

  • Linux: epoll - O(1) мониторинг тысяч сокетов
  • macOS/BSD: kqueue
  • Windows: IOCP (I/O Completion Ports)

Благодаря netpoller один поток ОС может обслуживать тысячи горутин с сетевыми операциями. Это ключ к высокой производительности Go серверов.

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