Middle+
Jak są zbudowane goroutines i ile pamięci zajmują na stosie?
sobes.tech AI
Odpowiedź od AI
Gorutyna to lekkie wątki wykonawcze zarządzane przez środowisko uruchomieniowe Go. W przeciwieństwie do wątków systemu operacyjnego, gorutyny multiplexują się na mniejszą liczbę wątków systemu operacyjnego. Zapewnia to lepszą skalowalność.
Kluczowe aspekty:
- Menadżer planowania (Scheduler): Środowisko uruchomieniowe Go ma własny planista (scheduler M:N), który zarządza gorutynami (M) na ograniczonej liczbie wątków systemu operacyjnego (N).
- Menadżer pamięci (Memory Manager): Zarządza stosami gorutyn i ich wzrostem/mniejszeniem.
- Komunikacja: Gorutyny komunikują się przez kanały, zapewniając bezpieczną wymianę danych bez blokad/mutexów w większości przypadków.
Stos gorutyny:
- Początkowo stosy gorutyn są małe, zazwyczaj 2 KB (przed Go 1.4 było to 4 KB).
- Stos jest dynamiczny, rośnie i kurczy się. Gdy dojdzie do przepełnienia, automatycznie się powiększa, a przy zwolnieniu pamięci — kurczy.
- Ta dynamiczna zarządzanie stosem zmniejsza koszty w porównaniu do dużych, stałych stosów systemu operacyjnego.
Zużycie pamięci na stosie:
- W momencie tworzenia gorutyna zazwyczaj zajmuje 2 KB pamięci na swój stos.
- Zużycie pamięci może się dynamicznie zwiększać przy wywołaniach funkcji i zmniejszać przy ich powrocie.
- Maksymalny rozmiar stosu jest ograniczony, ale jest wystarczająco duży dla większości zadań (zwykle kilka MB).
package main
import (
"fmt"
"runtime"
"time"
)
func sayHello() {
fmt.Println("Cześć z gorutyny!")
}
func main() {
// Demonstracja tworzenia gorutyny
go sayHello()
// Aby obserwować działanie gorutyny
time.Sleep(100 * time.Millisecond)
fmt.Printf("Liczba gorutyn: %d\n", runtime.NumGoroutine())
}
W tym przykładzie sayHello jest wykonywana jako oddzielna gorutyna. runtime.NumGoroutine() pokazuje liczbę aktywnych gorutyn (w tym główną).