Назад к вопросам
Middle+
258
questionbank

Как устроены горутины и сколько памяти они занимают в стеке?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Горутина — это легковесный поток выполнения, управляемый средой исполнения Go. В отличие от потоков ОС, горутины мультиплексируются на меньшее количество потоков ОС. Это обеспечивает лучшую масштабируемость.

Ключевые аспекты:

  • Менеджер планировщика (Scheduler): Среда исполнения Go имеет свой планировщик (M:N scheduler), который управляет горутинами (M) на ограниченном количестве потоков ОС (N).
  • Менеджер памяти (Memory Manager): Управляет стеками горутин и их ростом/уменьшением.
  • Коммуникация: Горутины взаимодействуют через каналы, обеспечивая безопасный обмен данными без блокировок/мьютексов в большинстве случаев.

Стек горутины:

  • Изначально стеки горутин маленькие, обычно 2 КБ (до Go 1.4 было 4 КБ).
  • Стек является растущим (growing) и уменьшающимся (shrinking). При переполнении стека он автоматически расширяется, а при освобождении памяти — сжимается.
  • Это динамическое управление стеком уменьшает накладные расходы по сравнению с фиксированными большими стеками потоков ОС.

Занимаемая память в стеке:

  • На момент создания горутина занимает, как правило, 2 КБ памяти под свой стек.
  • Потребление памяти может динамически увеличиваться при вызовах функций и уменьшаться при их возврате.
  • Максимальный размер стека ограничен, но достаточно велик для большинства задач (обычно несколько МБ).
package main

import (
	"fmt"
	"runtime"
	"time"
)

func sayHello() {
	fmt.Println("Hello from goroutine!")
}

func main() {
	// Демонстрация создания горутины
	go sayHello()

	// Для наблюдения за работой горутины
	time.Sleep(100 * time.Millisecond)

	fmt.Printf("Number of goroutines: %d\n", runtime.NumGoroutine())
}

В этом примере sayHello выполняется как отдельная горутина. runtime.NumGoroutine() показывает количество активных горутин (включая основную).