Les Threads

Transcription

Les Threads
Les Threads
Benmoussa Yahia
Université M’hamed Bougara de Boumerdès
[email protected]
http://syscours.kilu.de
Objectifs
„ Définir la notion de Thread
„ Modèles de programmation par processus et par
Thread
„ Implémentation des threads (espace noyau vs
espace utilisateur)
„ Bibliothèque pthreads sous Linux
2
Programmation multitâche
„ Le multitâche est nécessaire au sein d’une même
application. Ex :
– Navigateur web : Afficher une page web //
Récupérer des information du réseau
– Traitement de texte : Afficher du texte //
Récupéré les données tapées par l’utilisateur
sur le clavier
3
Programmation multitâche par processus
„ Créer un processus par tâche
„ Chaque processus dispose de ses propres
ressources
4
Programmation multitâche par processus
„ Inconvénients :
– L’appel fork() est consommateur de
ressources.
– Chaque processus dispose de sa propre zone
mémoire Î Difficulté pour le partage des
données.
5
Les Threads
„ Processus léger (lightweight processes)
„ Sous-processus qui s’exécute au sein d’un même
processus
„ Plusieurs thread partage les même ressources
(Mémoire, Fichiers, …etc)
6
Les Threads
text
Registre
data
fichiers
Ressources
communes
stack
Ressource
privées
Processus mono-thread
text
data
fichiers
Registre
Registre
Registre
stack
stack
stack
Processus multi-threads
7
Les Threads
„ Avantages :
– Création d’un thread est plus rapide que la
création d’un processus
– Un thread consomme moins de ressources
qu’un processus (Partage de ressources)
– La communication entre thread est plus
facile: Utilisation des variables globales
8
Implémentation des threads
„ Threads dans l’espace utilisateurs
„ Threads dans l’espace noyau
9
Threads dans l’espace utilisateurs
„ Les Threads son gérés dans l’espace utilisateur à
l’aide d’une bibliothèque (Tables de threads,
Ordonnancement, commutation, …)
10
Threads dans l’espace utilisateurs
Processus
Thread
Système de gestion
De threads
Tables de threads
Espace
utilisateur
Espace
noyau
Noyau
Tables de
processus
11
Threads dans l’espace utilisateurs
„ Avantages :
– Transparence par rapport au système
d’exploitation (portabilité)
– Performance : La gestion des threads se fait
à l’aide de procédure locales, pas d’appels
système.
– Algorithme d’ordonnancement des threads
propre à chaque processus
12
Threads dans l’espace utilisateurs
„ Inconvénients
– Si un Thread se bloque(appel system
bloquant. Ex : E/S) Î Tout le processus se
bloque.
– Si un thread est corrompu (Ex : Violation
mémoire) Î Tout le processus est arrêté.
– Les threads d’un même processus ne
peuvent pas s’exécuter sur des processeurs
différents.
13
Threads dans l’espace noyau
„ Les Thread sont gérés par le systèmes d’exploitation
14
Threads dans l’espace noyau
Processus
Thread
Tables de threads
Espace
utilisateur
Espace
noyau
Noyau
Tables de
processus
15
Threads dans l’espace noyau
„ Avantages :
– Quand un thread se bloque, le noyau peut
exécuter un autre thread du même
processus.
– Exécution des threads d’un même processus
sur plusieurs processeurs
16
Threads dans l’espace noyau
„ Inconvénients
– Création/ gestion des threads nécessite des
appel système Î lourdeur.
17
Les threads dans Linux
„ Les deux implémentation (Utilisateur et Noyau) sont
supportées.
– Espace utilisateur : Bibliothèque Pthreads
• Portable threads
• Implémentation de la norme POSIX.1c
– Espace noyau : appel system clone()
18
La bibliothèque Pthread
„ Création, terminaison et attente d’un thread :
pthread_create(), pthread_exit(), pthread_join()
„ Passage de paramètres et récupération des résultats
19
#include <pthread.h>
void *thread_function(void *arg);
int main() {
int res;
pthread_t a_thread;
void *thread_result;
res = pthread_create(&a_thread, NULL, thread_function, (void
*)message);
if (res != 0) { perror(“Erreur lors de la création du thread");
exit(EXIT_FAILURE);
}
printf(“Attente de la fin d’exécution du thread...\n");
res = pthread_join(a_thread, &thread_result);
printf("Thread joined, it returned %s\n", (char *)thread_result);
printf("Message is now %s\n", message);
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg) {
printf(“Début d’exécution du thread %s\n");
sleep(3);
pthread_exit("Thank you for the CPU time");
}
20
Appel système clone()
„ Linux ne fait pas la différence entre processus et
threads
„ L’appel système clone() permet de créer un
processus fils qui partage des ressource avec le
processus parent.
„ Les ressource à partager peuvent êtres spécifié à
l’aide de flags :
– CLONE_FS
– CLONE_VM
– CLONE_FILES
21