GMP - это модель планирования выполнения горутин в Go, где:
- G (Goroutine): Легковесный поток выполнения, абстракция над системными потоками.
- M (Machine): Системный поток ОС. Может выполнять код одной или нескольких горутин.
- P (Processor): Логический процессор, представляющий контекст для выполнения горутин. Каждому P назначен M, и P содержит локальную очередь runnable горутин. Количество P по умолчанию равно
$GOMAXPROCS
(обычно число ядер процессора).
Работает так:
- Планировщик (часть рантайма Go) ставит новые горутины в глобальную или локальные очереди P.
- M, связанный с P, забирает горутину из очереди P и выполняет её.
- Когда горутина блокируется (например, при ожидании I/O или на мьютексе):
- M отвязывается от текущего P.
- Планировщик пытается найти другой M, чтобы он занял этот P, или создаёт новый.
- Блокированная горутина ставится в специальную очередь.