Chapitre 3-STR-Exemple-sans Sol
Chapitre 3-STR-Exemple-sans Sol
Chapitre 3-STR-Exemple-sans Sol
Systèmes Temps-Réel
Chapitre 3 - Suite
Exemple – Sémaphores
Olfa Mosbahi
[email protected]
Exemples de Processus en Concurrence
Problème des Lecteurs-Rédacteurs
2
Priorité égale
1 module lecteurs_redacteurs
2 defines debut_lecture, fin_lecure, debut_ecriture, fin_ecriture
3 var
4 nb_lecteurs : integer 0;
5 lr : semaphore 1 ; /* exclusion mutuelle pour lecteurs */
6 r : semaphore 1 ; /* exclusion mutuelle pour rédacteurs */
7 mutex: semaphore 1 ; /* semaphore sur nb-lecteurs */
8 procedure debut_lecture
9 P(lr) ;
10 P(mutex) ;
11 nb_lecteurs nb_lecteurs + 1 ;
12 if nb_lecteurs = 1 then
13 P(r) ;
14 end
15 V(mutex) ;
16 V(lr) ;
17 end
18 procedure fin_lecture
19 P(mutex) ;
20 nb_lecteurs nb_lecteurs - 1 ;
21 if nb_lecteurs = 0 then
22 V(r) ;
23 end
24 V(mutex) ;
25 end
26 procedure debut_ecriture
27 P(lr) ;
28 P(r) ;
29 end
30 procedure fin_ecriture
31 V(r) ;
32 V(lr) ;
33 end 3
37 end module
Priorité égales
Execution :
Lecteur r1 l1 r2 l2 Redacteur
r
File d’attente pour r
Questions :
5
Priorité égale
1 module lecteurs_redacteurs
2 defines debut_lecture, fin_lecure, debut_ecriture, fin_ecriture
3 var
4 nb_lecteurs : integer 0;
5 lr : semaphore 1 ;
6 r : semaphore 1 ;
7 mutex: semaphore 1 ;
8 procedure debut_lecture
9 P(lr) ;
10 P(mutex) ;
11 nb_lecteurs nb_lecteurs + 1 ;
12 if nb_lecteurs = 1 then
13 P(r) ;
14 end
15 V(mutex) ;
16 V(lr) ;
17 end
18 procedure fin_lecture
19 P(mutex) ;
20 nb_lecteurs nb_lecteurs - 1 ;
21 if nb_lecteurs = 0 then
22 V(r) ;
23 end
24 V(mutex) ;
25 end
26 procedure debut_ecriture
27 P(lr) ;
28 P(r) ;
29 end
30 procedure fin_ecriture
31 V(r) ;
32 V(lr) ;
33 end 6
37 end module
Priorité égales
Questions :
Réponse :
Interblocage (Deadlock)
Par exemple, un lecteur execute P(r) et avant d’éxécuter P(lr) un rédacteur
execute P(lr) suivi de P(r).
Ainsi le lecteur attend sur P(lr) alors que le rédacteur attend sur P(r).
7
Priorité égales
2- Que se passe-t-il si l’on supprime les appels de P(lr) dans la procédure début
écriture et V(lr) dans la procédure fin écriture ?
8
Priorité égale
1 module lecteurs_redacteurs
2 defines debut_lecture, fin_lecure, debut_ecriture, fin_ecriture
3 var
4 nb_lecteurs : integer 0;
5 lr : semaphore 1 ;
6 r : semaphore 1 ;
7 mutex: semaphore 1 ;
8 procedure debut_lecture
9 P(lr) ;
10 P(mutex) ;
11 nb_lecteurs nb_lecteurs + 1 ;
12 if nb_lecteurs = 1 then
13 P(r) ;
14 end
15 V(mutex) ;
16 V(lr) ;
17 end
18 procedure fin_lecture
19 P(mutex) ;
20 nb_lecteurs nb_lecteurs - 1 ;
21 if nb_lecteurs = 0 then
22 V(r) ;
23 end
24 V(mutex) ;
25 end
26 procedure debut_ecriture
27 P(lr) ;
28 P(r) ;
29 end
30 procedure fin_ecriture
31 V(r) ;
32 V(lr) ;
33 end 9
37 end module
Priorité égales
Correction :
Lecteur r1 l1 r2 l2 Redacteur
2- Que se passe-t-il si l’on supprime les appels de P(lr) dans la procédure début
écriture et V(lr) dans la procédure fin écriture ?
Correction :
11
Priorité aux Rédacteurs
Algorithm 1 : Lecteurs/Rédacteurs avec Priorités aux rédacteurs
1 module lecteurs_redacteurs
2 defines debut_lecture, fin_lecure, debut_ecriture, fin_ecriture
3 var
4 r_number : integer 0 ; /* nombre des rédacteurs */
5 lr_number : integer 0 ; /* nombre des lecteurs */
6 r_mutex : semaphore 1 ; /* exclusion mutuelle pour r_number * /
7 lr_mutex : semaphore 1 ; /* exclusion mutuelle pour lr_number * /
8 lr : semaphore 1 ; /* garantit la sémantique sur les lecteurs */
9 r : semaphore 1 ; /* garantit la sémantique sur les rédacteurs */
11 procedure debut_lecture
12 P(lr) ; /* attente sur les rédacteurs */
13 P(lr_mutex) ;
14 lr_number lr_number + 1 ;
15 if lr_number = 1 then
16 P(r) ; /* bloque l’acces aux rédacteurs */
17 end
18 V(lr_mutex) ;
19 V(lr) ;
20 end
21 procedure fin_lecture
22 P(lr_mutex) ;
23 lr_number lr_number - 1 ;
24 if lr_number = 0 then
25 V(r) ; /* permet l’acces aux rédacteurs */
26 end
27 V(lr_mutex) ; 12
28 end
Priorité aux Rédacteurs
Algorithm 1 : Lecteurs/Rédacteurs avec Priorités aux rédacteurs
……..
4 r_number : integer 0 ; /* nombre des rédacteurs */
5 lr_number : integer 0 ; /* nombre des lecteurs */
6 r_mutex : semaphore 1 ; /* exclusion mutuelle pour r_number * /
7 lr_mutex : semaphore 1 ; /* exclusion mutuelle pour lr_number * /
8 lr : semaphore 1 ; /* garantit la sémantique sur les lecteurs */
9 r : semaphore 1 ; /* garantit la sémantique sur les rédacteurs */
29 procedure debut_ecriture
30 P(r_mutex) ;
31 r_number r_number + 1 ;
32 if r_number = 1 then
33 P(lr) ; /* bloque les futurs lecteurs */
34 end
35 V(r_mutex) ;
36 P(r) ; /* attend l’acces */
37 end
38 procedure fin_ecriture
39 V(r); /* permet l’acces aux rédacteurs */
40 P(r_mutex) ;
41 r_number r_number - 1 ;
42 if r_number = 0 then
43 V(lr) ; /* permet l’acces aux lecteurs */
44 end
45 V(r_mutex) ;
46 end 13
47 end module
Priorité aux Lecteurs
14
Priorité aux Lecteurs
15
Problème : L1 L2 L3 R1 R2 R3 R1 L1 R2 L2 R3 L3
16