Академический Документы
Профессиональный Документы
Культура Документы
• Threads POSIX
– Création d’un thread
– Attente de la fin d’un thread
– Terminaison d’un thread
– Nettoyage à la terminaison
Processus et threads
1
Qu’est ce qu’un thread? (2)
• Un thread est une unité d’exécution rattachée à un processus, chargée
d’exécuter une partie du processus.
• Lorsqu’un processus est créé, un seul flot d’exécution (thread) est associé
au processus. Ce thread peut en créer d’autres.
• Chaque thread a :
– un identificateur unique
– une pile d'exécution
– des registres (un compteur ordinal)
– un état…
2
Qu’est ce qu’un thread? (4)
Avantages des threads / processus
3
Usage des threads (2)
Serveur Web
4
Threads utilisateur
(java threads, anciennes versions d’UNIX)
• Inconvénients :
5
Threads utilisateur (3)
Threads Java
• Les threads Java sont gérés par la machine virtuelle Java (JVM).
6
Threads noyau
• Les threads noyau sont directement
supportés par le système d’exploitation.
Inconvénients :
7
Threads noyau (3)
Linux
• Linux ne fait pas de distinction entre les processus et les threads qui sont
communément appelés tâches.
Threads hybrides
(Solaris 2)
8
Threads hybrides (2)
Solaris 2
• Solaris 2 implémente le multiflot selon le modèle plusieurs-à-plusieurs.
• 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 :
• Si tous les LWP sont bloqués et un thread est prêt à l’exécution, un autre LWP sera
fourni au processus pour exécuter ce thread.
• Les LWP inutilisés pendant un certain temps sont éliminés
9
Threads hybrides (4)
Windows
• Une application Win32 est composée d'
un ou plusieurs processus.
• 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).
• Un job permet à des groupes de processus d' être considérés comme une
unité. Les opérations exécutées sur un job affectent tous les processus du
job.
// Libérer la mémoire.
HeapFree(GetProcessHeap(), 0, pData);
return 0;
}
Systèmes d’exploitation Génie Informatique Chapitre 3. 20
École Polytechnique de Montréal
10
Threads hybrides (6)
Windows XP
void main()
{ PMYDATA pData;
DWORD dwThreadId[MAX_THREADS];
HANDLE hThread[MAX_THREADS];
for( int i=0; i<MAX_THREADS; i++ ) // Créer MAX_THREADS threads.
{ // Allocation dynamique de mémoire
pData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));
if( pData == NULL ) ExitProcess(2);
pData->val1 = i;
pData->val2 = i+100;
hThread[i] = CreateThread( NULL, // attributs de sécurité par défaut
0, // taille du stack par défaut
ThreadProc, // pointeur vers la fonction thread
pData, // argument de la fonction thread
0, // création de flags par défaut
&dwThreadId[i]); // retourne l’identificateur du thread
if (hThread[i] == NULL) ExitProcess(i); // Vérifier si l’identificateur est valide.
}
// Attendre la fin de l’exécution de tous les threads.
WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);
for(i=0; i<MAX_THREADS; i++) CloseHandle(hThread[i]); // Fermer tous les handles.
}
Systèmes d’exploitation Génie Informatique Chapitre 3. 21
École Polytechnique de Montréal
Threads POSIX
11
Threads POSIX (2)
Fonction pthread_create()
• int pthread_create(
pthread_t *tid,
// sert à récupérer le TID du thread créé
void *arg);
//le paramètre de la fonction.
• L'appel renvoie 0 s'il réussit, sinon il renvoie une valeur non nulle identifiant
l'
erreur qui s'
est produite
• Attend la fin d’un thread. L’équivalent de waitpid des processus sauf qu’on
doit spécifier le tid du thread à attendre.
pthread_t pthread_self(void);
12
Threads POSIX (4)
Fonction pthread_exit()
void pthread_exit( void * status);
• Termine l' exécution du thread
13
Threads POSIX (6)
Exemple 1 (suite)
void *threadC(void *inutilise)
{
afficher(150,' C');
printf("\n Fin du thread C\n");
fflush(stdout);
pthread_exit(NULL);
}
int main()
{
int i;
sleep(1);
//attendre que les threads aient termine
printf("Le thread principal attend que les autres se terminent\n");
pthread_join(thA,NULL);
pthread_join(thB,NULL);
exit(0);
}
Systèmes d’exploitation Génie Informatique Chapitre 3. 28
École Polytechnique de Montréal
14
Threads POSIX (8) Thread
Exemple 1 (suite) principal
Thread B Thread C
Thread A
pthread_join
pthread_exit
pthread_exit
pthread_exit
pthread_join
Systèmes d’exploitation Génie Informatique Chapitre 3. 29
École Polytechnique de Montréal
15
Threads POSIX (10)
Exemple 2 : Partage de variables
// programme threads.c
#include <unistd.h> //pour sleep
#include <pthread.h>
#include <stdio.h>
int glob=0;
void* decrement(void * x)
{
int dec=1;
sleep(1);
glob = glob - dec ;
printf("ici decrement[%d], glob = %d\n",pthread_self(),glob);
pthread_exit(NULL);
}
16
Threads POSIX (12)
Exemple 3 : Passage de paramètres à un thread
// Programme p11.1.cpp
#define _REENTRANT
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <pthread.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
using namespace std;
int MAX=5;
inline int gen_alea( int, int );
void *afficher( void * );
17
Thread POSIX (14)
Exemple 3 : Passage de paramètres à un thread (suite)
18
Thread POSIX (16)
// cancel1.c
#define _REENTRANT Exemple 4 : Annulation d’un thread
#include <pthread.h>
int main()
#include <unistd.h>
{
#include <stdio.h>
pthread_t th;
void _fclose (void *arg)
if (pthread_create(&th,NULL,mon_thread, NULL) )
{ printf("\n fclose\n"); fclose((FILE *)arg);}
perror("Erreur dans la création du thread");
void _unlink(void * arg)
sleep(3);
{ printf("unlink\n"); unlink((char*)arg);}
pthread_cancel(th); // annulation
}
void *mon_thread(void *inutilise)
{ FILE* un_fichier;
int i; d5333-09> cancel1
setvbuf(stdout, (char *) NULL, _IONBF, 0); 0123456789
if ((un_fichier = fopen("sortie.txt","w")) == NULL) fclose
perror("Erreur dans l'ouverture du fichier"); unlink
else { // pour une terminaison propre fin du programme
pthread_cleanup_push(_unlink, (void *) "sortie.txt");
pthread_cleanup_push(_fclose, (void *) un_fichier);
for (i=0; i<10; i++){
fprintf(un_fichier,"%d",i); fprintf(stdout,"%d",i); } pthread_cleanup_push et
pthread_cleanup_pop(1); // exécute fclose pthread_cleanup_pop indiquent les
pthread_cleanup_pop(1); // exécute unlink fonctions à appeler ainsi que l’ordre
} d’appels (en cas d’annulation)
} Terminaison propre
Systèmes d’exploitation Génie Informatique Chapitre 3. 37
École Polytechnique de Montréal
19
Thread POSIX (18)
Exemple 5 : Annulation d’un thread (suite)
int main()
{ int allocate = 1;
d5333-09> cancel2
pthread_t th; push free
// création d' un thread qui effectuera le bloc du if ici free 123
if (pthread_create(&th,NULL,mon_thread,(void*)&allocate)) fin du thread
perror("Erreur dans la creation du thread"); push notfree
sleep(1); ici notfree
pthread_cancel(th); fin du thread
allocate = 0;
fin du main
//création d' un thread qui exécutera le else du if
if (pthread_create(&th,NULL,mon_thread,(void*)&allocate) != 0)
perror("Erreur dans la creation du thread");
sleep(1);
pthread_cancel(th);
printf("fin du main\n");
}
20