Sobes.tech
Middle+

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

sobes.tech AI

Отговор от AI

Горутина е лек поток за изпълнение, управляван от средата за изпълнение на Go. За разлика от потоковете на операционната система, горутините мултиплексират върху по-малко брой ОС потоци. Това осигурява по-добра мащабируемост.

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

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

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

  • Първоначално стековете на горутините са малки, обикновено 2 KB (преди Go 1.4 бяха 4 KB).
  • Стекът е динамичен, расте и намалява. При препълване се разширява автоматично, а при освобождаване на паметта — свива се.
  • Тази динамична управляемост на стека намалява разходите в сравнение с фиксираните големи стекове на ОС.

Заета памет в стека:

  • При създаване, горутината обикновено заема 2 KB памет за своя стек.
  • Консумацията на памет може да се увеличава динамично при извиквания на функции и да намалява при връщане.
  • Максималният размер на стека е ограничен, но е достатъчно голям за повечето задачи (обикновено няколко MB).
package main

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

func sayHello() {
	fmt.Println("Здравей от горутина!")
}

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

	// За наблюдение на работата на горутината
	time.Sleep(100 * time.Millisecond)

	fmt.Printf("Брой горутини: %d\n", runtime.NumGoroutine())
}

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