Что такое модель планировщика Go (M, P, G) и как она работает?

Ответ

Модель MPG — это основа планировщика горутин в Go, который эффективно распределяет огромное количество горутин по небольшому числу потоков операционной системы. Аббревиатура расшифровывается как:

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

Как это работает (упрощенно):

  1. Планировщик связывает M (поток ОС) с P (логическим процессором).
  2. M начинает выполнять горутины (G) из локальной очереди своего P.
  3. Если горутина G блокируется (например, на системном вызове или ожидании канала), M отсоединяется от P и остается заблокированным вместе с G.
  4. Планировщик находит другой (или создает новый) M и присоединяет его к тому же P, чтобы продолжить выполнение других горутин из очереди.

Ключевые особенности планировщика:

  • Work-Stealing (Воровство работы): Если у одного P заканчиваются горутины в локальной очереди, он может "украсть" половину горутин из очереди другого, более загруженного P. Это обеспечивает равномерное распределение нагрузки.
  • Эффективная обработка блокировок: Благодаря разделению M и P, блокировка одной горутины на системном вызове не останавливает выполнение других горутин, готовых к работе.
  • Глобальная очередь: Помимо локальных очередей у каждого P, существует глобальная очередь горутин, куда они попадают в некоторых случаях.