Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: goroutine, scheduler, GMP, concurrency, Go runtime

Как работает scheduler в Go и что такое GMP модель?

Вопрос проверяет понимание внутреннего устройства рантайма Go, а именно планировщика горутин и GMP модели, что необходимо для написания эффективного конкурентного кода.

Короткий ответ

GMP модель — это архитектура планировщика Go, где G — горутина, M — поток ОС (machine), P — логический процессор (processor). Планировщик распределяет горутины по потокам, используя P как посредника. Это позволяет эффективно выполнять миллионы горутин на ограниченном числе потоков, минимизируя переключения контекста.

Длинный ответ

Что такое GMP модель?

GMP — это аббревиатура, описывающая три ключевых компонента планировщика Go: G (goroutine) — легковесный поток выполнения, M (machine) — поток операционной системы, P (processor) — логический процессор, который управляет очередью горутин и связывает G с M. Планировщик Go работает на уровне пользовательского пространства, что делает переключение между горутинами гораздо дешевле, чем переключение потоков ОС.

Как работает планировщик?

Каждый P имеет локальную очередь горутин. Когда горутина блокируется (например, на системном вызове или канале), M может переключиться на другую горутину из очереди P. Если очередь P пуста, планировщик может украсть горутину из очереди другого P (work stealing). Это обеспечивает равномерную загрузку всех ядер процессора.

Пример кода

package main

import (
	"fmt"
	"runtime"
	"sync"
)

func main() {
	// Устанавливаем количество логических процессоров
	runtime.GOMAXPROCS(2)

	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			fmt.Printf("Горутина %d\n", id)
		}(i)
	}
	wg.Wait()
}

В этом примере мы создаём 10 горутин, которые планировщик распределяет по 2 логическим процессорам. Каждая горутина выполняется конкурентно, а планировщик автоматически управляет их переключением.

Вывод

GMP модель позволяет Go эффективно управлять тысячами и миллионами горутин на ограниченном числе потоков ОС, что делает язык идеальным для высоконагруженных серверных приложений и микросервисов.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Golang

    Golang

Ключевые слова

#goroutine

#scheduler

#GMP

#concurrency

#Go runtime

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.