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:
- Een goroutine (G) wordt gemaakt en in een globale of lokale P-wachtrij geplaatst.
- Een vrije M vraagt een P aan. Als P beschikbaar is, wordt M eraan gekoppeld.
- M pakt een goroutine uit de lokale P-wachtrij en begint deze uit te voeren.
- 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.
- Wanneer de geblokkeerde goroutine klaar is om verder te gaan, wordt deze terug in de P-wachtrij of de globale wachtrij geplaatst.
- 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.