Middle+
Mesélj a goroutine-kezelési mintáról (GMP) a Go-ban.
sobes.tech MI
Válasz az MI-től
A Go ütemezője a GMP modellt használva kezeli a goroutine-okat, az operációs rendszer szálait és a logikus processzorokat:
- G (Goroutine): Könnyű, független végrehajtási egység. Tartalmaz egy verem, egy utasításmutatót és más állapotinformációkat. Több goroutine futtatható egyetlen OS-szálon.
- M (Machine): Operációs rendszer szál. Szerepe a goroutine kódjának indítása. Egy M-készlet elérhető lehet a ütemező számára.
- P (Processor): Logikus processzor. Kontextust biztosít a goroutine végrehajtásához. Tartalmaz egy helyi sorban a futásra kész goroutine-okat. Az alapértelmezett P-k száma
runtime.NumCPU().
Interakció:
- Egy goroutine (G) létrehozása és helyezése egy globális vagy helyi P-sorba.
- Egy szabad M kér egy P-t. Ha P elérhető, az M hozzákapcsolódik.
- Az M kiválaszt egy goroutine-t a helyi P-sorból és elkezdi végrehajtani.
- Ha a goroutine blokkolódik (pl. I/O várakozás), az M leválik P-ről ("hand off"). P továbbra is elérhető marad egy másik M vagy egy másik goroutine ütemezéséhez.
- Amikor a blokkolt goroutine készen áll a folytatásra, visszakerül a P sorába vagy a globális sorba.
- Az M-t az ütemező hozhatja létre szükség szerint (pl. ha az összes meglévő M blokkolva van), vagy eltávolíthatja, ha inaktív.
Preemption (kényszerített váltás): Az ütemező megszakíthatja egy goroutine végrehajtását egy adott időtartam (time slice) után, hogy igazságos CPU-elosztást biztosítson.
Work Stealing (munkalopás): Ha P kimeríti a goroutine-okat a helyi sorában, megpróbálhat "ellopni" goroutine-okat a globális sorból vagy más P-k sorából.