11. Transition vers les threads
Le cours 05 amorce le module suivant. Un thread est un flot d'exécution à l'intérieur d'un processus. Un processus peut contenir un ou plusieurs threads.
Quatre configurations servent de repères : un processus à un thread, plusieurs processus à un thread chacun, un processus multithread et plusieurs processus multithreads. Elles séparent deux choix : isolation par processus et multiplicité des flots d'exécution dans chaque processus.
Les threads d'un même processus partagent :
- code;
- données globales;
- tas;
- plusieurs ressources ouvertes;
- espace d'adressage général.
Chaque thread possède cependant :
- compteur ordinal;
- registres;
- pile;
- état d'ordonnancement;
- identifiant et métadonnées de contrôle.
Une pile privée est nécessaire pour que chaque thread ait ses propres appels, paramètres et variables locales. Le partage rend la communication efficace, mais introduit les accès concurrents : deux threads peuvent modifier le même objet. Les mécanismes de synchronisation seront étudiés plus tard.
11.1 Concurrence et parallélisme
La concurrence signifie que plusieurs tâches progressent pendant une même période. Le parallélisme signifie qu'elles exécutent réellement des instructions au même instant sur plusieurs unités matérielles. Un système monocœur peut être concurrent sans être parallèle.
11.2 Exemple du serveur
Un thread accepte les nouvelles connexions tandis que des threads de travail traitent les requêtes. Une requête lente ne bloque donc pas nécessairement l'acceptation des autres. Les architectures possibles comprennent un thread par demande, un bassin fixe de travailleurs ou une file de tâches.
Le nombre de threads n'assure pas à lui seul une accélération. Le gain dépend des cœurs, des attentes, des portions séquentielles, de la contention et du coût de synchronisation.