Cours Système D'exploitation 2 Année IUT de Caen, Département D'informatique (François Bourdon)
Cours Système D'exploitation 2 Année IUT de Caen, Département D'informatique (François Bourdon)
Cours Système D'exploitation 2 Année IUT de Caen, Département D'informatique (François Bourdon)
2ème année
IUT de Caen, Département d’Informatique
(François Bourdon)
prévention,
détection,
évitement.
si l’on a 2 processus
P1 P2
res 11 res 11
7
OK! if (res + dem) <= MAX
si l’ordonnanceur donne la 5
main à P2 if (res + dem) <= MAX
OK!
res += dem
res += dem
16 = 11 + 5
23 = 16 + 7 bug !
La section critique
répeter
<section restante>
<section d’entrée>
<section critique>
<section de sortie>
jusqu’à faux;
Tour
P1 P2
section−entrée ret := Tour ; ret := Tour ;
si (ret == 1) { si (ret == 2) {
section−critique ............... ; .............. ;
............... ; .............. ;
............... ; .............. ;
section−sortie Tour = 2 ; Tour = 1 ;
} }
exclusion mutuelle,
absence de blocage,
progression,
attente bornée.
TS
b
mot placé en
a 1/0 mémoire centrale
et donc
1 partageable entre
différents
processus. "TS"
2 permet de changer
1 son état.
répéter
<section restante>
TS (testi, verrou);
tantque testi = 1 faire TS (testi, verrou) ;
<section critique>
verrou = 0;
jusqu’à faux;
variable partagée
par les processus
V
TS E TS
R
R
O
1 /0 U 0 /1
1 1
section
critique
0 0
P1 P2
début
T0
T1
init (Sém, 1) ; début
fork ( )
T2
T21
boucler tant boucler tant
que { T22 que {
P ( Sém) ; P (Sém) ;
code section code section
critique ; critique ;
V (Sém) ; V (Sém) ;
} }
fin
P(S)
V(S)
t23
P(S)
P(S) t23
V(S)
t23 ...
init(S, 0);
parbegin
début T1 ; V(S) fin;
début P(S) ; T2 fin
parend;
T1 T1
V(S)
P(S)
T2 T2
init (nbr_ressources, k) ;
répéter
< section restante >
P (nbr_ressources) ;
< section critique >
V (nbr_ressources) ;
jusqu’à faux ;
Variables partagées
Procédure 1
Procédure 1 interne
Procédure 2 interne
Procédure 3 interne
main () {
lancement
c = 0; effectif
des deux
start capteur; processus
start afficheur;
}
int c;
code du 1er
processus capteur processus
while (1) { qui
incrémente
wait <évènement> la valeur
de "c"
c++;
} code du 2nd
processus
processus afficheur { qui affiche
la valeur de
sleep (1); "c"
printf ("%d", c);
c = 0;
}
/* module de surveillance */
import compteur
processus capteur
while (1) {
wait <évènement>
compteur.incrementer; }
processus afficheur {
while (1) {
compteur.afficher; }
/* Programme principal */
start capteur
start afficheur
fonction
incrémenter ( )
temps
printf (c) c=0;
afficher afficher
sans moniteur
fonction
incrémenter ( )
R L L L R
fin_lecture
files d’attentes
met en attente le
processus courant
wait.X
réveille l’un des
signal.X processus de la file
non_vide.X correspondante
test l’existence
de processus
booléen écriture dans la file
entier lecteurs existence d’une
écriture en cours
nombre de
lecteurs actifs
import lecture_écriture
processus lecteur {
lecture_écriture.début_lecture ;
< lecture >
lecture_écriture.fin_lecture ;
}
processus écrivain {
lecture_écriture.début_écriture ;
< écriture >
lecture_écriture.fin_écriture ;
}
procédure fin_lecture;
début
lecteurs:= lecteurs − 1;
si lecteurs = 0 alors accord_écriture.signal
findesi
fin;
(suite)
procédure fin_écriture;
début
écriture:= faux;
si accord_lecture.non_vide
alors accord_lecture.signal
sinon accord_écriture.signal
findesi
fin;
début_écriture
<écriture>
fin_écriture;