Sobes.tech
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).