Загрузка…
Загрузка…
Go · junior · сложность 3
Планировщик Go использует кооперативный механизм планирования на уровне пользователя, основанный на модели M:P:G:
G (горутина): Представляет одну горутину, единицу одновременного выполнения.
M (Машина): Представляет поток ОС, управляемый средой выполнения Go. Потоки ОС — это место, где происходит фактическое выполнение кода.
P (Процессор): Представляет логический процессор или контекст для планирования горутин. P необходим для выполнения кода Go. Он содержит очередь выполнения горутин, готовых к запуску, и отвечает за подачу горутин в M.
Механика: 1. Горутины создаются (go func() { ... }). 2. Вновь созданные горутины помещаются в очередь выполнения P или глобальную очередь выполнения. 3. M нужен связанный с ним P для запуска кода Go. Планировщик пытается сохранить пары M и P. 4. M извлекает горутину из локальной очереди выполнения своего P и выполняет ее. 5. Когда горутина блокируется (например, на канале отправки/получения, мьютексе или блокирующем системном вызове), M отделяется от своей P. Затем P может быть соединена в пару с другим M (либо новым, либо одним из пула), чтобы продолжить выполнение других горутин. 6. Когда операция блокировки завершится, горутина помечается как работоспособная и снова помещается в очередь выполнения.
GOMAXPROCS: Эта переменная среды (или заданная с помощью runtime.GOMAXPROCS) определяет количество P, доступных планировщику. По умолчанию GOMAXPROCS установлено на количество логических процессоров на машине. Наличие большего количества P позволяет планировщику потенциально запускать больше горутин одновременно на нескольких ядрах. Установка слишком высокого значения может привести к увеличению накладных расходов на планирование.
Планировщик Go использует кооперативный механизм планирования на уровне пользователя, основанный на модели M:P:G: