Runtime в Go — это система времени выполнения, которая управляет выполнением Go-программ. Она отвечает за:
- Планирование: Использует планировщик M:N, который связывает M легковесных горутин с N системными потоками ОС. Это позволяет эффективно использовать ядра процессора.
- Управление памятью: Реализует автоматический сборщик мусора (GC), который периодически высвобождает неиспользуемую память. GC в Go — Concurrent, Tri-color Mark-and-sweep, что позволяет ему работать одновременно с пользовательским кодом и сокращать паузы.
- Управление горутинами: Создание, выполнение, переключение контекста и завершение горутин. Горутины легче потоков ОС, их создание и переключение контекста менее затратно.
- Каналы (Channels): Реализует механизм синхронизации и обмена данными между горутинами. Каналы могут быть буферизованными или небуферизованными.
- Сетевые операции: Встроенные примитивы для работы с сетью, которые интегрированы с планировщиком.
- Системные вызовы: Абстрагирует взаимодействие с операционной системой.
Основные компоненты планировщика:
- M (Machine): Поток ОС.
- P (Processor): Логический процессор, представляющий контекст, в котором выполняются горутины (G). Каждый P имеет локальную очередь готовых к выполнению горутин (
runqueue
). Количество P по умолчанию равно runtime.NumCPU()
.
- **G (G