Middle+
Parlez-moi du modèle de gestion des goroutines (GMP) en Go.
sobes.tech IA
Réponse de l'IA
Le planificateur de Go gère les goroutines, les threads du système d'exploitation et les processeurs logiques en utilisant le modèle GMP:
- G (Goroutine): Unité d'exécution légère et indépendante. Contient une pile, un pointeur d'instruction et d'autres informations d'état. Plusieurs goroutines peuvent fonctionner sur un seul thread OS.
- M (Machine): Thread du système d'exploitation. Sert d'exécuteur qui lance le code de la goroutine. Un ensemble de M peut être disponible pour le planificateur.
- P (Processor): Processeur logique. Fournit un contexte pour l'exécution de la goroutine. Contient une file d'attente locale de goroutines prêtes à s'exécuter sur ce M. Le nombre de P par défaut est égal à
runtime.NumCPU().
Interaction:
- Une goroutine (G) est créée et placée dans une file d'attente globale ou locale P.
- Un M libre demande un P. Si P est disponible, M s'y attache.
- M prend une goroutine de la file d'attente locale P et commence son exécution.
- Si la goroutine se bloque (par exemple, en attendant une I/O), M se détache de P ("hand off"). P reste disponible pour un autre M ou planifie une autre goroutine de sa file.
- Lorsque la goroutine bloquée est prête à reprendre, elle est remise dans la file P ou dans la file globale.
- M peut être créé par le planificateur si nécessaire (par exemple, si tous les M existants sont bloqués) ou supprimé lorsqu'il est inactif.
Preemption (changement forcé): Le planificateur peut interrompre l'exécution d'une goroutine après une période de temps déterminée (time slice) pour garantir une répartition équitable du temps CPU entre autres goroutines.
Work Stealing (vol de travail): Si P épuise ses goroutines dans sa file locale, il peut tenter de "voler" des goroutines de la file globale ou des files d'autres P.