Middle+
Cum sunt structurate goroutine-urile și câtă memorie ocupă în stivă?
sobes.tech AI
Răspuns de la AI
O gorutină este un fir de execuție ușor, gestionat de mediul de execuție Go. Spre deosebire de firele de sistem de operare, gorutinele sunt multiplexate pe un număr mai mic de fire de sistem de operare. Acest lucru asigură o scalabilitate mai bună.
Aspecte cheie:
- Scheduler: Mediul de execuție Go are propriul scheduler (scheduler M:N), care gestionează gorutinele (M) pe un număr limitat de fire de sistem de operare (N).
- Manager de memorie: Gestionează stivele gorutine și creșterea/micșorarea acestora.
- Comunicare: Gorutinele comunică prin canale, asigurând o schimbare sigură de date fără blocări/mutex-uri în majoritatea cazurilor.
Stiva gorutinei:
- Inițial, stivele gorutinei sunt mici, de obicei 2 KB (înainte de Go 1.4 erau 4 KB).
- Stiva crește și scade dinamic. Când se umple, se extinde automat, iar când se eliberează memorie, se comprimă.
- Această gestionare dinamică a stivei reduce costurile comparativ cu stivele mari fixe ale sistemului de operare.
Memorie ocupată pe stivă:
- La crearea unei gorutine, aceasta ocupă, în general, 2 KB memorie pentru stiva sa.
- Consumul de memorie poate crește dinamic cu apelurile de funcții și scade la revenire.
- Dimensiunea maximă a stivei este limitată, dar suficient de mare pentru majoritatea sarcinilor (de obicei câțiva MB).
package main
import (
"fmt"
"runtime"
"time"
)
func sayHello() {
fmt.Println("Salut dintr-o gorutină!")
}
func main() {
// Demonstrație de creare a unei gorutine
go sayHello()
// Pentru a observa funcționarea gorutinei
time.Sleep(100 * time.Millisecond)
fmt.Printf("Numărul de gorutine: %d\n", runtime.NumGoroutine())
}
În acest exemplu, sayHello rulează ca o gorutină separată. runtime.NumGoroutine() afișează numărul de gorutine active (inclusiv cea principală).