Processus
Progression
#Processus
Un processus n'est pas seulement du code : c'est un ensemble vivant constitué d'un espace mémoire virtuel, d'un contexte processeur, de descripteurs de fichiers et d'un environnement qui lui est propre. Lorsque le noyau exécute ce processus, il charge ses registres, mappe ses pages, restaure sa pile et lui offre un accès exclusif au CPU pendant un court laps de temps. À l'extinction du quantum, l'état complet est sauvegardé pour que l'exécution puisse reprendre plus tard comme si rien ne s'était passé.
#1. Cycle de vie
Le diagramme classique « prêt → en cours → bloqué → terminé » n'est pas un simple schéma de manuel. Prenons un serveur web : il attend sur accept
(état bloqué), reçoit une connexion et passe brièvement en exécution, puis se remet en attente. Si le serveur engendre des fils, chacun possède son propre PID, son espace utilisateur isolé et un code de retour qui devra être collecté par le parent via wait
pour éviter l'accumulation de zombies.
#2. Créer et remplacer un processus
Sous Unix, fork
duplique le processus courant. Le parent et l'enfant se différencient uniquement par la valeur de retour : 0 pour l'enfant, PID du fils pour le parent. Le noyau ne copie pas immédiatement toutes les pages ; il marque simplement leurs entrées en copy-on-write. Dès qu'un des deux modifie une page, celle-ci est dupliquée. Pour exécuter un nouveau programme, l'enfant appelle execlp
(ou toute variante exec
) et remplace son image mémoire. Ce couple fork
/exec
constitue la pierre angulaire des shells et des gestionnaires de processus.
1pid_t pid = fork();2if (pid == 0) {3 execlp("ls", "ls", "-l", NULL);4 _exit(127);5}6waitpid(pid, NULL, 0);
L'exemple illustre la règle d'or : toujours quitter explicitement si l'appel exec
échoue, car l'enfant continuerait sinon dans le flot du parent.
#3. Signaux et gestion asynchrone
Les signaux agissent comme des interruptions logicielles. SIGCHLD
prévient un parent qu'un enfant a terminé, SIGINT
transmet l'interruption clavier (Ctrl+C), SIGALRM
déclenche une minuterie. Installer un gestionnaire (sigaction
) permet de capturer l'événement et de décider quoi faire : nettoyer des fichiers temporaires, réarmer une minuterie, afficher une statistique. Certaines valeurs restent néanmoins réservées (SIGKILL
, SIGSTOP
) afin de garantir au noyau un moyen sûr d'arrêter un processus malveillant.
#Atelier
Écrivez un mini-shell qui : 1) duplique le processus avec fork
, 2) applique execvp
sur la ligne de commande saisie, 3) collecte systématiquement le code de sortie via waitpid
, 4) traite SIGINT
pour ne pas interrompre votre shell lorsque le programme enfant reçoit Ctrl+C. L'objectif est de sentir la mécanique complète de la vie d'un processus.