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

Documents pareils