Middle+
Jak jsou gorutiny uspořádány a kolik paměti zabírají ve zásobníku?
sobes.tech AI
Odpověď od AI
Gorutina je lehký vlákno, které spravuje prostředí běhu jazyka Go. Na rozdíl od vláken operačního systému jsou gorutiny multiplexovány na menší počet vláken OS. To zajišťuje lepší škálovatelnost.
Klíčové aspekty:
- Plánovač (Scheduler): Prostředí běhu jazyka Go má vlastní plánovač (scheduler M:N), který spravuje gorutiny (M) na omezeném počtu vláken OS (N).
- Správce paměti (Memory Manager): Řídí zásobníky gorutin a jejich růst/změnu velikosti.
- Komunikace: Gorutiny komunikují přes kanály, což zajišťuje bezpečnou výměnu dat bez blokování/mutexů ve většině případů.
Zásobník gorutiny:
- Při začátku jsou zásobníky gorutin malé, obvykle 2 KB (před Go 1.4 to bylo 4 KB).
- Zásobník je dynamický, roste a zmenšuje se. Při přetečení se automaticky rozšiřuje, a při uvolnění paměti se zmenšuje.
- Tato dynamická správa zásobníku snižuje náklady ve srovnání s velkými pevnými zásobníky OS.
Využití paměti na zásobníku:
- Při vytvoření zabírá gorutina obvykle 2 KB paměti.
- Spotřeba paměti se může dynamicky zvyšovat při volání funkcí a snižovat při návratu.
- Maximální velikost zásobníku je omezena, ale je dostatečně velká pro většinu úkolů (obvykle několik MB).
package main
import (
"fmt"
"runtime"
"time"
)
func sayHello() {
fmt.Println("Ahoj z gorutiny!")
}
func main() {
// Demonstrace vytvoření gorutiny
go sayHello()
// Pro sledování práce gorutiny
time.Sleep(100 * time.Millisecond)
fmt.Printf("Počet gorutin: %d\n", runtime.NumGoroutine())
}
V tomto příkladu se sayHello spouští jako samostatná gorutina. runtime.NumGoroutine() ukazuje počet aktivních gorutin (včetně hlavní).