Middle+
Hogyan épülnek fel a goroutine-ok, és mennyi memóriát foglalnak a veremben?
sobes.tech MI
Válasz az MI-től
Egy gorutina egy könnyűsúlyú végrehajtási szál, amelyet a Go futtatókörnyezete kezel. A rendszer szintű szálaktól eltérően, a gorutinok kevesebb OS szálon multiplexálódnak. Ez jobb skálázhatóságot biztosít.
Főbb szempontok:
- Ütemező (Scheduler): A Go futtatókörnyezete saját ütemezővel rendelkezik (M:N ütemező), amely a gorutineokat (M) egy korlátozott számú OS szálon (N) kezeli.
- Memóriakezelő (Memory Manager): Kezeli a gorutinek stackjeit és azok növekedését/csökkenését.
- Kommunikáció: A gorutinek csatornákon keresztül kommunikálnak, biztosítva az adatok biztonságos cseréjét blokkolások/mutexek nélkül a legtöbb esetben.
Gorutine stack:
- Kezdetben a gorutinek stackjei kicsik, általában 2 KB (a Go 1.4 előtt 4 KB volt).
- A stack dinamikusan növekszik és csökken. Túlfutás esetén automatikusan bővül, és memória felszabadításakor összehúzódik.
- Ez a dinamikus stack kezelés csökkenti a költségeket a fix nagy OS szálak stackjeihez képest.
Memória felhasználás a stacken:
- A gorutina létrehozásakor általában 2 KB memóriát foglal el a stackje.
- A memóriafelhasználás dinamikusan növekedhet függvényhívásokkal, és csökkenhet visszatéréskor.
- A maximális stack méret korlátozott, de elég nagy a legtöbb feladathoz (általában néhány MB).
package main
import (
"fmt"
"runtime"
"time"
)
func sayHello() {
fmt.Println("Helló egy gorutiból!")
}
func main() {
// Gorutib létrehozásának bemutatása
go sayHello()
// A gorutib működésének megfigyeléséhez
time.Sleep(100 * time.Millisecond)
fmt.Printf("Gorutinek száma: %d\n", runtime.NumGoroutine())
}
Ebben a példában a sayHello külön gorutinként fut. A runtime.NumGoroutine() megmutatja az aktív gorutinek számát (beleértve a főt is).