Ответ
Модель MPG — это основа планировщика горутин в Go, который эффективно распределяет огромное количество горутин по небольшому числу потоков операционной системы. Аббревиатура расшифровывается как:
- M (Machine): Поток операционной системы (OS Thread). Это реальный исполнитель, который работает на ядре процессора. В любой момент времени на одном ядре может выполняться только один поток M.
- P (Processor): Логический процессор, представляющий собой контекст для выполнения Go-кода. У каждого P есть своя локальная очередь готовых к выполнению горутин (G). Количество P по умолчанию равно количеству ядер CPU и регулируется переменной
GOMAXPROCS
. - G (Goroutine): Легковесный, управляемый Go, "поток". Горутины имеют небольшой стек, который может расти по мере необходимости. Это то, что мы создаем с помощью ключевого слова
go
.
Как это работает (упрощенно):
- Планировщик связывает M (поток ОС) с P (логическим процессором).
- M начинает выполнять горутины (G) из локальной очереди своего P.
- Если горутина G блокируется (например, на системном вызове или ожидании канала), M отсоединяется от P и остается заблокированным вместе с G.
- Планировщик находит другой (или создает новый) M и присоединяет его к тому же P, чтобы продолжить выполнение других горутин из очереди.
Ключевые особенности планировщика:
- Work-Stealing (Воровство работы): Если у одного P заканчиваются горутины в локальной очереди, он может "украсть" половину горутин из очереди другого, более загруженного P. Это обеспечивает равномерное распределение нагрузки.
- Эффективная обработка блокировок: Благодаря разделению M и P, блокировка одной горутины на системном вызове не останавливает выполнение других горутин, готовых к работе.
- Глобальная очередь: Помимо локальных очередей у каждого P, существует глобальная очередь горутин, куда они попадают в некоторых случаях.