Middle+
Vorbește despre modelul de gestionare a goroutine-urilor (GMP) în Go.
sobes.tech AI
Răspuns de la AI
Planificatorul Go gestionează goroutine, firele sistemului de operare și procesoarele logice folosind modelul GMP:
- G (Goroutine): Unitate de execuție ușoară și independentă. Conține un stivă, un indicator de instrucțiuni și alte informații despre stare. Mai multe goroutine pot rula pe un singur fir de sistem de operare.
- M (Machine): Fir al sistemului de operare. Acționează ca executor care pornește codul goroutine. Un set de M poate fi disponibil pentru planificator.
- P (Processor): Procesor logic. Oferă un context pentru executarea goroutine. Conține o coadă locală de goroutine gata pentru execuție pe acest M. Numărul implicit de P este egal cu
runtime.NumCPU().
Interacțiune:
- Se creează o goroutine (G) și se plasează într-o coadă globală sau locală P.
- Un M liber solicită un P. Dacă P este disponibil, M se atașează la el.
- M preia o goroutine din coada locală P și începe execuția.
- Dacă goroutine se blochează (de exemplu, așteptând I/O), M se deconectează de la P ("hand off"). P rămâne disponibil pentru alt M sau planifică o altă goroutine din coada sa.
- Când goroutine blocată este gata pentru reluare, ea este plasată înapoi în coada P sau în coada globală.
- M poate fi creat de planificator dacă este necesar (de exemplu, dacă toate M existente sunt blocate) sau eliminat când este inactiv.
Preemption (comutare forțată): Planificatorul poate întrerupe execuția unei goroutine după o anumită perioadă de timp (time slice) pentru a asigura o distribuție echitabilă a timpului CPU între alte goroutine.
Work Stealing (furt de muncă): Dacă P a epuizat goroutine-urile din coada sa locală, poate încerca să "fure" goroutine-uri din coada globală sau din coada altor P.