Gestion des processus et threads OS
Gestion des processus et threads OS
Du programme au processus
Gestion des processus par l’OS
Processus
Threads
Processus et threads
ASR période 3
Sylvain Jubertie
[Link]@[Link]
1 / 182
Contexte
Du programme au processus
Gestion des processus par l’OS
Processus
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
2 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
3 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
4 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
Terminologie
Programme
Un programme est un fichier source écrit dans un langage donné,
par exemple un programme C, C++, ou Java.
Processus
Un processus est un programme binaire en cours exécution par le
système d’exploitation.
5 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
Definition
Un processus est constitué d’un programme binaire : instructions +
données statiques, associé à un contexte d’exécution :
pile + tas
données dans les registres du processeur
instruction courante
6 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
7 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
Systèmes d’exploitation
8 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
9 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
Architectures actuelles
Multi-processeurs
Plusieurs processeurs sont présents sur une même carte mère.
10 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
Architectures actuelles
Multi-coeurs
Chaque processeur contient plusieurs coeurs qui peuvent partager
du cache.
11 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
Architectures actuelles
Hyper-threading (SMT)
Le processeur physique comporte plusieurs processeurs logiques
chacun disposant de ses propres registres mais le pipeline, le cache
et le bus sont partagés.
12 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
13 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
Enjeux
Multitâche
Effectuer plusieurs tâches sur une machine !
Utilisation bureautique : écouter de la musique en surfant sur
le web, . . .
Utilisation serveur : Gérer plusieurs serveurs sur une machine,
plusieurs machines virtuelles, . . .
14 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
Enjeux
Performance
Répartir les calculs sur plusieurs processeurs pour augmenter les
performances.
Performance
Il est de plus en plus difficile d’augmenter la fréquence des
processeurs (limite physique et coût). L’augmentation des
performances passe donc aujourd’hui par l’utilisation de plusieurs
processeurs.
15 / 182
Contexte
Terminologie
Du programme au processus
Systèmes d’exploitation
Gestion des processus par l’OS
Architectures
Processus
Enjeux
Threads
Enjeux
16 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
17 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
18 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
19 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Organisation
Un processus est constitué de plusieurs segments :
text : contient le code exécutable et les constantes
data : contient les variables statiques et globales :
initialisées (DATA)
non initialisées (BSS : Block Started by Symbol)
20 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
BSS
DATA
programme
text
21 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Exemple hello1.c
#i n c l u d e < s t d i o . h>
i n t main ( ) {
p r i n t f ( ” H e l l o World \n” ) ;
return 0;
}
size hello1
22 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Exemple hello2.c
#i n c l u d e < s t d i o . h>
i n t main ( ) {
p r i n t f ( ” H e l l o World ! \ n” ) ;
return 0;
}
size hello2
23 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Conclusion
Les chaı̂nes constantes sont stockées dans le segment avec le code
dans le segment text !
Autres variables
Où sont stockées les autres variables ?
24 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Exemple hello3.c
#i n c l u d e < s t d i o . h>
int i ;
i n t main ( ) {
p r i n t f ( ” H e l l o World ! \ n” ) ;
return 0;
}
size hello3
25 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Exemple hello4.c
#i n c l u d e < s t d i o . h>
i n t i =5;
i n t main ( ) {
p r i n t f ( ” H e l l o World ! \ n” ) ;
return 0;
}
size hello4
26 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Conclusion
Les variables globales sont stockées dans les segments :
DATA si elles sont initialisées
BSS si elles ne sont pas initialisées
Remarque : les variables initialisées explicitement à 0 sont
considérées comme non initialisées.
27 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Exemple hello5.c
#i n c l u d e < s t d i o . h>
c o n s t i n t i =5;
i n t main ( ) {
p r i n t f ( ” H e l l o World ! \ n” ) ;
return 0;
}
size hello5
28 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Conclusion
Les constantes même définies comme des variables sont stockées
dans le segment text !
29 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
Exemple prog1.c
i n t var1 = 9 , var2 = 0 , var3 ;
const i n t var4 = 5;
i n t main ( ) {
i n t var5 ;
}
30 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
31 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Programme exécutable
var5 ? ? ?
Mais où est passée var5 ?
32 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
33 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Objectif
Placer le programme exécutable, stocké sur le disque, dans la
mémoire physique pour l’exécuter. Le chargeur de l’OS doit
également ajouter des segments pour gérer entre autre la pile et le
tas.
Mémoire réelle
La mémoire réelle, ou physique, correspond à la quantité de
mémoire installée sur le système. Elle peut être vue comme un
tableau d’octets.
34 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Attention !
Sous Linux le processus ne s’exécute pas en mémoire réelle mais
en mémoire virtuelle.
35 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
36 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
37 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Processus de chargement
38 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
39 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
40 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
mémoire réelle
8
processus
#page #case 7
P4 P3 6
P4 3
P3 5
P3 6
P2 4
P2 1
P1 P4 3
P1 2
tables des pages P1 2
P2 1
41 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
42 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Processus en mémoire
Segmentation
Un processus est constitué de plusieurs segments :
text : contient le code exécutable et les constantes
data : contient les variables statiques et globales :
initialisées (DATA)
non initialisées (BSS : Block Started by Symbol)
ainsi que le heap (tas) pour les données alouées
dynamiquement (malloc en C)
stack (pile) : contient les variables locales
43 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Processus en mémoire
adresse haute
stack
heap
espace
BSS d'adressage
DATA
text
adresse basse
44 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Processus en mémoire
45 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Processus en mémoire
Segments et pages
46 / 182
Contexte
Du programme au processus Programme exécutable
Gestion des processus par l’OS Chargement du programme en mémoire
Processus Processus en mémoire
Threads
Processus en mémoire
démo
47 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
48 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
Introduction
49 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
50 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
Informations
ps
Utilisation
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
52 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
top ou htop
running
sleeping
stopped
zombie !
53 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
54 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
Signaux
kill
KILL
CONT
STOP
...
man kill pour plus d’infos.
Exemple
kill -9 -1 : supprime tous les processus possibles (en fonction
des droits).
55 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
56 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
Scheduling
Ordonnanceur (Scheduler)
57 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
Scheduling
Principe
58 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
Scheduling
Priorité
La priorité d’un processus peut être déterminée de 2 manières :
par le scheduler, qui “observe” chaque processus
par l’utilisateur via la commande nice
59 / 182
Contexte Introduction
Du programme au processus Informations
Gestion des processus par l’OS Etats des processus
Processus Signaux
Threads Ordonnancement(Scheduling)
Scheduling
nice
60 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
61 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Introduction
Au commencement. . .
Destruction du père
Un processus dont le père est détruit est “adopté” par le processus
init
62 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Introduction
Héritage
Chaque processus possède les informations suivantes :
son identifiant pid
l’identifiant de son processus père ppid
un propriétaire
un héritage de l’environnement du processus père
63 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
64 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Création
fork
65 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Création
Différenciation
On utilise la valeur de retour de fork pour différencier les
processus père et fils.
66 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Création
pid et ppid
67 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Création
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
p r i n t f ( ” P r o c e s s u s %d p e r e du p r o c e s s u s %d\n” ,
getpid () , ret );
}
else {
p r i n t f ( ” P r o c e s s u s %d f i l s du p r o c e s s u s %d\n” ,
getpid () , getppid ( ) ) ;
}
s c a n f ( ”%c ” , &c ) ;
return 0;
68 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Création
69 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Création
i n t e x e c l e ( c o n s t c h a r ∗ path , c o n s t c h a r ∗ a r g ,
. . . , c h a r ∗ c o n s t envp [ ] ) ;
70 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Création
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
p r i n t f ( ” P r o c . %d p e r e du p r o c . %d\n” , g e t p i d ( ) , r e t ) ;
wait ( ) ;
}
else {
p r i n t f ( ” P r o c . %d f i l s du p r o c . %d\n” , g e t p i d ( ) , g e t p p i d ( ) ) ;
e x e c l ( ” / b i n / l s ” , ” l s ” , ”− l ” , NULL ) ;
p r i n t f ( ” E r r e u r a p p e l e x e c l \n” ) ;
}
return 0;
}
71 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Création
Remarques
72 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Création
Ordre d’exécution
Section suivante...
Besoin de synchronisation !
73 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
74 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
p i d t w a i t i d ( i d t y p e t idtype , i d t id ,
s i g i n f o t ∗ infop , int options )
75 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
76 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
cas 1 : adoption
Si un processus père se termine avant ses processus fils, ceux-ci
sont adopter par le processus init.
Observation
ps −edf : processus adoptés ont un ppid dont la valeur passe à 1
après la terminaison du père.
77 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
p r i n t f ( ” P r o c e s s u s %d p e r e du p r o c e s s u s %d\n” ,
getpid () , ret );
sleep (10);
}
else {
p r i n t f ( ” P r o c e s s u s %d f i l s du p r o c e s s u s %d\n” ,
getpid () , getppid ( ) ) ;
sleep (20);
}
return 0;
}
78 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
Observation
ps aux : processus zombies identifiés par Z+
79 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
p r i n t f ( ” P r o c e s s u s %d p e r e du p r o c e s s u s %d\n” ,
getpid () , ret );
sleep (10);
}
else {
p r i n t f ( ” P r o c e s s u s %d f i l s du p r o c e s s u s %d\n” ,
getpid () , getppid ( ) ) ;
}
return 0;
80 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
81 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
Avec wait
82 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
p r i n t f ( ” P r o c e s s u s %d p e r e du p r o c e s s u s %d\n” ,
getpid () , ret );
w a i t ( ) ; // a t t e n t e du p r o c e s s u s f i l s .
}
else {
p r i n t f ( ” P r o c e s s u s %d f i l s du p r o c e s s u s %d\n” ,
getpid () , getppid ( ) ) ;
s c a n f ( ”%s ” , &c ) ;
}
return 0;
}
83 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
p r i n t f ( ” P r o c . %d p e r e du p r o c . %d\n” , g e t p i d ( ) , r e t ) ;
pid t ret2 = fork ();
i f ( ret2 ) {
p r i n t f ( ” J e s u i s l e p e r e \n” ) ;
w a i t ( ) ; w a i t ( ) ; // 2 a p p e l s a w a i t
}
e l s e { p r i n t f ( ” J e s u i s l e 2eme f i l s ” ) ; }
}
else {
p r i n t f ( ” P r o c . %d f i l s du p r o c . %d\n” , g e t p i d ( ) , g e t p p i d ( ) ) ;
s c a n f ( ”%s ” , &c ) ;
}
return 0;
}
84 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
Remarques
Ordre de terminaison
85 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
Appel à waitpid
Passage d’un paramètre pid permettant de spécifier le processus
fils à attendre :
< -1 Attente d’un processus fils dont le groupid est -pid
(voir setpgid()).
-1 Attente d’un processus fils (semblable à wait).
0 Attente d’un processus fils du même groupe que le
processus père.
> 0 Attente du processus fils pid.
86 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
p r i n t f ( ” P r o c . %d p e r e du p r o c . %d\n” , g e t p i d ( ) , r e t ) ;
pid t ret2 = fork ();
i f ( ret2 ) {
p r i n t f ( ” J e s u i s l e p e r e \n” ) ;
waitpid ( ret ); waitpid ( ret2 ); // 2 a p p e l s a w a i t
}
e l s e { p r i n t f ( ” J e s u i s l e 2eme f i l s ”); }
}
else {
p r i n t f ( ” P r o c . %d f i l s du p r o c . %d\n” , g e t p i d ( ) , g e t p p i d ( ) ) ;
s c a n f ( ”%s ” , &c ) ;
}
return 0;
}
87 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
88 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
89 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e <s y s / t y p e s . h>
#i n c l u d e <s y s / w a i t . h>
i n t main ( ) {
i n t r e s =0;
pid t ret = fork ();
i f ( ret ) {
p r i n t f ( ” P r o c e s s u s p e r e \n” ) ;
w a i t (& r e s ) ;
p r i n t f ( ” V a l e u r r e n v p a r f i l s = %d\n” , WEXITSTATUS( r e s ) ) ;
}
else {
p r i n t f ( ” P r o c e s s u s f i l s \n” ) ;
exit (12);
}
return 0;
}
90 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
Les signaux
Les signaux sont des interruptions logicielles à destination d’un
processus, par exemple pour signaler une erreur. Le processus
recevant un signal possède une fonction pour traiter celui-ci.
Ce système de signaux peut être détourné pour effectuer des
synchronisations entre plusieurs processus en écrivant ses propres
fonctions.
91 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
92 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
Types de signaux
Les signaux sont numérotés de 0 à 31, quelques exemples :
SIGHUP 1 : hangup
SIGINT 2 : interruption
SIGQUIT 3 : quit
SIGILL 4 : instruction illégale
SIGKILL 9 : hard kill
SIGALRM 14 : alarme
SIGCONT 19 : continuation d’un processus
SIGCHLD 20 : vers le processus parent lorsqu’un processus fils
s’arrête
93 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
#i n c l u d e < s i g n a l . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( r e t ) { // S e c t i o n du p r o c e s s u s p a r e n t
s c a n f ( ”%c ” , &c ) ;
k i l l ( r e t , SIGKILL ) ; // E n v o i du s i g n a l SIGKILL
sleep (10);
}
e l s e { // S e c t i o n du p r o c e s s u s f i l s
w h i l e ( 1 ) ; // A t t e n t e a c t i v e
}
return 0;
}
94 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
Attente passive
Il est possible de mettre un processus en sommeil dans l’attente
d’un signal à l’aide de la fonction pause.
int pause()
95 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
#i n c l u d e < s i g n a l . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
s c a n f ( ”%c ” , &c ) ;
k i l l ( r e t , SIGKILL ) ;
sleep (10);
}
else {
pause ( ) ;
}
return 0;
}
96 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
97 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
#i n c l u d e < s i g n a l . h>
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
sleep (10);
k i l l ( r e t , SIGSTOP ) ;
sleep (10);
k i l l ( r e t , SIGCONT ) ;
sleep (10);
k i l l ( r e t , SIGKILL ) ;
}
else {
while (1);
}
return 0;
}
98 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
99 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
100 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <u n i s t d . h>
#i n c l u d e < s i g n a l . h>
v o i d o n i n t ( ) { p r i n t f ( ”INTERRUPTION RECUE\n” ) ; }
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
s c a n f ( ”%c ” , &c ) ;
k i l l ( r e t , SIGINT ) ;
sleep (10);
}
else {
s i g n a l ( SIGINT , o n i n t ) ;
pause ( ) ;
}
return 0;
}
101 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e < s t d l i b . h>
#i n c l u d e < s i g n a l . h>
v o i d o n i n t ( ) { s i g n a l ( SIGINT , o n i n t ) ; p r i n t f ( ”INT\n” ) ; }
v o i d o n q u i t ( ) { p r i n t f ( ”QUIT\n” ) ; e x i t ( 0 ) ; }
i n t main ( ) {
char c ;
pid t ret = fork ();
i f ( ret ) {
s c a n f ( ”%c ” , &c ) ;
switch ( c ) {
c a s e ’ i ’ : k i l l ( r e t , SIGINT ) ; b r e a k ;
c a s e ’ q ’ : k i l l ( r e t , SIGQUIT ) ; b r e a k ; }
sleep (5);}
else {
s i g n a l ( SIGINT , o n i n t ) ;
s i g n a l ( SIGQUIT , o n q u i t ) ;
pause ( ) ; }
return 0;
} 102 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
103 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Communication
Statut
Utilisation de la valeur de retour pour communiquer entre le
processus père et les processus fils.
Limitations
On ne peut récupérer qu’un octet !
104 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Processus : Communication
Moyens à dispositions
Fichiers
Pipes
Messages
Mémoire partagée
Sockets
...
105 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
106 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Rédacteur/Lecteur
107 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
i n t main ( ) {
pid t pid ;
int status ;
char b u f f e r [ 1 0 ] ;
FILE ∗ f i l e = f o p e n ( ” t e s t ” , ”w+” ) ;
i f ( fork ()) {
wait ( ) ;
f s e e k ( f i l e , 0 , SEEK SET ) ;
f r e a d ( b u f f e r , 1 , 10 , f i l e ) ;
p r i n t f ( ”%s ” , b u f f e r ) ;
fclose ( f i l e );
}
else
f w r i t e ( ” H e l l o ! \ n” , 1 , 7 , f i l e ) ;
return 0;
}
108 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Type
FILE* : pointeur sur un fichier
Fonctions
FILE* fopen("cheminverslefichier",
"r|r+|w|w+|a|a+")
int fseek(FILE*, offset, SEEK {SET|CUR|END})
int fclose(FILE*)
109 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Inconvénients
110 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Pipes
Idée : Utiliser le système de pipe pour faire communiquer les
processus.
Rappels
ls | sort
111 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Fonctions
popen
pipe
112 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
popen
FILE* popen("command", "r|w")
1 lance la commande dans un processus
2 crée un pipe et retourne un pointeur vers celui-ci
3 lit ou écrit à partir du pointeur
pclose
int pclose(FILE*)
1 attente de la fin du processus associé
2 retourne le statut du processus
113 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
i n t main ( ) {
FILE ∗ f i l e ;
char b u f f e r [ 1 0 ] ;
f i l e = popen ( ” d a t e ” , ” r ” ) ;
while ( f g e t s ( b u f f e r , 10 , f i l e ) ) {
p r i n t f ( ”%s ” , b u f f e r ) ;
}
pclose ( f i l e );
return 0;
114 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
pipe
Idée : créer 2 canaux de communication unidirectionnels entre 2
processus.
P1 P2
115 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Fonctions
1 int pipe(int[2])
2 ssize t write(int, const void*, size t)
ssize t read(int, void*, size t)
3 int close(int)
116 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
i n t main ( ) {
int pipes [ 2 ] ;
pipe ( pipes ) ;
char b u f f e r [ 1 0 ] ;
i f ( fork ()) {
close ( pipes [ 1 ] ) ;
while ( read ( pipes [ 0 ] , buffer , 10))
p r i n t f ( ”%s ” , b u f f e r ) ;
close ( pipes [ 0 ] ) ;
}
else {
close ( pipes [ 0 ] ) ;
w r i t e ( p i p e s [ 1 ] , ” H e l l o ! \ n” , 7 ) ;
close ( pipes [ 1 ] ) ;
}
return 0;
}
117 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
i n t main ( ) {
int pipes [ 2 ] ;
pipe ( pipes ) ;
int i = 0;
i f ( fork ()) {
close ( pipes [ 1 ] ) ;
r e a d ( p i p e s [ 0 ] , &i , 4 ) ;
p r i n t f ( ”%i \n” , i ) ;
close ( pipes [ 0 ] ) ;
}
else {
i = 5;
close ( pipes [ 0 ] ) ;
w r i t e ( p i p e s [ 1 ] , &i , 4 ) ;
close ( pipes [ 1 ] ) ;
}
return 0;
}
118 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Files de messages
Passage de messages entre processus par un système de files de
messages.
119 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Fonctions
120 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
#i n c l u d e < s t d i o . h>
#i n c l u d e <mqueue . h>
#i n c l u d e < f c n t l . h>
#i n c l u d e <s y s / s t a t . h>
i n t main ( ) {
mqd t mq ;
mq = mq open ( ” /mq5” , O CREAT | O RDWR, 0 6 0 0 , NULL ) ;
mq send (mq , ” abcd ” , 4 , 0 ) ;
return 0;
}
121 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
#i n c l u d e < s t d i o . h>
#i n c l u d e <mqueue . h>
#i n c l u d e < f c n t l . h>
#i n c l u d e <s y s / s t a t . h>
#i n c l u d e < s t d l i b . h>
i n t main ( ) {
mqd t mq ;
void ∗ b u f f e r ;
struct mq attr a t t r ;
mq = mq open ( ” /mq5” , O RDONLY ) ;
m q g e t a t t r (mq , &a t t r ) ;
b u f f e r = malloc ( a t t r . mq msgsize ) ;
m q r e c e i v e (mq , b u f f e r , a t t r . m q m s g s i z e , NULL ) ;
p r i n t f ( ”%s ” , ( c h a r ∗ ) b u f f e r ) ;
return 0;
}
122 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Mémoire partagée
Créer un bloc de mémoire du processus père et le marquer comme
accessible par ses processus fils. A l’appel de fork(), ce bloc ne
sera pas dupliqué mais commun aux processus.
124 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
mmap
void* mmap(void* addr, size t length, int prot, int
flags, int fd, off t offset)
1 addr : adresse de début du segment de mémoire partagée
2 length : longueur du segment souhaité
3 prot : protection de l’accès (lecture, écriture, ...)
4 flags : type de segment (voir man)
5 fd : descripteur de fichier
6 offset : offset dans le fichier pour l’initialisation des données
125 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
munmap
int munmap(void* addr, size t length)
Supprime le partage du segment passé en paramètre.
126 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Synchronisation
Processus
Communication
Threads
Sockets
Etablir des communications point-à-point entre plusieurs processus.
Utilisation des sockets en période 4...
128 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
129 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Introduction
130 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Introduction
Limitations
131 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Introduction
Threads
132 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Introduction
Un thread
133 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Introduction
Avantages
Inconvénients
Introduction
135 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Introduction
Header
#include <pthread.h>
Compilation
gcc -o ... -pthread
136 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
137 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
Structure
pthread t thread
Création
int p t h r e a d c r e a t e ( pthread t ∗ thread ,
pthread attr t ∗ attr ,
void ∗ (∗ s t a r t r o u t i n e ) ( void ∗) ,
void ∗ arg ) ;
138 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
Arguments
Valeur retournée
139 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
#i n c l u d e < s t d i o . h>
void f c t () {
p r i n t f ( ” f c t \n” ) ;
}
i n t main ( ) {
v o i d ( ∗ p f ) ( ) = &f c t ;
(∗ pf ) ( ) ;
}
140 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
#i n c l u d e < s t d i o . h>
i n t main ( ) {
i n t ( ∗ p f ) ( i n t ) = &f c t ;
p r i n t f ( ”%d\n” , ( ∗ p f ) ( 5 ) ) ;
}
141 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
1er programme
142 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
void ∗ fonction () {
p r i n t f ( ” Thread \n” ) ;
}
i n t main ( ) {
pthread t thread ;
p t h r e a d c r e a t e (& t h r e a d , NULL , f o n c t i o n , NULL ) ;
return 0;
}
143 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
Terminaison
La terminaison du processus père entraà R ne la terminaison de ses
threads !
Remède
Attente de la terminaison des threads par le processus père (à
l’instar de wait pour les processus) :
int pthread join ( pthread t thread , void∗∗ thread return )
144 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
void ∗ fonction () {
p r i n t f ( ” Thread \n” ) ;
}
i n t main ( ) {
pthread t thread ;
p t h r e a d c r e a t e (& t h r e a d , NULL , f o n c t i o n , NULL ) ;
p t h r e a d j o i n ( t h r e a d , NULL ) ;
return 0;
}
145 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
146 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
i n t A = 5 ; // v a r i a b l e g l o b a l e
void ∗ fonction () {
i n t a = 7 ; // v a r i a b l e l o c a l e
p r i n t f ( ” l o c a l e : %d , g l o b a l e : %d\n” , a , A ) ;
}
i n t main ( ) {
pthread t thread ;
p t h r e a d c r e a t e (& t h r e a d , NULL , f o n c t i o n , NULL ) ;
p t h r e a d j o i n ( t h r e a d , NULL ) ;
p r i n t f ( ” g l o b a l e : %d\n” , A ) ;
return 0;
}
147 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
148 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
i n t a = 5 ; // v a r i a b l e g l o b a l e
void ∗ fonction () {
p r i n t f ( ” Thread \n” ) ;
a+=5;
}
i n t main ( ) {
pthread t thread ;
p t h r e a d c r e a t e (& t h r e a d , NULL , f o n c t i o n , NULL ) ;
p r i n t f ( ”%d\n” , a ) ; // Q u e l l e v a l e u r ?
p t h r e a d j o i n ( t h r e a d , NULL ) ;
p r i n t f ( ”%d\n” , a ) ; // e t i c i ?
return 0;
}
149 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
Indéterminisme
Différentes exécutions peuvent générer différents résultats !
150 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
i n t a = 5 ; // v a r i a b l e g l o b a l e
void ∗ fonction () {
p r i n t f ( ” Thread \n” ) ;
a+=5;
}
i n t main ( ) {
pthread t thread ;
p t h r e a d c r e a t e (& t h r e a d , NULL , f o n c t i o n , NULL ) ;
a ∗=2;
p t h r e a d j o i n ( t h r e a d , NULL ) ;
p r i n t f ( ”%d\n” , a ) ; // e t i c i ?
return 0;
}
151 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
152 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
void ∗ fonction () {
p r i n t f ( ” F o n c t i o n \n” ) ;
}
i n t main ( ) {
pthread t threads [ 2 ] ;
p t h r e a d c r e a t e (& t h r e a d s [ 0 ] , NULL , f o n c t i o n , NULL ) ;
p t h r e a d c r e a t e (& t h r e a d s [ 1 ] , NULL , f o n c t i o n , NULL ) ;
pthread join ( threads [0] , NULL ) ;
pthread join ( threads [1] , NULL ) ;
return 0;
}
153 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Création
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
void ∗ fonction1 () {
p r i n t f ( ” F o n c t i o n 1 \n” ) ;
}
void ∗ fonction2 () {
p r i n t f ( ” F o n c t i o n 2 \n” ) ;
}
i n t main ( ) {
pthread t threads [ 2 ] ;
p t h r e a d c r e a t e (& t h r e a d s [ 0 ] , NULL , f o n c t i o n 1 , NULL ) ;
p t h r e a d c r e a t e (& t h r e a d s [ 1 ] , NULL , f o n c t i o n 2 , NULL ) ;
pthread join ( threads [0] , NULL ) ;
pthread join ( threads [1] , NULL ) ;
return 0;
}
154 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
155 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Communication
Variables locales
Chaque thread possède sa propre pile et donc ses variables locales,
inaccessibles par les autres threads.
156 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Communication
Cast
Attention à bien utiliser des pointeurs ! La taille d’un pointeur est
dépendante de l’architecture.
157 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Communication
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
i n t main ( ) {
pthread t thread ;
unsigned i n t value = 5;
p t h r e a d c r e a t e (& t h r e a d , NULL , f o n c t i o n , ( v o i d ∗)& v a l u e ) ;
p t h r e a d j o i n ( t h r e a d , NULL ) ;
return 0;
}
158 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Communication
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
s t r u c t Arg { i n t v a l u e ; c h a r ∗ s t r ; } ;
void ∗ f o n c t i o n ( void ∗ arg ) {
p r i n t f ( ”%d\n” , ( ( s t r u c t Arg ∗ ) a r g )−> v a l u e ) ;
p r i n t f ( ”%s \n” , ( ( s t r u c t Arg ∗ ) a r g )−> s t r ) ;
}
i n t main ( ) {
pthread t thread ;
s t r u c t Arg a r g ;
arg . value = 4;
arg . s t r = ” Hello ! ” ;
p t h r e a d c r e a t e (& t h r e a d , NULL , f o n c t i o n , ( v o i d ∗)& a r g ) ;
p t h r e a d j o i n ( t h r e a d , NULL ) ;
return 0;
}
159 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Communication
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
void ∗ f o n c t i o n ( void ∗ arg ) {
p r i n t f ( ”%d\n” , ∗ ( u n s i g n e d i n t ∗ ) a r g ) ;
}
i n t main ( ) {
pthread t threads [ 1 0 ] ;
unsigned i n t id ;
f o r ( i d = 0 ; i d < 10 ; ++i d )
p t h r e a d c r e a t e (& t h r e a d s [ i d ] , NULL ,
f o n c t i o n , ( v o i d ∗)& i d ) ;
f o r ( i d = 0 ; i d < 10 ; ++i d )
p t h r e a d j o i n ( t h r e a d s [ i d ] , NULL ) ;
return 0;
}
160 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Communication
161 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Communication
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
void ∗ f o n c t i o n ( void ∗ arg ) {
p r i n t f ( ”%d\n” , ∗ ( u n s i g n e d i n t ∗ ) a r g ) ;
}
i n t main ( ) {
pthread t threads [ 1 0 ] ;
unsigned i n t id ;
unsigned i n t i d s [ ] = {0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9};
f o r ( i d = 0 ; i d < 10 ; ++i d )
p t h r e a d c r e a t e (& t h r e a d s [ i d ] , NULL ,
f o n c t i o n , ( v o i d ∗)& i d s [ i d ] ) ;
f o r ( i d = 0 ; i d < 4 ; ++i d )
p t h r e a d j o i n ( t h r e a d s [ i d ] , NULL ) ;
return 0;
}
162 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
2 Du programme au processus
Programme exécutable
Chargement du programme en mémoire
Processus en mémoire
4 Processus
Création
Synchronisation
Communication
163 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
164 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
Cas d’utilisation
165 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
Primitives de synchronisation
Mutex
Condition variables
Semaphores
166 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
Mutex
167 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
Mutex : scénario
1 Déclaration du mutex
2 Initialisation du mutex
3 les threads tentent d’acquérir le mutex
4 1 seul peut l’obtenir, les autres sont mis en attente
5 le thread possédant le mutex continue sont exécution
6 le thread possédant le mutex libère le mutex
7 1 thread parmi ceux en attente est réveillé et récupère le
mutex
8 ...
168 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
169 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
p t h r e a d m u t e x t mutex ;
i n t main ( ) {
unsigned i n t i d s [ 4 ] = {0 , 1 , 2 , 3};
pthread t threads [ 4 ] ;
p t h r e a d m u t e x i n i t (&mutex , NULL ) ;
170 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
171 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
Condition variables
172 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
173 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
174 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
#i n c l u d e <p t h r e a d . h>
#i n c l u d e < s t d i o . h>
p t h r e a d m u t e x t mutex ;
p t h r e a d c o n d t cond ;
unsigned i n t count = 0;
i n t main ( ) {
pthread t threads [ 4 ] ;
p t h r e a d m u t e x i n i t (&mutex , NULL ) ;
p t h r e a d c o n d i n i t (&cond , NULL ) ;
p t h r e a d c r e a t e (& t h r e a d s [ 0 ] , NULL , compute , NULL ) ;
p t h r e a d c r e a t e (& t h r e a d s [ 1 ] , NULL , o b s e r v e r , NULL ) ;
p t h r e a d j o i n ( t h r e a d s [ 0 ] , NULL ) ;
p t h r e a d j o i n ( t h r e a d s [ 1 ] , NULL ) ;
p t h r e a d m u t e x d e s t r o y (&mutex ) ;
p t h r e a d c o n d d e s t r o y (& cond ) ;
}
175 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
void ∗ observer () {
p t h r e a d m u t e x l o c k (&mutex ) ;
p r i n t f ( ” O b s e r v e r h a s mutex ! \ n” ) ;
p r i n t f ( ” 10 ! \ n” ) ;
p t h r e a d m u t e x u n l o c k (&mutex ) ;
176 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
v o i d ∗ compute ( v o i d ∗ a r g ) {
unsigned i n t i ;
f o r ( i = 0 ; i < 20 ; ++i ) {
p t h r e a d m u t e x l o c k (&mutex ) ;
p r i n t f ( ” Compute : i n c %d\n” , i ) ;
i f ( c o u n t == 1 0 ) {
p r i n t f ( ” c o u n t = 10\ n” ) ;
p t h r e a d c o n d s i g n a l (& cond ) ;
}
++c o u n t ;
p t h r e a d m u t e x u n l o c k (&mutex ) ;
sleep (1);
}
}
177 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
Semaphores
178 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
Semaphores : scénario
179 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
1 #include <semaphore.h>
180 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
#i n c l u d e < s t d i o . h>
#i n c l u d e <p t h r e a d . h>
#i n c l u d e <s e m a p h o r e . h>
s e m t sem ;
i n t main ( ) {
pthread t threads [ 4 ] ;
s e m i n i t (&sem , 0 , 2 ) ;
unsigned i n t i ;
unsigned i n t i d s [ ] = {0 , 1 , 2 , 3};
f o r ( i = 0 ; i < 4 ; ++i )
p t h r e a d c r e a t e (& t h r e a d s [ i ] , NULL ,
f c t , ( v o i d ∗)& i d s [ i ] ) ;
f o r ( i = 0 ; i < 4 ; ++i )
p t h r e a d j o i n ( t h r e a d s [ i ] , NULL ) ;
s e m d e s t r o y (&sem ) ;
}
181 / 182
Contexte
Introduction
Du programme au processus
Création
Gestion des processus par l’OS
Communication
Processus
Synchronisation
Threads
Synchronisation
s e m w a i t (&sem ) ;
p r i n t f ( ” Thread %d\n” , ∗ ( u n s i g n e d i n t ∗ ) a r g ) ;
sleep (4);
s e m p o s t (&sem ) ;
182 / 182