Runtime
Runtime языка Go — это ядро инфраструктуры для выполнения программ Go. Он отвечает за управление выделением памяти программы, сборку мусора, планирование goroutine, системный мониторинг и другие ключевые функции. В отличие от других языков, runtime Go тесно интегрирован с пользовательским кодом, что позволяет Go достичь эффективного конкурентного программирования и автоматического управления памятью.
Основные компоненты
Runtime Go в основном состоит из следующих основных компонентов:
Планировщик GMP
Планировщик GMP — это один из самых основных компонентов runtime Go, отвечающий за разумное планирование большого количества goroutine на ограниченных системных потоках. GMP представляет:
- G (Goroutine): Корутина, лёгкий поток Go
- M (Machine): Системный поток, поток выполнения на уровне операционной системы
- P (Processor): Процессор, содержит ресурсы, необходимые для выполнения кода Go
Дизайн планировщика GMP позволяет Go эффективно поддерживать тысячи конкурентных goroutine, что является краеугольным камнем высокой конкурентности языка Go.
Аллкатор памяти
Аллкатор памяти Go отвечает за управление выделением памяти кучи. Его дизайн находится под глубоким влиянием TCMalloc от Google. Основные функции включают:
- Многоуровневый дизайн кэша для уменьшения конкуренции блокировок
- Различные стратегии выделения на основе размера объекта
- Автоматически решает, выделяются ли объекты в стеке или куче
Аллкатор памяти тесно работает со сборщиком мусора для достижения эффективного управления памятью.
Сборщик мусора
Go использует алгоритм Concurrent Mark-Sweep для сборки мусора. Основные функции:
- Трёхцветный алгоритм маркировки
- Технология write barrier для конкурентной сборки
- Низкая задержка, время STW в большинстве случаев ниже 100 микросекунд
Сборщик мусора Go был оптимизирован на протяжении лет, чтобы соответствовать требованиям к производительности большинства бизнес-сценариев.
Системный монитор
Системный монитор (sysmon) — это независимый поток мониторинга, отвечающий за:
- Вытеснение долго работающих goroutine
- Проверку, нужно ли запускать сборку мусора
- Мониторинг состояния системы и внесение соответствующих корректировок
Он работает непрерывно в фоновом режиме, обеспечивая стабильную работу программ Go.
Рекомендации по изучению
Рекомендуемый порядок изучения знаний о runtime:
- Сначала изучите Планировщик GMP, поймите механизм планирования goroutine
- Затем изучите Аллкатор памяти, поймите, как выделяется память
- Затем изучите Сборщик мусора, поймите, как перерабатывается память
- Наконец изучите Системный монитор, поймите механизм фонового мониторинга runtime
