Solution Synchro
Solution Synchro
Exercice 1 :
1) Interblocage.
2) Code des processus P1 et P2 :
• Pour que P vérifie qu’un emplacement est vide, on introduit un sémaphore empty
initialisé par la taille du buffer et dont le rôle est de compter les cases vides. P doit
donc appeler wait(&empty) avant de déposer l’item dans buffer.
• Avant de déposer dans le buffer, il faut que P vérifie qu’aucun autre processus
n’accède au buffer. On introduit donc un sémaphore mtx initialisé à 1 dont le rôle est
de protéger l’accès au buffer (section critique). P doit donc appeler wait(&mtx)
avant d’accéder au buffer.
• P peut déposer l’item dans buffer et libérer l’accès au buffer par signal(&mtx).
}while(true);
Exercice 3
wait(semaphore *S){ signal(semaphore *S){
Comportement coiffeur: S.value--; S.value++;
if (S.value < 0){ if (S.value <= 0){
add_Proc(S.list); Proc=remove_Proc(S.list);
block();}} wakeup(Proc);}}
do{ //Coiffeur
//un Client
wait(&clients);
wait(&mutex);
attente - -;
/*obtenir une coupe*/
signal(&coiffeur)
signal(&mutex)
/*effectuer une coupe*/
}while(true);
Exercice 3 wait(semaphore *S){
S.value--;
if (S.value < 0){
signal(semaphore *S){
S.value++;
if (S.value <= 0){
add_Proc(S.list); Proc=remove_Proc(S.list);
Comportement client: block();}} wakeup(Proc);}}
• Lorsque le client entre dans le salon, il vérifie s’il y a des places libres (compare
attente au nombre chaises n). Evidement, il doit vérifier qu’attente ne change
pas en cours de comparaison, il appelle wait(&mutex)
oS’il ne trouve pas de place, il n’attend pas et quitte le salon en appelant
signal(&mutex). do{ //Coiffeur
wait(&clients);
oS’il y a une place: wait(&mutex);
attente - -;
il prend une chaise (incrémenter attente), et signal(&coiffeur)
signal(&mutex)
appelle signal(&clients)pour augmenter le /*effectuer une coupe*/
nombre clients en attente et réveiller le coiffeur si }while(true);
nécessaire.
Il appelle signal(&mutex)pour indiquer qu’il ne //Client
wait(&mutex);
manipule plus la variable attente . If (attente < n){
attente ++;
Il appelle wait(&coiffeur) pour attendre signal(&clients);
d’obtenir une coupe si ce dernier est occupé. signal(&mutex);
wait(&coiffeur);
/*obtenir une coupe*/
}
else signal(&mutex);