Séance de TP numéro 8 : Files de messages, Sémaphores et Mémoire Partagée

Files de messages.

L'intérêt majeur des files de messages, comparativement aux pipes, est que la communication peut s'effectuer dans les deux sens. Voici quelques fonctions usuelles.
Sémaphores.
Les sémaphores peuvent être utilisés pour fournir un accès exclusif à certaines ressources de la machine, ou pour limiter le nombre de processus qui utilisent en même temps une ressource. Les sémaphores permettent ainsi à plusieurs processus de se synchroniser.

Mémoire partagée.
Le partage de mémoire entre plusieurs processus est le moyen le plus rapide d'échange de données. Pour pouvoir partager de la mémoire, on doit utiliser les primitives suivantes :

Exercice 1 : Files de messages

On souhaite ici mettre en place une communication entre un client et un serveur par le biais d'une file de messages. Le serveur effectue l'addition de deux nombres envoyés par un client et renvoie le résultat. La communication s'effectuant par l'intermédiaire d'une file de messages, cette file contient tout à la fois les requêtes en provenance des clients et les réponses du serveur.

Dans cette application, le serveur doit uniquement consommer les requêtes depuis la file de messages. Les clients, de leur côté, doivent uniquement lire la réponse qui les concerne.

Pour parvenir à ce schéma, on utilise le champ type dans la structure des messages véhiculés par la file de messages. Ainsi, le serveur désigne le client auquel s'adresse la réponse en remplissant le champ type de la réponse avec la valeur du pid du client. Ce pid est indiqué par le client au niveau de sa requête. Le client, quant à lui, désigne le serveur comme destinataire de la requête en initialisant le champ type de sa requête avec une valeur positive qui ne peut correspondre à un pid de processus utilisateur, par exemple la valeur 1 (cette valeur 1 correspond obligatoirement au processus init)
La requête et la réponse auront le format suivant :

struct requete {long letype; int nb1; int nb2; pid_t mon_pid; };
struct reponse {long letype; int res; };

Solution : Serveur et Client

Exercice 2 : Les six cuisinières et le quatre-quarts

Six cuisinières souhaitent confectionner un quatre-quarts, gâteau composé des quatres ingrédients suivants : oeufs, farine, beurre et sucre (en poudre). Chacune d'elles dispose d'une quantité illimitée de deux de ces ingrédients. La disposition des lieux fait qu'une seule personne à la fois peut confectionner son gâteau. Lorsqu'aucune cuisinière ne travaille, un agent extérieur dépose la quantité nécessaire de deux ingrédients permettant, ajoutés à une égale quantité des autres, la confection du gâteau. Les cuisinières étant bien élevées, aucune ne se saisira d'un seul ingrédient : seule celle ayant besoin des deux ingrédients déposés, s'en saisira. On se propose de décrire une simulation de cette situation au moyen d'un ensemble de cinq sémaphores (un associé à chaque ingrédient dont la valeur sera 1 quand il aura été déposé et un autre qui sera égal à 1 lorsque l'agent extérieur pourra déposer des ingrédients, c'est à dire quand aucune cuisinière ne sera en action).

Exercice 3 : Lecteurs-rédacteurs

Dans cet exercice, on considère la situation où une zone de mémoire partagée est accédée simultanément en lecture et en écriture. Il y a donc deux types de processus, d'une part des processus lecteurs et d'autre part des processus rédacteurs.

Deux objectifs doivent être atteints: le contenu de la zone de mémoire doit évidemment rester cohérent (donc les écritures ne doivent pas avoir lieu en même temps) et les lecteurs doivent lire une information stable (c'est-à-dire que les lecteurs ne doivent pas lire une information en cours de modification).

Bibliographie : Source d'exercices

On pourra se référer aux TPs analogues donnés en 2008 et 2009 par Damien Vergnaud .