You are on page 1of 14

Le mod` ele de threads Probl` emes dimpl ementation

Les threads
Etienne Lozes
ENS Cachan

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

Des processus aux threads


1 processus = 1 unit e dex ecution + 1 unit e de ressources
fichiers signaux

=
kill mmoire

kill

Thread (ou processus l eger) : unit e dex ecution au sein dune unit e de ressources.
fichiers signaux

Processus multithreads :
mmoire

kill

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

Les threads : comment ca marche


Chaque thread a une copie compteur ordinal registres pile dappel etat ordonnancement Les threads se partagent lespace dadressage, les variables globales les chiers ouverts les signaux (+/-)
D emo : thread1.c, thread concur.c

int fact(int n){ [...]} int i ; pthread_t thr[2] ; int arg[2] ; void *thr f(void *param) { int x = fact(*param+i) ; i++ ; return NULL ; } int main([..]) { [..] pthread_create(thr,NULL,thr f,arg) ; pthread_create(thr+1,NULL,thr f, arg+1) ; // suite=thread principal }

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

Les threads : comment ca marche


Chaque thread a une copie compteur ordinal registres pile dappel etat ordonnancement Les threads se partagent lespace dadressage, les variables globales les chiers ouverts les signaux (+/-)
D emo : thread1.c, thread concur.c

int fact(int n){ [...]} int i ; pthread_t thr[2] ; int arg[2] ; void *thr f(void *param) { int x = fact(*param+i) ; i++ ; return NULL ; } int main([..]) { [..] pthread_create(thr,NULL,thr f,arg) ; pthread_create(thr+1,NULL,thr f, arg+1) ; // suite=thread principal }

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

Les threads : comment ca marche


Chaque thread a une copie compteur ordinal registres pile dappel etat ordonnancement Les threads se partagent lespace dadressage, les variables globales les chiers ouverts les signaux (+/-)
D emo : thread1.c, thread concur.c

int fact(int n){ [...]} int i ; pthread_t thr[2] ; int arg[2] ; void *thr f(void *param) { int x = fact(*param+i) ; i++ ; return NULL ; } int main([..]) { [..] pthread_create(thr,NULL,thr f,arg) ; pthread_create(thr+1,NULL,thr f, arg+1) ; // suite=thread principal }

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

Quelques fonctions utiles

(void *) pthread create( pthread t *thread, const pthread attr t *attr, void *(*start routine)(void *), void *arg) ;

void pthread exit(void *value ptr) ;

int pthread join(pthread t thread, void **value ptr) ; Attributs principaux : pile (taille et adresse), etat (joignable ou d etach e), ordonnancement.
Etienne Lozes Les threads

Le mod` ele de threads Probl` emes dimpl ementation

La programmation multithread : cest bien !

Structure modulaire du code re et ee ` a lex ecution. Gain conceptuel syst` eme r eactif, programmation ev enementielle, mod` ele client/serveur, thread spontan e. d emo : serveur multithread. Gain de temps appels bloquants cr eation peu co uteuse commutation rapide gestionnaire m emoire non sollicit e

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

La programmation multithread : cest risqu e!


On travaille en m emoire partag ee : attention aux eets de bord ! Utiliser des fonctions r eentrantes Une fonction est dite r eentrante si elle peut etre appell ee simultan ement par plusieurs threads et renvoyer pour chacun le r esultat identique ` a celui attendu en contexte mono-thread. Exercice Donnez un exemple de fonction non r eentrante. La plupart des fonctions normalis ee POSIX sont r eentrantes saufs quelques exceptions : struct dirent *readdir(DIR *dirp) ; long random(void)
Etienne Lozes Les threads

Le mod` ele de threads Probl` emes dimpl ementation

La programmation multithread : cest risqu e ! (suite)

Exercice Quels probl` emes le partage entre plusieurs threads du tas et des ressources processus pose-t-il ? La variable errno

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

La programmation multithread : cest risqu e ! (suite)

Exercice Quels probl` emes le partage entre plusieurs threads du tas et des ressources processus pose-t-il ? La variable errno Les signaux :
synchrone pour le fautif, asynchrone pour une des threads en attente de signaux deux niveaux de masque.

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

La programmation multithread : cest risqu e ! (suite)

Exercice Quels probl` emes le partage entre plusieurs threads du tas et des ressources processus pose-t-il ? La variable errno Les signaux :
synchrone pour le fautif, asynchrone pour une des threads en attente de signaux deux niveaux de masque.

Les forks : 1 seule thread dupliqu ee, sauf en Solaris o` u elles sont toutes dupliqu ees.

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

Threads noyau et threads utilisateur


Implmentation threads noyau Implmentation threads utilisateur
ordonnanceurs interne

ordonnanceur systme

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

Threads noyau et threads utilisateurs (2)

Avantages des threads utilisateur pas dappels syst` eme pour leur gestion commutation rapide on peut xer lordonnancement (ex : bien avec un gc) Inconv enients des threads utilisateur les appels syst` emes bloquants bloquent tout le monde utiliser des appels non bloquants. Probl` eme du d efaut de page. En pratique : threads noyau ou hybrides.

Etienne Lozes

Les threads

Le mod` ele de threads Probl` emes dimpl ementation

Finesses dimpl ementation


Le recyclage de thread On economise la cr eation de ressources syst` eme en r eutilisant des ressources dun thread r ecemment achev e.

Les impl ementations hybrides (ex :SOLARIS)

Le m ecanisme dupcall Le noyau pr evient lordonnanceur utilisateur quun thread est susceptible de changer d etat.
Etienne Lozes Les threads

You might also like