🎯 Objectifs de la lecon
- •Définir la notion de processus et de thread
- •Expliquer le rôle de l'ordonnancement
- •Décrire les mécanismes de communication inter-processus (pipe, signal)
- •Comprendre l'exclusion mutuelle et la section critique
Un système d'exploitation doit exécuter plusieurs programmes à la fois. Pour cela, il utilise des processus et des threads. Ce cours explique comment ils fonctionnent, comment ils sont ordonnancés et comment ils communiquent.
Notion de processus
Un processus est un programme en cours d'exécution. Chaque processus possède son propre espace mémoire (code, données, pile) et son propre état (prêt, élu, bloqué, terminé).
Le système d'exploitation crée un processus via un appel système comme fork() sous Unix. Chaque processus a un identifiant unique (PID).
✔️ A retenir
Un processus est une instance d'un programme en exécution, isolée des autres processus.
Notion de thread
Un thread (ou fil d'exécution) est une unité d'exécution légère à l'intérieur d'un processus. Plusieurs threads d'un même processus partagent le même espace mémoire (code, données, fichiers ouverts).
Contrairement à un processus, un thread ne duplique pas les ressources. Cela rend la communication entre threads plus rapide, mais aussi plus risquée (accès concurrents).
« Un navigateur web peut avoir un thread pour l'interface utilisateur et un autre pour le téléchargement d'une page. »
Point fort : Les threads permettent de réaliser plusieurs tâches en parallèle sans dupliquer la mémoire.
Ordonnancement
L'ordonnancement est le mécanisme par lequel le système d'exploitation choisit quel processus ou thread exécuter à un instant donné. Il alterne très rapidement entre les processus pour donner l'illusion de simultanéité.
Les algorithmes d'ordonnancement courants sont : First-Come First-Served (FCFS), Round Robin (tourniquet) et Shortest Job First (SJF). Le Round Robin est souvent utilisé car il garantit un temps de réponse équitable.
⚠️ Attention
Ne confonds pas ordonnancement et parallélisme réel. Sur un processeur à un seul cœur, un seul processus s'exécute à la fois. L'ordonnancement donne l'impression de simultanéité.
Communication inter-processus (pipe et signal)
Les processus sont isolés. Pour échanger des données, ils utilisent des mécanismes de communication inter-processus (IPC). Deux mécanismes simples sont le pipe et le signal.
Un pipe est un canal unidirectionnel. Un processus écrit dans une extrémité, un autre lit à l'autre extrémité. Sous Unix, on crée un pipe avec la fonction pipe() et on l'utilise comme un fichier.
« La commande shell 'ls | wc -l' utilise un pipe : ls écrit la liste des fichiers, wc lit cette liste et compte les lignes. »
Point fort : Le pipe permet une communication simple et efficace entre processus parents et enfants.
Un signal est une notification asynchrone envoyée à un processus. Par exemple, le signal SIGINT (Ctrl+C) interrompt un processus. Un processus peut définir un gestionnaire de signal pour réagir à un signal.
⚠️ Attention
Un signal ne transporte pas de données, seulement un numéro. Pour échanger des données, utilise un pipe ou une mémoire partagée.
Exclusion mutuelle et section critique
Quand plusieurs threads ou processus accèdent à une ressource partagée (variable, fichier), il peut y avoir des conflits. On appelle section critique la partie du code qui accède à cette ressource.
L'exclusion mutuelle garantit qu'un seul thread à la fois exécute la section critique. Sans cela, des incohérences apparaissent (exemple : deux threads qui incrémentent une variable en même temps).
« Si deux threads exécutent 'compteur = compteur + 1' sans exclusion mutuelle, la valeur finale peut être fausse. »
Point fort : L'exclusion mutuelle protège l'intégrité des données partagées.
Un mécanisme simple d'exclusion mutuelle est le verrou (mutex). Avant d'entrer dans la section critique, un thread verrouille le mutex. Après, il le déverrouille. Si un autre thread tente de verrouiller le mutex, il attend.
✔️ A retenir
Une section critique doit être protégée par un mécanisme d'exclusion mutuelle (mutex) pour éviter les accès concurrents.
Erreurs fréquentes
Confondre processus et thread : un processus a sa propre mémoire, un thread partage la mémoire du processus parent.
Oublier de déverrouiller un mutex : cela bloque tous les autres threads qui attendent la ressource.
Croire qu'un pipe est bidirectionnel : un pipe standard est unidirectionnel. Pour une communication dans les deux sens, il faut deux pipes.
