Programmes et processus
Que se passe-t-il quand tu lances réellement un programme?
Programme vs processus
Section intitulée « Programme vs processus »La distinction est fondamentale :
- Un programme est un fichier exécutable stocké sur le disque.
C’est du code inerte : il ne fait rien tant qu’on ne le lance pas.
Exemples :/usr/bin/ls,/usr/bin/node,/usr/bin/nginx. - Un processus est une instance en exécution d’un programme.
Quand tu tapesnode server.js, le fichier programmenodeest chargé en mémoire et devient un processus vivant, avec son propre espace mémoire, ses variables d’environnement et un numéro d’identification unique.
On peut lancer plusieurs processus à partir du même programme.
Exemple:
- Trois onglets de navigateur = Trois processus distincts issus du même programme Firefox.
- Deux serveurs Node.js sur des ports différents = Deux processus à partir du même programme
node.
Identification : PID et PPID
Section intitulée « Identification : PID et PPID »Chaque processus reçoit un PID (Process ID) : un numéro unique attribué par le système au moment de sa création. Ce PID est la façon dont tu identifies et interagis avec un processus spécifique.
Chaque processus connaît aussi le PID de son parent : le processus qui l’a lancé.
C’est le PPID (Parent PID). Cette relation parent-enfant crée un arbre de processus dont la racine est systemd (PID 1),
le premier processus utilisateur lancé par le noyau lors du démarrage du système.
echo $$ # PID du shell courantecho $PPID # PID du parent de ce shellpstree -p # Affiche l'arbre de processus avec les PIDObserver les processus
Section intitulée « Observer les processus »La commande ps (process status) affiche un instantané des processus en cours.
# Lister tous les processus du systèmeps aux
# Décoder les colonnes principales :# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND# www-data 1234 0.5 2.1 245000 42000 ? Ss 09:15 0:03 nginx: worker process
# Surveillance en temps réeltop # Vue classique — appuie sur 'q' pour quitterhtop # Vue améliorée avec couleurs et interactions (à installer)Filtrer avec grep
Section intitulée « Filtrer avec grep »Pour naviguer et filtrer l’ensemble des processus, on utilise en combinaison la commande grep, un outil fondamental qui filtre les lignes d’un texte en ne gardant que celles qui contiennent un motif donné.
La syntaxe commande | grep motif utilise le pipe (|) pour envoyer la sortie d’une commande vers grep,
qui ne laisse passer que les lignes correspondantes.
# Filtrer pour trouver un processus précisps aux | grep nodepgrep -l node # Plus propre : affiche PID et nomCycle de vie : du code source au processus
Section intitulée « Cycle de vie : du code source au processus »Avant de devenir un processus, un programme passe par plusieurs étapes. Le chemin dépend du type de langage :
flowchart LR
subgraph Préparation["Préparation (sur disque)"]
A["Code source<br>(.js, .py, .c)"] --> B{"Langage?"}
B -->|Compilé<br>C, Rust, Go| C["Compilation"]
C --> D["Programme exécutable\n(binaire)"]
B -->|Interprété<br>JS, Python, Bash| E["Interpréteur<br>(node, python, bash)"]
end
subgraph Exécution["Exécution (en mémoire)"]
D --> F["Chargement en<br>mémoire par l'OS"]
E --> F
F --> G["Nouveau processus<br>(PID attribué)"]
end
Les états d’un processus
Section intitulée « Les états d’un processus »Une fois créé, un processus ne tourne pas en continu sur le CPU. Il alterne entre plusieurs états, orchestré par l’ordonnanceur (scheduler) du système d’exploitation :
stateDiagram-v2
[*] --> Prêt : fork() + exec()
Prêt --> EnExécution : L'ordonnanceur<br>lui donne le CPU
EnExécution --> Prêt : Temps écoulé<br>(préemption)
EnExécution --> EnAttente : Appel système<br>(fichier, réseau, sleep)
EnAttente --> Prêt : Données prêtes<br>(I/O terminé)
EnExécution --> Terminé : exit() ou signal
Terminé --> Zombie : Parent n'a pas<br>encore lu le code de sortie
Zombie --> [*] : Parent appelle wait()
state EnExécution {
[*] --> CPU
note right of CPU : Le processus<br>utilise le CPU
}
- Prêt (Ready) — Le processus est en mémoire et attend que l’ordonnanceur lui attribue du temps CPU.
- En exécution (Running) — Le processus utilise activement le CPU. Sur un processeur à 4 cœurs, au plus 4 processus peuvent être dans cet état simultanément.
- En attente (Sleeping/Blocked) — Le processus attend une ressource externe : lecture d’un fichier sur le disque, réponse du réseau, entrée clavier. Il libère le CPU pendant ce temps.
- Terminé (Terminated) — Le processus a fini son travail ou a reçu un signal d’arrêt.
- Zombie — Le processus est terminé mais son parent n’a pas encore récupéré son code de sortie.
# La colonne STAT dans ps aux indique l'état :# R — Running (en cours d'exécution)# S — Sleeping (en attente)# T — Stopped (suspendu)# Z — Zombie (terminé mais pas encore nettoyé par son parent)Les ressources d’un processus
Section intitulée « Les ressources d’un processus »Quand un processus est créé, le système d’exploitation lui attribue un ensemble de ressources matérielles et logicielles. Comprendre lesquelles aide à diagnostiquer les problèmes de performance.
| Ressource | Rôle dans le processus | Commande pour observer |
|---|---|---|
| RAM | Stocke le code en cours d’exécution, les variables, la pile d’appels | ps aux (colonnes %MEM, RSS) |
| CPU | Exécute les instructions du programme | ps aux (colonne %CPU), top |
| Disque | Fichiers lus et écrits par le processus | lsof -p PID (fichiers ouverts) |
| Réseau | Connexions réseau (sockets, ports) | ss -tlnp ou netstat -tlnp |
Signaux et terminaison
Section intitulée « Signaux et terminaison »Les signaux sont le mécanisme de communication entre processus (ou entre toi et un processus).
Quelques signaux importants
Section intitulée « Quelques signaux importants »| Signal | Numéro | Effet |
|---|---|---|
SIGTERM | 15 | Demande polie de terminer — le processus peut se nettoyer avant de quitter |
SIGKILL | 9 | Arrêt immédiat et inconditionnel — le processus ne peut pas l’intercepter |
SIGINT | 2 | Interruption — comme appuyer sur Ctrl+C |
SIGTSTP | 20 | Suspension — met le processus en pause |
SIGHUP | 1 | Signal de « raccrochage » — souvent utilisé pour recharger la configuration |
kill 1234 # Envoie SIGTERM au processus 1234 (arrêt propre)kill -9 1234 # Envoie SIGKILL — arrêt forcé, à utiliser en dernier recourskill -HUP 1234 # Envoie SIGHUP — recharge la config sans redémarrer
killall node # Envoie SIGTERM à TOUS les processus nommés "node"pkill -f "server.js" # Tue les processus dont la ligne de commande contient "server.js"Gestion de tâches
Section intitulée « Gestion de tâches »Jusqu’ici, chaque commande que tu lances dans le terminal bloque le prompt jusqu’à ce qu’elle se termine. C’est le comportement par défaut : la commande s’exécute au premier plan (foreground). Mais parfois, tu veux lancer une commande longue et continuer à travailler dans le même terminal.
Premier plan et arrière-plan
Section intitulée « Premier plan et arrière-plan »Premier plan (par défaut)
Section intitulée « Premier plan (par défaut) »Lorsqu’une tache s’exécute en premier plan, le terminal est bloqué pendant l’exécution.
node server.js# Tu ne peux plus rien taper ici tant que le serveur tourneArrière-plan
Section intitulée « Arrière-plan »Il faut simplement ajouter & à la fin de la commande
node server.js &# [1] 5678 — le shell affiche le numéro de job [1] et le PID 5678# Tu peux continuer à utiliser le terminalSuspendre, reprendre, basculer
Section intitulée « Suspendre, reprendre, basculer »# 1. Lance un processus au premier plannode server.js
# 2. Suspends-le avec Ctrl+Z# [1]+ Stopped node server.js
# 3. Reprends-le en arrière-planbg# [1]+ node server.js &
# 4. Liste les tâches du shelljobs# [1]+ Running node server.js &
# 5. Ramène-le au premier planfg %1# node server.js (le terminal est de nouveau bloqué)