Sobes.tech
Middle+

Vertel me over het managementpatroon van goroutines (GMP) in Go.

sobes.tech AI

Antwoord van AI

De Go-planner beheert goroutines, besturingssysteemthreads en logische processors met behulp van het GMP-model:

  • G (Goroutine): Lichtgewicht, onafhankelijke uitvoeringsunit. Bevat een stack, een instructiepointer en andere statusinformatie. Meerdere goroutines kunnen op één OS-thread draaien.
  • M (Machine): Besturingssysteemthread. Functioneert als uitvoerder die de code van de goroutine start. Een set van M's kan beschikbaar zijn voor de planner.
  • P (Processor): Logische processor. Biedt een context voor het uitvoeren van de goroutine. Bevat een lokale wachtrij van goroutines die klaar zijn om uit te voeren op deze M. Het standaardaantal P is gelijk aan runtime.NumCPU().

Interactie:

  1. Een goroutine (G) wordt gemaakt en in een globale of lokale P-wachtrij geplaatst.
  2. Een vrije M vraagt een P aan. Als P beschikbaar is, wordt M eraan gekoppeld.
  3. M pakt een goroutine uit de lokale P-wachtrij en begint deze uit te voeren.
  4. Als de goroutine blokkeert (bijvoorbeeld bij I/O), ontkoppelt M zich van P ("hand off"). P blijft beschikbaar voor een ander M of plant een andere goroutine uit zijn wachtrij.
  5. Wanneer de geblokkeerde goroutine klaar is om verder te gaan, wordt deze terug in de P-wachtrij of de globale wachtrij geplaatst.
  6. M kan door de planner worden gemaakt indien nodig (bijvoorbeeld als alle bestaande M's geblokkeerd zijn) of worden verwijderd wanneer inactief.

Preemption (gedwongen onderbreking): De planner kan de uitvoering van een goroutine onderbreken na een bepaalde tijd (time slice) om een eerlijke verdeling van CPU-tijd tussen andere goroutines te garanderen.

Work Stealing (werkdiefstal): Als P zijn goroutines in de lokale wachtrij heeft uitgeput, kan hij proberen goroutines te "stelen" uit de globale wachtrij of de wachtrijen van andere P's.