Sobes.tech
Middle+

Comment sont structurées les goroutines et combien de mémoire occupent-elles dans la pile?

sobes.tech IA

Réponse de l'IA

Une goroutine est un fil d'exécution léger géré par l'environnement d'exécution de Go. Contrairement aux threads du système d'exploitation, les goroutines sont multiplexées sur un nombre réduit de threads OS. Cela assure une meilleure évolutivité.

Aspects clés :

  • Gestionnaire de planification (Scheduler) : L'environnement d'exécution de Go possède son propre planificateur (planificateur M:N), qui gère les goroutines (M) sur un nombre limité de threads OS (N).
  • Gestionnaire de mémoire (Memory Manager) : Gère les piles des goroutines et leur croissance/diminution.
  • Communication : Les goroutines communiquent via des canaux, assurant un échange de données sécurisé sans blocages/mutex dans la plupart des cas.

Pile de la goroutine :

  • Initialement, les piles des goroutines sont petites, généralement 2 Ko (avant Go 1.4, c'était 4 Ko).
  • La pile est dynamique, elle peut croître et réduire. Lorsqu'elle déborde, elle s'étend automatiquement, et lorsqu'elle libère de la mémoire, elle se compresse.
  • Cette gestion dynamique de la pile réduit les coûts par rapport aux grandes piles fixes du système d'exploitation.

Mémoire occupée par la pile :

  • Lors de la création d'une goroutine, elle occupe généralement 2 Ko de mémoire pour sa pile.
  • La consommation mémoire peut augmenter dynamiquement lors des appels de fonctions et diminuer lors de leur retour.
  • La taille maximale de la pile est limitée, mais elle est suffisamment grande pour la plupart des tâches (généralement plusieurs Mo).
package main

import (
	"fmt"
	"runtime"
	"time"
)

func sayHello() {
	fmt.Println("Bonjour depuis la goroutine!")
}

func main() {
	// Démonstration de la création d'une goroutine
	go sayHello()

	// Pour observer le fonctionnement de la goroutine
	time.Sleep(100 * time.Millisecond)

	fmt.Printf("Nombre de goroutines : %d\n", runtime.NumGoroutine())
}

Dans cet exemple, sayHello s'exécute comme une goroutine séparée. runtime.NumGoroutine() affiche le nombre de goroutines actives (y compris la principale).