Correction td4 : synchronisation des processus avec des séma

Télécharger PDF

Obtenir le pack complet des cours, TDs, examens sur Systèmes d’Exploitation!

Vous souhaitez maîtriser Systèmes d’Exploitation ? Ne cherchez plus, nous avons le pack bien choisi pour vous.

pack complet des cours, TDs, TPs et examens exercices sur Systèmes d’Exploitation

Accédez à une collection complète des supports de cours, des travaux dirigés (TDs) corrigés, TPs avec solution, examens...

Télécharger pack

Institut Supérieur d’Informatique Université de Tunis el Manar MME. LILIA SFAXI TD4 : Synchronisation des processus avec des Sémaphores Systèmes d’Exploitation Avancés – 1

ère année ING. Année Universitaire : 2011/2012 TD4 : Synchronisation des processus avec des Sémaphores MME. LILIA SFAXI

2011/2012 1 TD4 : Synchronisation des processus avec des Sémaphores Systèmes d’Exploitation Avancés

Exercice 1

Barrières de Synchronisation Contexte commun sémaphore mutex = 1, s= 0; entier NbArrivés = 0; /*nbre de processus arrivés au rendez-vous*/ Procédure RDV Début down(mutex); NbArrivés = NbArrivés + 1; Si (NBArrivés < N) Alors

/* non tous arrivés */

up(mutex);

/* on libère mutex et */

down(s);

/* on se bloque */ Sinon

up(mutex); /* le dernier arrivé libère mutex et */

Pour i = 1 à N-1 Faire

up(s); /* réveille les N-1 bloqués */ Finsi Fin TD4 : Synchronisation des processus avec des Sémaphores MME. LILIA SFAXI

2011/2012 2

Exercice 2

Le dîner des philosophes # define N 5

/* nombre de philosophes */ # define GAUCHE (i-1)%N /* numéro du voisin de gauche de i */ # define DROITE (i+1)%N /* numéro du voisin de droite de i */ # define PENSE 0

/* Le philosophe pense */ # define FAIM 1

/* Le philosophe a faim */ # define MANGE 2

/* Le philosophe mange */ typedef int sémaphore ; int état [N] ;

/* Tab pour suivre l’état des philosophes */ semaphore mutex = 1 ;

/* Exclusion mutuelle pour la SC */ semaphore s[N] ;

/* Un sémaphore par philosophe */ philosophe(int i) {

/* i : numéro du philosophe */ while( TRUE){

penser ( ) ;

prendre-fourchette( i ) ; /*prend 2 fourch. ou bloque*/

manger( ) ;

poser-fourchette( i ) ; /* repose 2 fourchettes */ } } prendre-fourchette(int i){ down (mutex) ;

/* entre en section critique */ état[i] = FAIM ; test(i) ;

/* tente de prendre les 2 fourch */ up (mutex) ;

/* quitte la section critique */ down (s[i]) ;

/* bloque s'il n'a pas pu prendre les fourch */ } poser-fourchette(int i){ down (mutex) ; /* entre en section critique */ état[i] = PENSE ; /* philosophe a fini de manger */ test(GAUCHE) ; /* regarde si voisin de gauche peut manger */ test(DROITE) ; /* regarde si voisin de droite peut manger */ up (mutex) ; /* quitte la section critique */ } test(int i) { if (état[i]==FAIM & état[GAUCHE]!=MANGE & état[DROITE]!=MANGE){

état [i] = MANGE ;

up( s[i] ) ; } }

TD4 : Synchronisation des processus avec des Sémaphores MME. LILIA SFAXI

2011/2012 3

Exercice 3

Le coiffeur endormis Utilisation de 3 sémaphores et un compteur Semaphore Clients 0 : bloque le coiffeur s’il n’y a pas de clients Semaphore Mutex 1 : accès exclusif à la zone critique Semaphore Coiffeurs 0 : bloque le client si le coiffeur est occupé avec un autre client Int Attente = 0 : Le nombre de clients en attente Semaphore Clients 0; Semaphore Mutex 1; Semaphore Coiffeurs 0; Int Attente = 0 ; //Coiffeur void coiffeur() {

while(1){

down(Clients);

down(Mutex);

Attente = attente – 1;

up(Coiffeurs);

up(Mutex);

Couper_cheveux();

} } //Client void client() { down(Mutex) if (Attente < Chaises) {

Attente = attente + 1

up(Clients)

up(Mutex)

down(Coiffeurs)

Obtenir_coupe

} else {

up(Mutex) } }

TD4 : Synchronisation des processus avec des Sémaphores MME. LILIA SFAXI

2011/2012 4

Exercice 4

Problème des lecteurs rédacteurs Semaphore mutex 1

// contrôle l’accès à nb_lect Semaphore db 1

// contrôle l’accès à la base de données int nb_lect = 0 ;

// var partagées entre lecteurs pour

// compter le nombre de lecteurs

// accédant actuellement à la BD //lecteur void lecture(){

while (true) {

//boucle sans fin

down (mutex);

// protéger la var. partagée nb_lect

nb_lect ++;

// une section critique entre lecteurs

if (nb_lect == 1) down (db);

//si le premier lecteur

up(mutex);

// libère l’accès exclusif à nb_lect

lire_la_BD();

//accès à la BD

down(mutex);

nb_lect --;

if (nb_lect == 0) up (db);

//si le dernier lecteur

up (mutex)

utiliser_données ();

//Section restante

} } //rédacteur void écriture(){

while (true) {

//boucle sans fin

créer_données ();

//Section restante

down (db);

ecrire_dans_la_BD();

//accès à la BD

up (db);

} }

Partagez vos remarques, questions ou propositions d'amélioration ici...

Enregistrer un commentaire (0)
Plus récente Plus ancienne

Publicité 1

Publicité 2