Université Pierre et Marie Curie Master 2016 2017
PR : Travaux Dirigés 7. Introduction aux sémaphores

Cette séance est consacrée aux sémaphores. Selon les plates-formes, vous aurez peut-être besoin d’ajouter dans le Makefile les options -lrt et -lpthread pour l’édition de liens.



1 Barrière par sémaphores

Une barrière est un mécanisme de synchronisation. Elle permet à N processus de prendre rendez-vous en un point donné de leur exécution. Quand un des processus atteint la barrière, il reste bloqué jusqu’à ce que tous les autres arrivent à la barrière. Lorsque les N processus sont arrivés à la barrière, chacun peut alors reprendre son exécution.

Sans utiliser de compteur partagé, programmez la fonction wait_barrier prenant en argument un entier N et qui permet à N processus de se synchroniser sur une barrière. Ecrire ensuite un programme main créant par fork autant de processus que demandé sur la ligne de commande, chacun exécutant le code suivant :

void process (int NB_PCS) {
   printf ("avant barrière);
   wait_barrier (NB_PCS);
   printf ("après barrière);
   exit (0);
}

L’affichage devra être le suivant :

avant barrière
avant barrière
après barrière
après barrière
En d’autres termes, on veut que tous les messages « avant barrière » soient affichés avant les messages « après barrière ». On utilisera les fonctions POSIX sem_wait et sem_post, ainsi que sem_close et sem_unlink pour finir.
Exemple d'appel :
bin/posix_barrier 4
Fichier à créer : src/posix_barrier.c

2 Barrière par sémaphores Sytem V (facultatif)

Si vous connaissez les sémaphores en System V (semop, semctl, semget), donner la version System V de l’exercice précédent.

Exemple d'appel :
bin/wait_barrier 4
Fichier à créer : src/wait_barrier.c

3 Encore des producteurs et des consommateurs

Reprenez l’exercice Processus légers et fichiers en remplaçant les Threads par des processus, et en construisant la pile dans un segment de mémoire partagée.

Exemple d'appel :
echo "123456789" | bin/prod_conso_partagees 5 3
Fichier à créer : src/prod_conso_partagees.c

4 Synchronisation d’affichage entre processus en utilisant des sémaphores

Nous considérons qu’un processus crée N processus fils. Chaque processus fils possède un identifiant unique (1, …, N). Chacun commence par s’endormir pendant (N % identifiant) secondes. A son réveil il affiche son identifiant et son Pid, cependant ces affichages doivent être faits par ordre croissant d’identifiant. Pour assurer une telle synchronisation, vous devrez utiliser des sémaphores anonymes.

Le processus père doit attendre la terminaison de tous ses fils avant de se terminer lui aussi.

Exemple d'appel :
$PWD/bin/sem_affiche 7
Fichier à créer : src/sem_affiche.c

5 Annexes


makefile

producteur_consommateur.h