Processus et threads
Progression
#Processus et threads
À quoi ça sert: structurer l’exécution en unités isolées (processus) ou légères (threads) pour paralléliser et répondre vite. Comment: le noyau planifie, et on synchronise l’accès aux données partagées.
#Processus vs threads
- Processus: espace mémoire séparé, isolation plus forte.
- Threads: partagent l’espace mémoire du processus, plus légers.
Cycle de vie des threads
Visualisez les transitions prêt/exécution/blocage pour différents profils de charge. Chaque jeton représente un thread concret.
Créé par le processus mais pas encore planifié
En file d’attente, attend un quantum CPU
Occupe un cœur CPU
Attend un événement externe ou un verrou
A libéré ses ressources
Création des threads
L’interface utilisateur (UI) vient d’être lancée, un worker I/O attend des requêtes disque, la tâche batch est en attente.
Le scheduler place UI devant pour respecter la réactivité.
- La priorité adaptative garde l’interface fluide sans affamer le batch.
- Le worker I/O retourne au pool après avoir signalé l’UI.
#Ordonnancement
- Préemptif vs coopératif; politiques RR, priorité, multi‑niveau; affinités CPU pour la localité de cache.
#Synchronisation
- Mutex, sémaphores, barrières; sections critiques et invariants.
Exemple (pseudo‑code) section critique protégée par mutex:
1mutex m;2int compteur = 0;3 4void travail() {5 lock(m);6 // section critique7 compteur += 1;8 unlock(m);9}
Deadlocks si l’ordre d’acquisition diffère; inversion de priorité; ABA sur structures lock‑free. Définissez des ordres globaux et utilisez des primitives atomiques adaptées.
#Pièges
- Deadlocks (attente circulaire), conditions de course, inversion de priorité.