Go runtime

11 вопросов

Внутреннее устройство Go: сборщик мусора (tri-color mark & sweep), escape analysis, модель GMP (Goroutine-Machine-Processor), стек горутин и GOMAXPROCS. Частые вопросы на senior-собеседованиях.

1 Какой алгоритм использует сборщик мусора (GC) в Go? 🟡 Средний
Ответ: B) Tri-color mark & sweep (трёхцветная маркировка)

Go использует concurrent tri-color mark & sweep. Объекты делятся на белые (кандидаты на удаление), серые (в процессе обработки) и чёрные (достижимые). GC работает конкурентно с программой, минимизируя stop-the-world паузы (обычно < 1 мс).

Подробнее →
2 Что определяет escape analysis в Go? 🟡 Средний
Ответ: B) Где выделить память: на стеке или в куче

Escape analysis при компиляции определяет, может ли переменная остаться на стеке или должна быть размещена в куче. Если переменная 'убегает' из функции (например, возвращается указатель), она размещается в куче. go build -gcflags='-m' покажет решения компилятора.

Подробнее →
3 Почему выделение памяти на стеке предпочтительнее кучи? 🟡 Средний
Ответ: B) Стек не требует сборки мусора и быстрее выделяет/освобождает

Стек: автоматическое выделение/освобождение при входе/выходе из функции без участия GC. Выделение - одна инструкция (сдвиг указателя стека). Куча требует аллокатора и GC для освобождения. В Go стек горутины растёт динамически (начинается с 2-8 КБ).

Подробнее →
4 С каким начальным размером стека создаётся горутина в Go? 🟡 Средний
Ответ: B) 2-8 КБ с динамическим ростом

Горутина начинает с ~2-8 КБ стека, который растёт/сжимается динамически. Поток ОС обычно занимает 1-8 МБ фиксированно. Поэтому можно создать миллионы горутин, но не миллионы потоков ОС. Это делает горутины очень дешёвыми в создании.

Подробнее →
5 Что определяет GOMAXPROCS? 🟡 Средний
Ответ: B) Число потоков ОС для одновременного исполнения Go-кода

GOMAXPROCS задаёт число P (logical processors) - максимум потоков, одновременно исполняющих Go-код. По умолчанию равно числу CPU ядер. Горутин может быть гораздо больше - планировщик мультиплексирует их на P потоков. Менять GOMAXPROCS обычно не нужно.

Подробнее →
6 Что определяет переменная окружения GOGC? 🟡 Средний
Ответ: B) Процент роста кучи относительно живых объектов, при котором запускается GC (по умолчанию 100)

GOGC=100 (default): GC запустится, когда куча вырастет на 100% от размера живых объектов после предыдущего цикла. GOGC=off отключает GC.

Подробнее →
7 Для чего используется GOMEMLIMIT (Go 1.19+)? 🟡 Средний
Ответ: B) Устанавливает мягкий лимит памяти; GC становится агрессивнее при приближении к лимиту

GOMEMLIMIT - мягкий лимит. GC учащается при приближении к нему, но не гарантирует, что лимит не будет превышен. Заменил паттерн memory ballast.

Подробнее →
8 Что такое GMP-модель в планировщике Go? 🔴 Сложный
Ответ: B) Goroutine, Machine (поток ОС), Processor (логический процессор)

G (Goroutine) - горутина, M (Machine) - поток ОС, P (Processor) - логический процессор с локальной очередью горутин. Каждый P привязан к одному M. Горутины из очереди P исполняются на M. Work stealing: если очередь P пуста, он ворует горутины у других P.

Подробнее →
9 Что такое memory ballast и зачем его использовали до Go 1.19? 🔴 Сложный
Ответ: A) Аллокация большого неиспользуемого массива, чтобы GC считал живую память больше и запускался реже

До GOMEMLIMIT аллоцировали большой []byte (ballast), чтобы GC считал живую память больше и запускался реже. GOMEMLIMIT решил проблему элегантнее.

Подробнее →
10 Как Go runtime обрабатывает сетевые операции, не блокируя потоки ОС? 🔴 Сложный
Ответ: B) Через netpoller: сетевые операции переводятся в неблокирующий режим (epoll/kqueue), горутина паркуется без блокировки потока ОС

Netpoller использует epoll (Linux) / kqueue (macOS) для мультиплексирования I/O. Горутина "блокируется" на чтении из сокета, но поток ОС освобождается для других горутин.

Подробнее →
11 Что такое work stealing в планировщике Go? 🔴 Сложный
Ответ: B) Когда у процессора (P) заканчиваются горутины в локальной очереди, он крадет половину горутин из очереди другого P

Work stealing: каждый P имеет локальную очередь горутин. Когда она пуста, P пытается украсть половину горутин из очереди другого P. Это обеспечивает равномерную загрузку процессоров.

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