Runtime в Go — это набор компонентов, выполняющихся вместе с пользовательским кодом и обеспечивающих:
// Упрощенная структура из runtime/runtime2.go
type g struct { // Goroutine
stack stack // Стек горутины
sched gobuf // Контекст выполнения
}
type m struct { // OS thread
g0 *g // Специальная горутина для выполнения runtime-кода
curg *g // Текущая выполняемая горутина
p puintptr // Привязанный P
}
type p struct { // Logical processor
runqhead uint32 // Очередь runnable-горутин
runqtail uint32
runq [256]guintptr
}
Трехкомпонентная модель (M:P:G):
Work-stealing алгоритм:
Системные вызовы:
Планировщик переключает горутины в случаях:
runtime.Gosched()
Отдельный M, выполняющий фоновые задачи:
Эффективность:
200ns vs
1000ns)Масштабируемость:
Простота:
func main() {
runtime.GOMAXPROCS(2) // 2 логических процессора
var wg sync.WaitGroup
wg.Add(3)
go func() { // G1
defer wg.Done()
fmt.Println("Горутина 1")
}()
go func() { // G2
defer wg.Done()
time.Sleep(time.Second) // Вызовет перепланирование
fmt.Println("Горутина 2")
}()
go func() { // G3
defer wg.Done()
fmt.Println("Горутина 3")
}()
wg.Wait()
}
планировщик Go — это sophisticated механизм, обеспечивающий эффективное выполнение миллионов легковесных горутин на ограниченном количестве потоков ОС. Его трехуровневая архитектура (M:P:G) и work-stealing алгоритмы делают Go-программы высокопроизводительными и масштабируемыми без сложного ручного управления потоками.