Sobes.tech
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ó:

  1. Egy goroutine (G) létrehozása és helyezése egy globális vagy helyi P-sorba.
  2. Egy szabad M kér egy P-t. Ha P elérhető, az M hozzákapcsolódik.
  3. Az M kiválaszt egy goroutine-t a helyi P-sorból és elkezdi végrehajtani.
  4. 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.
  5. Amikor a blokkolt goroutine készen áll a folytatásra, visszakerül a P sorába vagy a globális sorba.
  6. 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.