Académique Documents
Professionnel Documents
Culture Documents
TD3_Moniteurs
TD3_Moniteurs
ªË@
éJ £@Q®Ö ß YË@ éK QK@Qm.Ì '@ éK PñêÒm.Ì '@
àAÒÊK - éJ ®J J.¢JË@ ÐñʪË@ ú¯ AJʪË@ éPYÖ Ï@
Higher School in Applied Sciences-Tlemcen (ESSAT)
lecteur( ){ ecrivain( ){
debut lire( ) ; debut ecrire( ) ;
lire(BD) ; ecrire(BD) ;
fin lire( ) ; fin ecrire( ) ;
} }
— Modifier les fonctions debut lire( ), fin lire( ), debut ecrire( ), fin ecrire( ) afin de donner la
priorité aux écrivains.
Exercice 1
Moniteur : 2 procédures, demander et libérer
ps:ressource.demander(n); --demande de n unités
--attente si échec
<utiliser les ressources acquises>
ressource.libérer(n);
--libération des unités
• Condition de synchronisation : n =< nlibre
ressource : moniteur;
var nlibre : entier ;
disp : condition ;
procédure demander(n) ; procédure libérer(n) ;
début début
tantque n > nlibre faire nlibre := nlibre + n;
disp.attendre ; disp.signaler
disp.signaler fin ;
ftantque ; début
nlibre := nlibre – n; nlibre := N
fin ; fin
fin ressource
Exercice 2
Il s'agit donc d'implémenter les fonctions debut_lire, fin_lire, debut_ecrire et fin_ecrire
On utilise un moniteur comportant ces fonctions ainsi que les conditions :
cond f_lect , f_ecr
l'entier
int nb_lec
qui indique le nombre de lecteurs dans la base de données,
et enfin le booléen :
bool ecr
qui indique si quelqu'un est en train décrire dans la base de données ou non.
debut_lire( ){ fin_lire( ){
nb_lec ++; nb_lec - - ;
if (ecr){ //s'il y a un écrivain on attend if (nb_lec ==0){
f_lect.wait( );} f_ecr.signal( );
f_lect.signal( ); // si on peut lire alors tous ceux }
qui sont en attente aussi }
}
debut_ecrire( ){ fin_ecrire( ){
if (nb_lec > 0 || ecr){ ecr = false;
f_ecr.wait( ); if ( nb_lec > 0){ //priorité aux lecteurs : on
} regarde d'abord si il y en a qui veulent lire
ecr = true; f_lect.signal( );
} }
else {
f_ecr.signal( );}
}
On se place maintenant dans le cas où ce sont les écrivains qui ont la priorité On utilise un moniteur
comportant :
debut_ecrire( ){ fin_ecrire( ){
nb_ecr_att ++; ecr_base = false;
if (nb_lec_base > 0 || ecr_base){ if ( nb_ecr_att >0){
f_ecr.wait( ); f_ecr.signal( );
} }
ecr_base = true; elsif ( nb_lec_att > 0){
nb_ecr_att --; f_lec.signal( );
} }
}
Exercice 3
Etat = { PENSE , MANGE}
Etat Etat_Philo[ N ] = { PENSE , ................, PENSE}
cond file_privee [ N ];