Les Threads
Les Threads
Les Threads
Adouane 1
Le modèle de processus décrit jusqu’ici est un programme qui
s’exécute selon un chemin unique avec un seul compteur
ordinal, On dit qu’il a un flot de contrôle unique ou un seul
thread.
Dr.A.Adouane 2
Le processus est vu comme étant un ensemble de ressources
(code exécutable, segments de données, de fichiers, de
périphériques, etc.)
Dr.A.Adouane 3
Les threads sont des processus légers exécutés à l’intérieur d’un
processus
Dr.A.Adouane 4
Dr.A.Adouane 5
Réactivité Le processus continue à s’exécuter même si
certaines de ses parties sont bloquées.
Dr.A.Adouane 6
• Si plusieurs processus problème d’accès !
• Un thread pour interagir avec l’utilisateur,
• Un thread pour reformater en arrière plan,
• Un thread pour sauvegarder périodiquement le
document
Dr.A.Adouane 7
Serveur web sans threads: le serveur en attente récupère une
requête et la traite jusqu’à la fin avant de passer à une autre
Dr.A.Adouane 8
Le Dispatcher thread se charge de réceptionner les requêtes.
Dr.A.Adouane 9
Tout comme les processus, les threads peuvent prendre
plusieurs états:
Actifs : En cours d’exécution, qui utilise le processeur
Dr.A.Adouane 10
Dr.A.Adouane 11
Un thread inclut:
Dr.A.Adouane 12
Les threads autorisent les exécutions multiples dans le même
environnement de processus
Dr.A.Adouane 13
Dr.A.Adouane 14
Tout les threads ont le même espace d’adressage ils ont
les même variables globales
Dr.A.Adouane 15
Chaque thread possède sa propre pile (Stack)
Dr.A.Adouane 16
Les piles contiennent un bloc d’activation (Frame) pour
chaque procédure invoquée par le thread et qui n’a encore
rien retourné
Dr.A.Adouane 17
La majorité des systèmes permettent le multiflot
(multithreading). Ils sont offerts soit au niveau utilisateur, soit
au niveau noyau, on retrouve donc :
Dr.A.Adouane 18
Les threads utilisateur sont implantés dans une bibliothèque
(niveau utilisateur) qui fournit un support pour les gérer
Dr.A.Adouane 19
Le noyau gère les processus (table des processus) et ne se
préoccupe pas de l’existence des threads (modèle plusieurs-
à-un).
Dr.A.Adouane 20
Dr.A.Adouane 21
Les threads Java peuvent être créés en :
◦ dérivant la class Thread
◦ Implémentant l’interface Runnable
Dr.A.Adouane 22
À tout instant, au plus un thread par processus est en cours
d’exécution.
Dr.A.Adouane 23
Le thread utilisateur s’exécute au dessus d’un système d’exécution
(run time system) qui est une collection de procédures prenant en
charge les threads, et utilise les appels de fonction :
Dr.A.Adouane 24
Chaque processus a sa propre table de threads, les informations
nécessaires au redémarrage d’un thread prêt ou bloqué y sont
stocké
Dr.A.Adouane 25
Dans certains SE comme UNIX il est possible de prédire le
blocage de thread
Dr.A.Adouane 26
Si Select se bloque alors un autre thread est exécuter, quand il
fini on essaye encore le thread bloqué
Dr.A.Adouane 27
Si un programme appelle une instruction qui ne se trouve pas en
mémoire, un défaut de page se produit, le SE cherche l’instruction
manquante dans le disque.
Dr.A.Adouane 28
Sont directement supportés par le noyau du système
d'exploitation.
Dr.A.Adouane 29
Un processus peux ajuster les niveaux de priorité de ses
threads.
Dr.A.Adouane 30
Le noyau connait les threads et détient la table de threads
pour les suivre
Dr.A.Adouane 31
Dr.A.Adouane 32
La création et destruction de thread noyau est relativement
lourde
Dr.A.Adouane 33
Si un thread d’un processus déclenche un défaut de page, le
noyau peut facilement exécuter un autre thread du même
processus pendant que la page demandé est récupéré
Dr.A.Adouane 34
Linux ne fait pas de distinction entre les processus et les
threads qui sont communément appelés tâches.
Dr.A.Adouane 35
Inconvénients :
Les programmes utilisant les threads noyau sont moins portables que
ceux qui utilisent des threads utilisateur.
Dr.A.Adouane 36
Les avantages des threads noyau et utilisateur ont tenté d’être
combiné
Dr.A.Adouane 37
Le noyau ne connait que les threads noyau et les ordonnance
Dr.A.Adouane 38
Dr.A.Adouane 39
Solaris 2 implémente le multiflot selon le modèle plusieurs-à-
plusieurs.
Dr.A.Adouane 40
Il fournit une bibliothèque contenant des API pour la création et la
gestion de threads utilisateur et des LWP.
La bibliothèque se charge de :
◦ assigner un ou plusieurs LWP à un processus,
◦ multiplexer les threads utilisateur avec les LWP disponibles pour le processus.
◦ ajuster dynamiquement le nombre de LWP fournis au processus :
Dr.A.Adouane 41
Une application Win32 est composée d'un ou plusieurs processus.
Dr.A.Adouane 42
Une fibre est une unité d'exécution ordonnancée au niveau
utilisateur. Les fibres s’exécutent dans le contexte des threads
qui les ordonnancent (chaque thread peut avoir plusieurs
fibres).
Dr.A.Adouane 43
Linux ne fait pas de distinction entre les processus et les
threads.
Dr.A.Adouane 44
thread : pour récupérer l‘identité du thread qui est crée
attr : attributs du thread, Si attr est NULL, la valeur par défaut est prise
Dr.A.Adouane 45
Création de threads :
int pthread_create (pthread_t *thread ,
pthread_attr_t *attr,
void *nomfonction,
void *arg );
L'appel renvoie 0 s'il réussit, sinon il renvoie une valeur non nulle
identifiant l'erreur qui s'est produite
Dr.A.Adouane 46
Suspension de threads:
Dr.A.Adouane 47
Terminaison de threads:
void pthread_exit(void *valeur_de_retour);
Dr.A.Adouane 48
pthread_attr_setdetachstate() sert à établir l'état de
terminaison d'un processus léger :
Dr.A.Adouane 49
Un thread peut annuler ou terminer l’exécution d’un autre thread
(pthread_cancel).
Dr.A.Adouane 50
Si le thread dont on demande l'arrêt possède un verrou et ne
l'a toujours pas relâché, il y a un risque de laisser ce verrou
dans l'état verrouillé, il sera alors dans ce cas impossible de le
récupérer, pour éviter cela on utilise:
Dr.A.Adouane 51
Ces arguments sont dans l'ordre:
Dr.A.Adouane 52
Le programme thread-pid.c montre l'implantation de threads
dans GNU/Linux, ainsi que la récupération du pid du thread
Dr.A.Adouane 53
Dr.A.Adouane 54
L'exécution en tâche de fond de pthread-pid.c est :
MonPc > gcc -o pthread-pid thread-pid.c -lpthread
MonPc > pthread-pid &
[1] 24133
MonPc > pid de main = 24133
pid du thread fils = 24136
Dr.A.Adouane 55
On affiche les threads avec PS :
MonPc> ps x
PID TTY STAT TIME COMMAND
23928 pts/2 S 0:00 -tcsh
24133 pts/2 R 0:53 pthread-pid
24135 pts/2 S 0:00 pthread-pid
24136 pts/2 R 0:53 pthread-pid
24194 pts/2 R 0:00 ps x
Dr.A.Adouane 56
L’activation de l’ordonnanceur consistent à imiter le fonctionnement
des threads noyau avec les performances des threads utilisateur.
Dr.A.Adouane 57
Le noyau affecte un certains nombre de processeurs virtuels à
chaque processus, c’est ensuite le système d’exécution qui alloue
les CPU au thread
Dr.A.Adouane 58
Quand le noyau détecte un blocage de thread, il prévient le système
d’exécution du processus en envoyant à la pile le numéro du thread et
une description de l’erreur.
Dr.A.Adouane 59
Dans le cas d’une interruption matérielle, le processeur concerné
bascule en mode noyau, le thread est bloqué, deux cas possible:
Dr.A.Adouane 60
Les threads sont très utilisé dans les systèmes distribués, comme
dans un serveur ou les threads sont bloqués en attente d’une
requête à traiter.
Dr.A.Adouane 61
Dr.A.Adouane 62
Afin de mettre en place les threads spontanés, il est
nécessaire de mettre en place une planification, pour choisir
par exemple où crée le nouveau thread ( utilisateur/noyau)
Cette solution bien que rapide peut être risqué car un thread
qui bug dans le noyau peut causé beaucoup plus de problème
qu’un thread utilisateur.
Dr.A.Adouane 63
La conversion d’un code monothread en multithread n’ai pas
chose facile, il faut pour cela respecter certaines règles.
Dr.A.Adouane 64
Exemple: Dans Unix si un processus ou thread fait un appel
système qui n’aboutie pas, le code erreur généré est placé dans la
variable errno
Dr.A.Adouane 65
Dr.A.Adouane 66
Plusieurs solution existe pour ce problème:
Dr.A.Adouane 67
Dr.A.Adouane 68
Cette solution n’ai pas aussi facile a appliquer, en effet les
langage de programmation ne prévoient pas ce nouveau
niveau de variable
Dr.A.Adouane 69
Une solution plus lourde consiste à rajouter de nouvelle procédure
de bibliothèque pour crée, définir et lire ces variables globales
limitée aux threads :
Dr.A.Adouane 70
Afin d’accéder au variables on a besoin de deux appels pour
lire et écrire:
Dr.A.Adouane 71
Un autre problème se pose lors de la transformation vers le
multithreads, beaucoup de procédure de bibliothèque ne sont
pas réentrante ( réutilisable)
Dr.A.Adouane 72
Pendant que malloc fait la mise à jour de ces listes, il peut y
avoir des pointeurs qui ne pointes nulle part.
Dr.A.Adouane 73
Durant leurs exécution les threads peuvent utiliser des
signaux, des problèmes se posent également dans ce cas
pour la transformation vers le multithreads
Dr.A.Adouane 74
Également un autre problème est celui de la gestion de la pile.
En temps normal quand le noyau voit que le processus à une
pile qui déborde il l’augmente automatiquement.
Dr.A.Adouane 75
Beaucoup de problèmes peuvent donc surgir au moment du
passage du monothreads au multithreads ce qui pose des
problème de compatibilité
Dr.A.Adouane 76
Pour permettre la description et l'analyse d'un système de
tâches, plusieurs représentations graphiques existe :
le graphe de précédence
Dr.A.Adouane 77
Comme leur nom l’indique, les graphes de précédence
permettent de représenter les relations de précédence ( qui
précède l’autre) entre les taches
Dr.A.Adouane 78
Une relation de précédence sur un ensemble E est une relation
vérifiant les propriétés suivantes:
Dr.A.Adouane 79
Un système de tâches (E, <) est un ensemble E de tâches muni
d'une relation de précédence <
Dr.A.Adouane 80
La concurrence donne lieu à deux modes d’exécution, soit les
processus sont parallèles soit il sont séquentiels
Dr.A.Adouane 81
Un système de tâches peut se représenter sous forme de
graphe orienté.
Dr.A.Adouane 82
T1 T2 T3
Dr.A.Adouane 83
Règles de concurrence de Bernstein :
Soit R(Ti) l’ensemble des variables lut par les processus, et
W(Ti) l’ensemble des variables modifié par les processus
Deux taches Ti et Tj sont // si et seulement si :
◦ R(Ti) ∩ W(Tj) = Φ
◦ W(Ti) ∩ R(Tj) = Φ
◦ W(Ti) ∩ W(Tj) = Φ
Dr.A.Adouane 84
Il s'agit de représenter à travers un langage la mise en
séquence ou en parallèle des tâches d'un graphe de
précédence.
Dr.A.Adouane 85
On utilise également :
Dr.A.Adouane 86
Afin de pouvoir utiliser ces outils de programmation, il est
nécessaire de bien écrire les relations de parallélisme et
séquentiellement: T1 T2 T3
T4
T5
Dr.A.Adouane 87
T1//{(T2//T3).T4}.T5
Begin T1 T2 T3
◦ Parbegin
◦ T1
◦ Begin
Parbegin T4
T2,T3
Parend
T4
◦ End T5
◦ Parend
◦ T5
End
Dr.A.Adouane 88
Begin
n=2
T1 T2 T3
m=2
◦ Fork (E2)
◦ Fork (E3)
◦ T1 goto E5
◦ E2 : T2 goto E4 T4
◦ E3: T3 goto E4
◦ E4: join n
T4
◦ E5: join m
T5 T5
End
Dr.A.Adouane 89
https://fr.wikipedia.org/wiki/Système_déterministe
http://www.enseignement.polytechnique.fr/profs/informatiqu
e/Eric.Goubault/poly/cours002.html#SIMD
http://www.groupes.polymtl.ca/inf2610/documentation/note
s/chap4.pdf
http://www.di.ens.fr/~pouzet/cours/systeme/cours04/cours
-04.pdf
http://www.groupes.polymtl.ca/inf3600/TransparentsAut200
6/Ch3INF3600.pdf
Système d’exploitation, 3eme édition, Andrew tanenbaum.
Dr.A.Adouane 90