Module Systèmes dexploitation Chapitre 7 Threads Partie II École Normale Supérieure Tétouan...
Transcript of Module Systèmes dexploitation Chapitre 7 Threads Partie II École Normale Supérieure Tétouan...
ModuleModuleSystèmes d’exploitationSystèmes d’exploitation
Chapitre 7
Threads
Partie II
École Normale SupérieureÉcole Normale SupérieureTétouanTétouan
Département InformatiqueDépartement Informatique
2008-2009
2
RevueRevue
• Décrivez les différences entre un processus et un thread
3
SynopsisSynopsis
• Théorie d’implémentation des Threads– Espace de l’utilisateur– Noyau– Implémentations hybrides
• Implémentations Spécifique– Activations de l’ordonnanceur– Threads spontanés (Pop-Up)
• Rendre le code monothread à multithread
4
• Comment les paquetages de threads sont implémentés?
• Deux places possible:– Espace de l’utilisateur– Noyau
• Choix est controversé: complexité vs. efficacité
Théorie d’implémentation des threadsThéorie d’implémentation des threads
5
Threads dans l’espace utilisateurThreads dans l’espace utilisateur
• Met le concept des threads entièrement dans l’espace utilisateur– Le noyau ne sait rien d’eux– Le noyau pense qu’il organise des processus
monothread
• Structure:– Les threads exécutent pardessus un système
d’exécution (run-time system) (moteur d’exécution)• Une collection de procédures qui gèrent les threads• thread_create(),thread_exit(),thread_wait(), thread_yield(), et plus...
6
• Chaque processus a besoin d’une table de threads–Similaire à une table de
processus, mais traque seulement:
• Compteur ordinal• Pointeur de pile• Registres• État
• Table est gérée par le système d’exécution
Threads dans l’espace utilisateurThreads dans l’espace utilisateur
7
Threads dans l’espace utilisateurThreads dans l’espace utilisateur
• Avantages:– Permet l’implémentation de threads sur un système
d’exploitation qui ne les supporte pas– Très vite parce qu’aucune TRAP au noyau n’est
requise... L’implémentation est entièrement dans l’espace utilisateur
– Chaque processus peut avoir son propre algorithme d’ordonnancement sur mesure en changeant le système d’exécution
– Facile à être extensible parce que cela requiert seulement de la mémoire extra au lieu de l’espace dans le noyau pour les tables et la pile
8
Threads dans l’espace utilisateurThreads dans l’espace utilisateur
• Désavantages:– Comment implémenter les appels de système
bloquants?• Si un thread appel getKey(), tout le processus va
bloquer… c’est inacceptable• Solutions incluent changer le système d’exploitation pour
créer des appels non-bloquants (pas désirable) ou placer du code intervenant au tour des fonctions de bibliothèque (un jacket ou wrapper) ceci n’est pas élégant ou recommandé
– Les défauts de pages sont un problème semblable aux appels de système bloquants
9
Threads dans l’espace utilisateurThreads dans l’espace utilisateur
• Désavantages:– Un thread peut tourner en rond et ne jamais retourner
le contrôle au système d’exécution. C’est un problème pour un système à processus unique (pas d’interruption)
– Les threads sont habituellement utilisés pour les applications où il y aura beaucoup de blocages (ie: Serveur Web)
– Parce que le blocage arrive durant les appels de système
• Les traps doivent être exécuté dans le noyau de toute façons.
• Une fois dans le noyau pour servir l’appel, il ne demande pas beaucoup plus de travail de changer de thread en même temps…
10
• Met le concept des threads dans le noyau
– Pas besoin de moteur d’exécution
– Le noyau a une table de threads
– Les threads font des appels de système pour la création/terminaison
– Le noyau tiens l’information des threads: registres, état, etc...
Threads dans le noyauThreads dans le noyau
11
• Considérations de design :– Tout appel qui peut bloquer un thread doit être
implémenté comme un appel de système (donc plus de fonctions dans la bibliothèque sont des appels de système). Ceci résulte en plus de temps de système (overhead!)
– Quand un thread bloque, le noyau doit décider ou bien de donner le contrôle à un autre thread dans le même processus ou dans un autre processus (peut être moins désirable pour le processus qui perd sa place)
– Certains systèmes n’efface pas les threads, mais les sauvegarde pour être recyclés
Threads dans le noyauThreads dans le noyau
12
Threads dans le noyauThreads dans le noyau
• Avantages:– Beaucoup moins compliqué– Pas besoin de nouveau appels non-bloquants– Les défauts de page n’arrêtent pas les autres threads
dans le processus d’exécuter
• Désavantages:– Les coûts d’un appel de système sont substantiels, et
les threads dans le noyau vont en demander beaucoup plus
13
• Essaie de prendre avantage des deux designs– Les threads utilisateurs et noyaux
sont implémenté là où ils seront plus efficaces
– Maintenant un défaut de page ne causera pas nécessairement le blocage d’un processus entier
– Avantage: Le plus efficace– Désavantage: De loin la solution
la plus compliquée
Implémentations hybridesImplémentations hybrides
14
• Activations de l’ordonnanceur– But est de combiner la bonne performance des
threads utilisateurs avec la simplicité des threads noyaux
– En particulier le système que l’on désire va:• Les threads utilisateurs ne devraient pas avoir à faire
seulement des appels non-bloquants ou avoir à vérifier si un appel va bloquer avant de faire l’appel
• Permettre à d’autres threads dans le processus d’exécuter quand un thread bloque
• Éviter les transitions inutiles entre l’espace utilisateur et noyau
– (ie: laisser un thread se bloquer dans processus si il veut en attendre un autre sans faire intervenir le noyau)
Implémentations spécifiquesImplémentations spécifiques
15
Implémentations spécifiquesImplémentations spécifiques
• Activations de l’ordonnanceur– Opération du système:
• Le noyau assigne un nombre de processeur virtuels à chaque processus
• Le système d’exécution dans l’espace utilisateur alloue des threads à ces processeurs
• Si un thread bloque sur un appel de système, le noyau fait un appel au système d’exécution (upcall) pour l’informer de quel thread a bloqué et pourquoi
• Le système d’exécution peut réordonnancer ses threads• Plus tard un autre upcall du noyau informe le système
d’exécution que le thread est de nouveau capable d’exécuter
16
Implémentations spécifiquesImplémentations spécifiques
• Activations de l’ordonnanceur– Opération du système:
• Les interruptions basculent encore en mode noyau. Si l’interruption n’était pas pour le processus en exécution, elle est traitée et le même thread est réactivé plus tard
• Si l’interruption était pour un thread dans le processus courrant, alors le noyau réveille le système d’exécution et le laisse décider quel thread doit exécuter
– Quel est le gros problème avec ce système???• Upcalls violent le principe des systèmes en couches• Beaucoup plus difficile d’entretenir et facile de faire des
erreurs
17
Implémentations SpécifiquesImplémentations Spécifiques
• Threads spontanés (pop-up)– La façon traditionnel de traiter les entrées dans les
applications distribuées est d’avoir un thread bloqué sur un appel de système: receive
– Au lieu de cela le SE peut créer un nouveau thread quand de l’information arrive• Vite parce que on a pas besoin de restaurer l’état du thread
bloqué• Les threads peuvent partir et exécuter dans l’espace noyau ce
qui donne accès au tables dans le noyau, périphériques d’E/S, etc… VITE!
• Cependant ceci veut dire que un thread bogué pourrait faire des ravages dans le noyau...
18
Monothread à multithreadMonothread à multithread
• Quelles sont les difficultés pour convertir un programme monothread à multithread? – Variables globales– Procédures de bibliothèques non-réentrantes– Signaux, comme ceux du clavier– Gestion de la pile
19
Monothread à multithreadMonothread à multithread
• Variables Globales– Multithreads qui utilisent les mêmes variables peuvent
causer des problèmes
20
Monothread à multithreadMonothread à multithread
• Procédures de bibliothèque non-réentrantes– On se souvient que les bibliothèques sont compilés
pour chaque programme et existent dans chaque processus (liens pour DLL)
– Qu’est-ce qui arrive si une procédure assemble un message pour réseau dans une mémoire tampon et qu’un appel à cette même procédure est faite d’un autre thread?
– Réparer ces problèmes peut demander la re-programmation entière de bibliothèques!
21
Monothread à multithreadMonothread à multithread
• Signaux– Si un thread demande un service du noyau, tel qu’un
alarme, comment ce signal est livré au bon thread?• Le noyau ne connaît rien des threads en mode usagers!
– Avec les multithreads, quel thread va avoir la notification qu’une clef a été pressée?
• Piles– Normalement les piles grandissent automatiquement– Le noyau ne connaît rien des piles individuelles
22
Quiz Time!Quiz Time!
Questions?