cours1 min de lecture

Processus et ordonnancement par l'OS

Comment le système d'exploitation crée des processus, suit leurs états et partage le CPU entre eux pour donner l'illusion qu'ils s'exécutent en parallèle.
programme

Introduction

Vous lancez un navigateur, un éditeur de texte, un lecteur de musique — et vous les utilisez en même temps, sans que l'ordinateur ne s'arrête entre chaque tâche. Pourtant, un cœur de processeur ne sait exécuter qu'une seule instruction à la fois. La magie tient à un programme bien particulier : le système d'exploitation (OS), véritable chef d'orchestre des programmes, dont l'une des missions centrales est de faire cohabiter plusieurs programmes en cours d'exécution sur des ressources matérielles limitées. Chaque instance ainsi lancée s'appelle un processus ; et l'art de répartir le temps de CPU entre eux s'appelle l'ordonnancement (en anglais scheduling). C'est le cœur de l'item .

Programme et processus

Programme : un fichier exécutable sur le disque, statique. Processus : une instance de ce programme en cours d'exécution, avec sa mémoire, ses fichiers ouverts, son état d'exécution.

Lancer deux fois Firefox crée deux processus distincts, à partir du même programme. Chaque processus possède un identifiant unique, le PID (process identifier), attribué par l'OS à sa création.

La création d'un processus

Quand vous tapez une commande dans un terminal, l'OS suit grosso modo ces étapes :

  1. Allouer une zone mémoire pour le processus (code, données, pile, tas).
  2. Charger le programme depuis le disque vers cette zone.
  3. Initialiser les registres, le pointeur d'instruction, les fichiers standard (entrée, sortie, erreur).
  4. Attribuer un PID et inscrire le processus dans la table des processus du noyau.
  5. Placer le processus dans la file des prêts — il attend son tour pour être exécuté.

Sur Unix/Linux, la création passe historiquement par l'appel système fork() qui duplique le processus appelant, suivi de exec() qui remplace le code par celui du nouveau programme. Vous n'avez pas à mémoriser ces détails, mais c'est utile pour comprendre les schémas d'héritage de processus.

Les états d'un processus

Pendant sa vie, un processus traverse plusieurs états. Les trois états canoniques :

ÉtatDescription
Élu (running)Il occupe actuellement un cœur du CPU et exécute ses instructions.
Prêt (ready)Il est prêt à s'exécuter ; il attend que l'ordonnanceur lui donne le CPU.
Bloqué (blocked)Il attend un événement externe (lecture disque, paquet réseau, saisie clavier).

Les transitions entre ces états sont pilotées par l'ordonnanceur (élu → prêt et prêt → élu) et par les appels système (élu → bloqué, bloqué → prêt quand l'événement attendu arrive). Le diagramme classique :

créationélectionpréemptionE/SE/S terminéeterminaison

Prêt

Élu

Bloqué

Diagramme des états d'un processus

Un processus qui attend la lecture d'un fichier sur disque est dans l'état…

L'ordonnancement

L'ordonnanceur est la partie du noyau qui décide, à chaque instant, quel processus prêt obtient le CPU. On peut le voir comme un chef de service hospitalier : plusieurs patients (processus) attendent, certains sont plus urgents que d'autres, et il faut sans cesse arbitrer qui passe maintenant et qui patiente encore un peu. Quand un processus a tourné « assez longtemps » (typiquement quelques millisecondes — un quantum), l'OS le préempte : il interrompt son exécution, sauvegarde son contexte (registres, pointeur d'instruction) et donne le CPU à un autre processus prêt. Ce basculement très rapide donne l'illusion d'un parallélisme sur une machine mono-cœur.

Les politiques d'ordonnancement les plus connues :

  • FIFO / FCFS (First Come, First Served) : on traite dans l'ordre d'arrivée. Simple, mais un long calcul peut bloquer tout le monde.
  • Round Robin : chaque processus reçoit un quantum, à tour de rôle. Équitable, c'est la base de la plupart des OS interactifs.
  • Priorités : on associe une priorité à chaque processus, et l'ordonnanceur sert d'abord les plus prioritaires.
Sur Linux, l'ordonnanceur historique CFS (Completely Fair Scheduler) combine ces idées en visant un temps CPU équitable par processus. Aujourd'hui remplacé par EEVDF dans les noyaux récents, mais le principe reste le même.

Observer les processus

Sur n'importe quel système Unix/Linux, vous pouvez lister les processus avec quelques commandes standards :

ps              # processus du shell courant
ps aux          # tous les processus, tous utilisateurs
top             # vue dynamique, mise à jour temps réel
htop            # version plus ergonomique de top (à installer)

Chaque ligne montre le PID, l'utilisateur propriétaire, le pourcentage CPU, la mémoire, l'état (R = running, S = sleeping, D = bloqué disque), et la commande.

Quelle commande affiche en continu une vue dynamique des processus actifs ?

Pour aller plus loin

Sur un SoC multi-cœurs, l'ordonnanceur ne se contente plus de partager un CPU dans le temps : il répartit aussi les processus entre les cœurs disponibles (load balancing). C'est un problème NP-difficile en théorie, résolu en pratique par des heuristiques. Et la suite logique de ce cours — le risque que plusieurs processus se bloquent mutuellement — est traitée au cours suivant sur l'interblocage.