Планировщик горутин в Go использует модель M:N, где M горутин отображаются на N потоков ОС. Он эффективно переключает горутины между потоками, реализуя невытесняющую многозадачность с точками останова (преemption points).
Основные компоненты GPM модели:
- G (Goroutine): Абстракция исполняемой единицы кода, легковесный поток, управляемый планировщиком Go.
- P (Processor): Логический процессор, представляющий собой контекст локальной очереди горутин и ресурсов, таких как мьютексы и планировщик. Количество P по умолчанию определяется количеством логических ядер процессора, но может быть изменено через
GOMAXPROCS
.
- M (Machine/Thread): Поток операционной системы, который исполняет код. M связан с P и исполняет горутины из локальной очереди P или глобальной очереди.
Принцип работы:
- Новая горутина создается и помещается в локальную очередь доступного P.
- M, связанный с P, берет горутину из локальной очереди и исполняет ее.
- Если локальная очередь пуста, M пытается украсть горутины у других P.
- Если P блокируется (например, при выполнении системного вызова), связанный с ним M отсоединяется, и другой M связывается с этим P. Заблокированный M может быть повторно использован, когда системный вызов завершился.
- Если горутина блокируется на канале или мьютексе, она ставится в очередь ожидания, и планировщик выбирает другую горутину для исполнения на том же M.
- П