thread
Transcription
thread
CNAM Threads Ordonnancement de Threads 2007/2008 Ivan Boule 1 CNAM Plan Concept de thread Etats d'une thread Ordonnancement Inversion de priorité API Thread Windows API Thread POSIX 2007/2008 Ivan Boule 2 CNAM Concept de Thread Notion combinant avantages : Exécution parallèle Partage code et données applicatifs communs Facile à mettre en oeuvre Programmable Contrôlable Configurable Efficace et "scalable" 2007/2008 Ivan Boule 3 CNAM Processus ≠ Thread Processus ne convient pas Contexte lourd, coûteux à créer et à détruire Pas efficace (changement de contexte lent) Contexte mémoire important Partage de données "pas naturel" Pas intégré dans langage de programmation Offerts par services OS complexes, pas souples Programmation difficile, non contrôlable 2007/2008 Ivan Boule 4 CNAM Thread – Objet Programmable Dérivée de notion de processus Unité d'exécution concurrente dans un même programme applicatif Threads partagent espace d'adressage mémoire du processus "englobant" Code, données globales, tas Exécutent même code ou fonctions dédiées Partagent tout ou partie ressources OS Contexte de travail privé alloué par application 2007/2008 Ivan Boule 5 CNAM Thread – Objet OS Unité d'exécution indépendante Pile(s) d'exécution(s) Mode utilisateur du CPU (pile applicative) Mode superviseur du CPU (pile système) Contexte CPU (registres) Etat courant et attributs d'ordonnancement Identificateur Entité d'attribution d'un CPU par ordonnanceur du système 2007/2008 Ivan Boule 6 CNAM Processus Multi-Threads Adresse haute Pile thread1 Taille max. fixe Pile thread2 Taille max. fixe Pile thread3 Taille max. fixe Tas (heap) malloc/free Taille variable Données Adresse basse 2007/2008 Code Ivan Boule Tailles fixes 7 CNAM Pile(s) d'exécution des threads Pile système Pile utilisée pour exécution des appels système Allouée/libérée par système Pile applicative Pile utilisée pour exécution du code applicatif Allouée/libérée par noyau (cas par défaut) application 2007/2008 Ivan Boule 8 CNAM Libération de la pile applicative Thread toujours créée par une autre thread Alloue mémoire pile applicative nouvelle thread Appelle OS pour créer nouvelle thread Threads se détruisent en général elles-mêmes : Pas de retour de l'appel système de destruction La thread qui se suicide ne peut pas libérer sa pile applicative avant d'appeller l'OS pour être détruite les 2 operations doivent aussi être exécutées par une autre thread 2007/2008 Ivan Boule 9 CNAM Thread et OS Unix POSIX threads – Unix, Linux Light-Weight Process (LWP) - Solaris Windows Mach/Mac-OS - Apple Systèmes temps-réels ChorusOS VxWorks (WindRiver) QNX, OSEK, Nucleus, etc... 2007/2008 Ivan Boule 10 CNAM Light-Weight Threads Threads niveau applicatif Implémentées par fonctions de bibliothèque Run-time langage programmation Pas de contexte OS Exécutées dans contexte thread(s) OS Appels système bloquants Bloque capacité d'exécution de toutes les LWT Sauf si pool de threads géré par OS (Solaris) 2007/2008 Ivan Boule 11 CNAM Threads et Langages de programmation Objet thread intégré dans langage ADA : objets de type Task Java : objets de la Classe Thread Implique support autres notions (synchro, etc.) Support concepts OS dans un langage +facile, +maîtrisé => +fiable (soit-disant...) -souple, - clair (mélange niveaux appli et OS) Comportement dépendant OS => Pbs portabilité 2007/2008 Ivan Boule 12 CNAM Plan Concept de thread Etats d'une thread Ordonnancement Inversion de priorité API Thread Windows API Thread POSIX 2007/2008 Ivan Boule 13 CNAM Etats d'une Thread courante préemption création élection attente événement (de fin d'E/S) suspendue prête bloquée réveil activation (en fin d'E/S) mort tuée destruction 2007/2008 détruite Ivan Boule 14 CNAM Transitions états de thread (1) Courante -> bloquée (mise en attente) Thread doit arrêter son exécution pour attendre l'arrivée d'un événement (fin d'E/S) => libère volontairement [ressource] CPU => OS alloue CPU à thread prête la + prioritaire Bloquée -> prête (réveil) Thread réveillée [par événement posté] par une [fonction d'] interruption (fin d'E/S) la thread courante (client/serveur) Rejoint groupe des demandeurs ressource CPU 2007/2008 Ivan Boule 15 CNAM Transitions états de thread (2) Prête -> élue (élection) CPU attribué à thread prête la + prioritaire pour donner le CPU à thread + prioritaire => thread préemptée par OS Élue -> prête (préemption) CPU retiré à la thread courante pour être attribué à thread + prioritaire Point(s) de préemption d'un OS Ordonnancement des threads 2007/2008 Ivan Boule 16 CNAM Points de Préemption du Système Réveil thread + prioritaire thread courante Quand/où OS préempte thread courante Coarse-Grain system Pas de préemption dans le noyau Préemption au retour d'un appel système Dépend durée exécution appel système Fine-Grain system Préemption dans le noyau Immédiate 2007/2008 Ivan Boule 17 CNAM Plan Concept de thread Etats d'une thread Ordonnancement Inversion de priorité API Thread Windows API Thread POSIX 2007/2008 Ivan Boule 18 CNAM Ordonnancement Choisir prochaine thread à exécuter Systèmes interactifs / Serveurs Threads variables, événements non prévisibles Partager ressource CPU dynamiquement Systèmes temps réel Temps-réel "dur" Garanti échéances de toutes les tâches Implique connaissance [pires] durées d'exécution Temps-réel "mou" Essai de garantir les échéances 2007/2008 Ivan Boule 19 CNAM Politiques d'ordonnancement Critères choix prochaine thread à exécuter Réduire temps moyen d'attente Garantir temps de réponse des threads + prioritaires Eviter phénomènes de famine Garantir un minimum [de temps CPU] à toutes Compromis avec contraintes Optimiser taux utilisation [autres] ressources Limiter fréquence changements de contexte Mise en oeuvre simple, maîtrisable, adaptable 2007/2008 Ivan Boule 20 CNAM Classes d'ordonnancement A l'ancienneté premier arrivé, premier servi ("FIFO") Par priorités Fixes, imposées par applications Variables, modifiées par OS : Durée d'attente écoulée [Prix des] ressources allouées à la thread Par quantum de temps (durée maximale) Par échéances 2007/2008 Ivan Boule 21 CNAM Méthodes d'ordonnancement Méthode du tourniquet ("Round-Robin") Une file d'attente par priorité FIFO + [re]mise en attente en fin de la file Priorité thread diminue après utilisation quantum Appliquée en mode applicatif Distinction entre plusieurs niveaux de priorités Threads temps-réelles Threads ordinaires 2007/2008 Ivan Boule 22 CNAM Plan Concept de thread Etats d'une thread Ordonnancement Inversion de priorité API Thread Windows API Thread POSIX 2007/2008 Ivan Boule 23 CNAM Inversion de Priorité Phénomène faisant qu'une thread de priorité inférieure est exécutée avant une autre thread plus prioritaire Conditions : Threads partagent dynamiquement une autre ressource exclusive [que le CPU] Allocation ressource exclusive découplée de celle du CPU Threads de priorités fixes 2007/2008 Ivan Boule 24 CNAM Inversion de Priorité (2) Prio(T1) < Prio(T2) < Prio(T3) Séquence d'opérations T1 acquiert accès exclusif à ressource R T1 préemptée par T3 T3 demande accès exclusif à ressource R T3 bloquée car R acquise par T1 T1 élue T1 préemptée par T2 => inversion de priorité entre T2 et T3 2007/2008 Ivan Boule 25 CNAM Héritage de Priorité Enregistre thread propriétaire ressource Quand thread + prioritaire tente acquérir ressource : Attribue à thread propriétaire priorité thread demandeuse Met en attente thread demandeuse En FIFO (pas de famine) Par priorité Thread propriétaire libère ressource : Transmet ressource à thread en attente Restaure priorité initiale de thread qui libère 2007/2008 Ivan Boule 26 CNAM Héritage de Priorité (2) T1 acquiert ressource R T1 préemptée par T3 T3 demande ressource R T3 bloquée car R acquise par T1 Attribue prio(T3) à T1 T1 élue avec priorité T3 T1 libère ressource R Ressource R transmise à T3 T1 reprend sa priorité initiale T3 élue 2007/2008 Ivan Boule 27 CNAM Priorité Plafond Augmente temporairement priorité de la thread propriétaire de la ressource à un maximum fixe (le "plafond") Évite préemptions inutiles Valeur du plafond déterminée par : Connaisance des threads demandeuses Criticité de la ressource acquise etc... 2007/2008 Ivan Boule 28 CNAM Plan Concept de thread Etats d'une thread Ordonnancement Inversion de priorité API Thread Windows API Thread POSIX 2007/2008 Ivan Boule 29 CNAM Création Thread Windows HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpsa, DWORD cbStack, LPTHREAD_START_ROUTINE lpStartAddr, LPVOID lpvThreadParm, DVOID fdwCreate, LPDWORD lpIdThread); 2007/2008 Ivan Boule 30 CNAM Paramètres CreateThread() LPSECURITY_ATTRIBUTES lpsa si TRUE, handle thread créée héritable DWORD cbStack Taille pile d'exécution thread créée LPTHREAD_START_ROUATINE lpStartAddr Adresse fonction exécutée par thread créée LPVOID lpvThreadParm Argument de la fonction 2007/2008 Ivan Boule 31 CNAM Paramètres CreateThread() DVOID fdwCreate Ensemble de « flags » LPDWORD lpIDThread Identificateur attribué par le système à la thread créée 2007/2008 Ivan Boule 32 CNAM Ordonnanceur Threads Windows Priorités entre 0 (min) et 31 (max) Priorité 0 à thread système spéciale (mise à zéro pages libres) Priorité d'une thread fonction de : Partie fixe appellée priotité de base Partie variable appellée priorité dynamique Ordonnancement selon la méthode du tourniquet Threads de même priorité en FIFO 2007/2008 Ivan Boule 33 CNAM Priorité de base thread Priorité de base fonction de la classe de priorité du processus IDLE_PRIORITY_CLASS (C1) Ex: écran de veille => 4 NORMAL_PRIORITY_CLASS (C2) => 7-9 priorité par défaut HIGH_PRIORITY_CLASS (C3) Ex : gestionnaire de tâches => 13 REALTIME_PRIORITY_CLASS (C4) => 24 2007/2008 Ivan Boule 34 CNAM Priorité dynamique Threads Priorité de toutes les threads d'un processus Augmentée de 2 lorsque processus passe au premier plan Priorité d'une thread Diminuée de 1 après son quantum de temps jusqu'à sa priorité de base 2007/2008 Ivan Boule 35 CNAM Changement Priorité Thread (1) BOOL SetThreadPriority(HANDLE hThread, int priority) THREAD_PRIORITY_LOWEST priorité thread = priorité de base processus – 2 THREAD_PRIORITY_BELOW_NORMAL priorité thread = priorité de base processus – 1 THREAD_PRIORITY_NORMAL priorité thread = priorité de base processus THREAD_PRIORITY_ABOVE_NORMAL priorité thread = priorité de base processus + 1 THREAD_PRIORITY_HIGHEST priorité thread = priorité de base processus + 2 2007/2008 Ivan Boule 36 CNAM Changement Priorité Thread (2) THREAD_PRIORITY_IDLE priorité thread = 16 si processus de classe REALTIME 1 sinon THREAD_PRIORITY_TIME_CRITICAL priorité thread = 31 si processus de classe REALTIME 15 sinon 2007/2008 Ivan Boule 37 CNAM Plan Concept de thread Etats d'une thread Ordonnancement Inversion de priorité API Thread Windows API Thread POSIX 2007/2008 Ivan Boule 38 CNAM POSIX Threads POSIX API pour programmes multi-threads Portable entre systèmes différents Restrictions concernant ressources OS partagées (fichiers ouverts, répertoire courant, etc) Inclut mécanismes de synchronisation Inclut support multi-processeurs CPU préférences 2007/2008 Ivan Boule 39 CNAM Création Thread POSIX #include <pthread.h> int pthread_create ( pthread_t* thread, pthread_attr_t* attr, void* (*start_routine)(void*), void* routine_arg); Thread crée dans l'état actif Pas d'état supplémentaire « non démarrée » API simple : un seul appel système pour créer une thread 2007/2008 Ivan Boule 40 CNAM Paramètres pthread_create() pthread_t* thread si OK, contient identificateur de la thread créée pthread_attr_t attr Si NULL, thread créée avec attributs par défaut void* (*start_routine)(void*) Adresse fonction exécutée par la thread void* routine_arg Argument de la fonction exécutée 2007/2008 Ivan Boule 41 CNAM Attributs d'une thread JOINABLE / DETACHED Taille de la pile Taille de la zone de protection de la pile Adresse de la pile Politique d'ordonnancement SCHED_FIFO : temps-réel SCHED_RR : préemptable SCHED_OTHER : ordinaire (non temps-réel) Priorité 2007/2008 Ivan Boule 42 CNAM Attributs de création Réunis dans une structure de données pthread_attr_init(pthread_attr_t* attr) Modifiables individuellement par fonctions dédiées pthread_attr_setdetachstate(pthread_attr_t* attr, int detachstate) Minimise coût de création de threads de même nature Priorité d'une thread peut être changée après sa création pthread_setschedprio(pthread_t thread, int prio) 2007/2008 Ivan Boule 43 CNAM Destruction Thread POSIX void pthread_exit(void* exit_status) exit_status : valeur de fin de thread courante Détruit thread courante – fonction sans retour int pthread_join(pthread_t thread, void** val_ptr) thread : thread cible val_ptr : pointeur vers valeur de fin thread terminée Bloque thread courante jusqu'à terminaison thread cible 2007/2008 Ivan Boule 44