Processus vs thread : les différences expliquées

Un processus est un programme en cours d'exécution doté de son propre espace d'adressage privé et de ses ressources. Un thread est une unité d'exécution à l'intérieur d'un processus. Tous les threads d'un processus partagent sa mémoire, ce qui les rend peu coûteux à créer et rapides pour communiquer, mais signifie aussi qu'un bug ou un plantage peut affecter tout le processus. Des processus distincts sont isolés les uns des autres, ce qui est plus sûr mais coûte plus cher à créer et à faire communiquer.

CritèreProcessusThread
DéfinitionUn programme en cours d'exécution avec son propre espace d'adressage, ses fichiers et ses autres ressourcesUn fil d'exécution à l'intérieur d'un processus, avec sa propre pile et ses propres registres
MémoireEspace d'adressage virtuel distinct, isolé des autres processusPartage le code, le tas et les données globales de son processus ; seule la pile est privée
Coût de créationPlus lourd : un nouvel espace d'adressage doit être mis en place (le copy-on-write réduit ce coût)Plus léger : pas de nouvel espace d'adressage
Changement de contextePlus coûteux : l'espace d'adressage change, et les traductions en cache (TLB) peuvent être perduesMoins coûteux : l'espace d'adressage et les caches restent les mêmes
CommunicationNécessite une communication interprocessus comme les pipes, les sockets ou la mémoire partagéeLit et écrit directement la mémoire partagée, ce qui est rapide
Isolation et défaillancesUn plantage reste généralement confiné au processusUn plantage dans un thread peut faire tomber tout le processus
SynchronisationNécessaire lorsque des processus partagent de la mémoire ou des fichiersToujours nécessaire pour les données partagées : mutex et opérations atomiques, sinon le programme subit des data races et des interblocages
OrdonnancementContient un ou plusieurs threadsL'unité que le système d'exploitation ordonnance réellement sur les cœurs du CPU
Usages typiquesIsolation et sécurité : onglets de navigateur, services, pipelines du shellTravail parallèle au sein d'un programme : serveurs gérant de nombreuses connexions, tâches d'arrière-plan, calcul parallèle

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

Processus
Lorsqu'on veut l'isolation, la robustesse ou la sécurité, ou lorsque des composants logiciels écrits par des parties différentes ne doivent pas partager de mémoire.
Thread
Lorsque des tâches doivent partager rapidement des données et qu'on veut utiliser plusieurs cœurs de CPU au sein d'un même programme.
Précautions
Le partage de la mémoire par les threads est à la fois leur force et leur danger. Protégez les données partagées par des verrous ou des opérations atomiques, et prenez garde aux interblocages.

Questions fréquentes

Les threads partagent-ils la mémoire ?

Oui. Les threads d'un même processus partagent son code, son tas et ses données globales. Chaque thread possède sa propre pile et ses propres registres.

Pourquoi les threads sont-ils moins coûteux à créer que les processus ?

Un nouveau processus nécessite son propre espace d'adressage, tandis qu'un thread réutilise celui de son processus. Le basculement entre threads évite aussi de changer d'espace d'adressage et coûte donc moins cher.

Que se passe-t-il si un thread plante ?

Il peut faire tomber tout le processus, car les threads partagent la mémoire. Un plantage dans un processus n'affecte généralement pas les autres processus.

Quand utiliser des processus plutôt que des threads ?

Lorsqu'on veut l'isolation et la robustesse, comme pour les onglets de navigateur ou des services indépendants, ou lorsque des parties différentes ne doivent pas pouvoir corrompre la mémoire des autres.

Vérifier vos connaissances

Quel est l’avantage de la copie sur écriture (copy-on-write) lors de la duplication d’un processus ?

  1. ALe processus dupliqué et le processus d’origine partagent en permanence ce qu’ils écrivent
  2. BSeules les pages écrites sont dupliquées ultérieurement, ce qui est rapide et économe en mémoire
  3. CToutes les pages sont dupliquées à chaque écriture, ce qui renforce la sécurité des données
Afficher la réponse et l'explication

Réponse : B. Seules les pages écrites sont dupliquées ultérieurement, ce qui est rapide et économe en mémoire

Lors de la duplication d’un processus, copier immédiatement toute la mémoire coûte du temps et de la mémoire, et cette copie est inutile si un autre programme est chargé juste après. Avec la copie sur écriture, les deux tables des pages pointent en lecture seule vers les mêmes pages physiques ; lorsque l’un des processus écrit, un défaut de page survient et l’OS ne duplique que cette page. Les écritures ne sont pas partagées et restent propres à chaque processus. Toutes les pages ne sont pas dupliquées non plus.

Lors d’un changement de contexte, que faut-il sauvegarder pour le processus quitté ?

  1. ALe contenu des fichiers disque utilisés par ce processus
  2. BL’état d’exécution du CPU, comme les valeurs des registres et le compteur ordinal
  3. CL’intégralité du contenu de la mémoire physique du processus
Afficher la réponse et l'explication

Réponse : B. L’état d’exécution du CPU, comme les valeurs des registres et le compteur ordinal

Lors d’un changement de contexte, on sauvegarde l’état du CPU (registres généraux, compteur ordinal, pointeur de pile, mode de fonctionnement, etc.) pour pouvoir reprendre plus tard dans le même état, et l’on charge l’état du processus suivant. En cas de changement de processus, on change aussi le registre qui indique l’emplacement de la table des pages. Le contenu de la mémoire et des fichiers restant en place, il n’est pas nécessaire de le sauvegarder à chaque changement.

Pour quelle raison principale un changement de contexte entre processus peut-il dégrader les performances bien plus que le seul temps de sauvegarde et de restauration des registres ?

  1. AParce que la fréquence d’horloge du CPU baisse à chaque changement
  2. BParce que le programme est relu depuis le disque à chaque changement
  3. CParce qu’après le changement, les défauts de cache et de TLB augmentent
Afficher la réponse et l'explication

Réponse : C. Parce qu’après le changement, les défauts de cache et de TLB augmentent

La sauvegarde et la restauration des registres sont brèves, mais pour le processus qui reprend la main, le contenu du cache et du TLB appartient au processus précédent, et les défauts se succèdent jusqu’à ce que les données et traductions nécessaires soient rechargées. Sur un CPU sans ASID, il faut en outre vider le TLB lors du changement d’espace d’adressage. Ce coût indirect peut dépasser le temps de changement direct. L’horloge ne baisse pas et le programme n’est pas relu depuis le disque.

  1. Quel est l’avantage d’associer un ASID (identifiant d’espace d’adressage) à chaque entrée du TLB ?
  2. Quelle comparaison entre mutex (verrou à attente en sommeil) et spinlock est correcte ?
  3. Quel est un exemple d’interblocage (deadlock) ?

Questions d'entraînement sur Système d'exploitation et matériel

Termes clés expliqués

Changement de contexte
Bascule du processus ou du thread exécuté par le CPU. L'état (registres, compteur ordinal, etc.) est sauvegardé et restauré ; lors d'un changement de processus, l'espace d'adressage est aussi changé.
Mutex
Verrou qui ne peut être détenu que par un seul thread à la fois. En général, un thread qui ne peut l'obtenir est endormi et cède le CPU, puis réveillé par le système d'exploitation à la libération.
Interblocage (deadlock)
État où plusieurs threads détiennent chacun une ressource tout en attendant celle d'un autre, si bien qu'aucun ne peut avancer. On l'évite en fixant globalement l'ordre d'acquisition des verrous.

Comparatifs associés