Sobes.tech
Middle+

Qu'est-ce que les threads verts (green threads) ?

sobes.tech IA

Réponse de l'IA

Les threads verts sont des threads gérés au niveau de l’espace utilisateur, et non par le système d’exploitation. Ils ne sont pas directement visibles dans les threads du système d’exploitation. La planification et le changement de contexte entre threads verts se font au moment de l’exécution du langage de programmation ou via une bibliothèque spécialisée.

Caractéristiques principales :

  • Gestion : Entièrement effectuée au moment de l’exécution.
  • Ressources : Nécessitent moins de ressources système (mémoire et temps CPU) comparé aux threads natifs du système d’exploitation pour leur création et leur commutation.
  • Planification : Non préemptive (multitâche coopérative). Le thread doit céder explicitement le contrôle pour qu’un autre thread vert puisse s’exécuter.
  • Parallélisme : En raison de la planification non préemptive et de la gestion en espace utilisateur, les threads verts ne supportent pas explicitement l’exécution parallèle sur des processeurs multi-cœurs sans mécanismes supplémentaires (par exemple, utiliser plusieurs processus, chacun avec ses propres threads verts).

En Ruby, surtout dans les anciennes versions (avant 1.9) et avec MRI (Matz’s Ruby Interpreter), des threads verts étaient utilisés. Cela causait des problèmes de performance sur les systèmes multi-cœurs, car un seul thread vert pouvait s’exécuter à un moment donné, bloqué par le Global Interpreter Lock (GIL). Dans les versions plus récentes de MRI et dans d’autres implémentations (JRuby, Rubinius), des threads natifs du système d’exploitation sont utilisés.

# Exemple d’utilisation de threads en Ruby (selon la version et l’implémentation, ils peuvent être verts ou natifs)
t1 = Thread.new do
  puts "Thread 1 démarré"
  sleep(1)
  puts "Thread 1 terminé"
end

t2 = Thread.new do
  puts "Thread 2 démarré"
  sleep(1)
  puts "Thread 2 terminé"
end

t1.join # Attend la fin du thread t1
t2.join # Attend la fin du thread t2

puts "Tous les threads sont terminés"

Comparaison entre threads verts et natifs :

Caractéristique Threads verts Threads natifs du système d’exploitation
Gestion Espace utilisateur Noyau du système d’exploitation
Création/Changement Plus économique Plus coûteux
Planification Coopérative (non préemptive) Préemptive
Parallélisme Limité (un CPU) sans mécanismes Complet (multiples CPU)
Appels bloquants Bloque tout l’interpréteur/procédé Bloque uniquement le thread natif actuel

Dans le contexte de Ruby moderne (à partir de 1.9 avec MRI), les threads Thread sont des threads natifs du système d’exploitation. Les threads verts, en tant que modèle principal de parallélisme, sont maintenant rares dans MRI, mais peuvent apparaître dans des bibliothèques spécifiques ou des run-times alternatifs.