Vous êtes sur la page 1sur 4

Travaux dirigés Système d’exploitation 2

Série des travaux dirigés N°1 - Threads


Les threads sont des contextes d'exécution uniques avec leur propre jeu de registres et leur
pile. Les threads sont parfois appelés "processus légers".
Bloc de contrôle des threads (TCB)
Les composants qui sont partagés entre les threads d'un même processus (par exemple, le
tas, les variables globales) ne doivent pas être conservés par chaque thread individuel.
Toutefois, le thread doit toujours conserver les registres et sa pile dans le bloc de contrôle
du thread (TCB).

Syscalls
POSIX dispose d'une bibliothèque pthread qui contient des appels système pour les
threads, similaires aux appels système des processus.
int pthread create(pthread t *thread, const pthread attr t *attr, void *(*start routine) (void *), void *arg)
Démarre un nouveau thread dans le processus appelant. Le thread commence son
exécution en invoquant start routine qui prend arg comme seul argument.
void pthread exit(void *retval)
Termine le thread appelant et stocke une valeur dans retval qui est disponible pour un
autre thread dans le même processus qui se joint. De la même manière qu'un retour
de main appelle implicitement exit pour les processus, un retour de start routine appelle
implicitement pthread exit.
int pthread yield(void)
Le thread appelant renonce à l'unité centrale et est placé à la fin de la file d'attente
d'exécution.
int pthread join(pthread t thread, void **retval)
Le thread appelant attend que thread se termine. Pour un retval non-NULL, l'état de sortie
du thread (c'est-à-dire celui de pthread exit) est rendu disponible dans retval.

1/1
Travaux dirigés Système d’exploitation 2
Exercice 1
Quelles sont les sorties possibles du programme suivant ? Comment pouvez-vous modifier
le programme pour qu'il imprime "HELPER" avant "MAIN" ?

• La sortie du programme peut être "MAINHELPER", "HELPERMAIN", ou "MAIN". Le


pthread yield ne garantit pas que le helper sera exécuté en premier. Alors que le
thread principal abandonnera le CPU, il n'y a aucune garantie que le thread helper
entier s'exécute avant que le CPU soit rendu au thread principal. Il peut même
arriver que le thread principal s'exécute entièrement avant que le thread helper
n'exécute l'instruction print. Lorsque le thread principal exécute return, le processus
l’exécute également puisqu'il sort de la fonction principale. Cela tuera le processus
et donc les threads qui lui sont associés.
• Un simple x consiste à remplacer le pthread yield par un pthread join. Avec ce
changement, le thread principal attendra que le thread helper soit revenu, ce qui
signifie que "HELPER" sera toujours imprimé avant "MAIN".

2/1
Travaux dirigés Système d’exploitation 2
Exercice 2
Que doit afficher le programme suivant ?

Comme les deux threads sont dans le même processus, ils partagent le même espace
d'adressage. Même si chaque thread a sa propre pile, un espace d'adressage partagé
signifie que les threads du même processus peuvent accéder aux piles des autres. En
conséquence, le thread helper modifiera i dans le thread principal, donnant un résultat de
"i est 2".

3/1
Travaux dirigés Système d’exploitation 2
Exercice 3
Que doit afficher le programme suivant ?

Le programme peut imprimer soit "I am the main", soit "I am the helper". pthread join est
appelé après le printf, ce qui signifie que l'ordre d'exécution n'est pas garanti par
l'instruction printf.

4/1

Vous aimerez peut-être aussi