Skip to main content

Как устроен планировщик горутин в Go: G-M-P модель

Go использует уникальную модель управления конкурентностью — G-M-P (Goroutine, Machine, Processor), которая обеспечивает масштабируемость, высокую производительность и лёгкость работы с параллелизмом.


🧠 Компоненты Go-планировщика

Обозначение Название Что это такое
G Goroutine Логическая единица выполнения (код + стек)
M Machine (Thread) Системный поток (OS thread)
P Processor Планировщик, управляющий выполнением G

🔄 Как это работает?

  • M (Thread) — физический поток, выполняющий код
  • P (Processor) — абстрактный процессор: даёт M-у задачу (G)
  • G (Goroutine) — логическая задача, которую нужно выполнить

M нужен P, чтобы выполнять G. Без P поток (M) простаивает.


🔁 Модель в действии

При запуске:

runtime.GOMAXPROCS(4)

Ты создаёшь 4 P (процессора). Это означает, что Go может одновременно запускать до 4 горутин в реальном параллелизме.


🧬 Визуально:

+-------------+        +----------+        +------------------+
| Goroutine G |   -->  |   P      |  -->   | Thread M (OS)    |
+-------------+        +----------+        +------------------+
       ^                     |
       |_____________________|
         Work stealing (если P простаивает)

⏳ Work-stealing

Если один P (процессор) простаивает, он может “украсть” G из очереди другого P. Это делает систему ещё более гибкой и минимизирует простои.


📌 Примеры поведения

Сценарий Как себя ведёт Go
1 млн горутин Go спокойно справится
Ожидание по time.Sleep P отходит от M и отдаёт другим
Блокировка I/O M блокируется, но P берёт новый M
runtime.GOMAXPROCS(n) Ограничивает кол-во одновременно исполняемых G

✅ Вывод:

Go-планировщик:

  • работает по G-M-P модели
  • очень эффективно управляет тысячами горутин
  • масштабируется лучше, чем системы, построенные на потоках ОС
  • делает конкурентное программирование простым и надёжным