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() показва броя на активните горутини (включително основната).