Middle+
Parla del pattern di gestione delle goroutine (GMP) in Go.
sobes.tech AI
Risposta dell'AI
Il pianificatore di Go gestisce le goroutine, i thread del sistema operativo e i processori logici utilizzando il modello GMP:
- G (Goroutine): Unità di esecuzione leggera e indipendente. Contiene uno stack, un puntatore all'istruzione e altre informazioni sullo stato. Molte goroutine possono funzionare su un singolo thread del sistema operativo.
- M (Machine): Thread del sistema operativo. Funziona come esecutore che avvia il codice della goroutine. Un insieme di M può essere disponibile per il pianificatore.
- P (Processor): Processore logico. Fornisce un contesto per l'esecuzione della goroutine. Contiene una coda locale di goroutine pronte per essere eseguite su questo M. Il numero di P di default è uguale a
runtime.NumCPU().
Interazione:
- Viene creata una goroutine (G) e viene inserita in una coda globale o locale P.
- Un M libero richiede un P. Se P è disponibile, M si collega ad esso.
- M prende una goroutine dalla coda locale P e inizia la sua esecuzione.
- Se la goroutine si blocca (ad esempio, in attesa di I/O), M si disconnette da P ("hand off"). P rimane disponibile per un altro M o pianifica un'altra goroutine dalla sua coda.
- Quando la goroutine bloccata è pronta a riprendere, viene rimessa nella coda P o nella coda globale.
- M può essere creato dal pianificatore se necessario (ad esempio, se tutti gli M esistenti sono bloccati) o rimosso quando inattivo.
Preemption (interruzione forzata): Il pianificatore può interrompere l'esecuzione di una goroutine dopo un certo periodo di tempo (time slice) per garantire una distribuzione equa del tempo della CPU tra le altre goroutine.
Work Stealing (furto di lavoro): Se P esaurisce le goroutine nella sua coda locale, può tentare di "rubare" goroutine dalla coda globale o dalle code di altri P.