Skip to topic | Skip to bottom
Home
Minfo05
Minfo05.TpAsySeance9r1.2 - 03 Dec 2005 - 22:40 - OlivierDalletopic end

Start of topic | Skip to actions

Approfondissement Système - TP9

Une FIFO, pour changer un peu ...

L'objectif de cet exercice est d'apprendre à utiliser les primitives de synchronisation avancées présentées dans le cours 9 et en particulier les sémaphores. Les prétextes pour synchroniser des processus à l'aide de sémaphores ne manquent pas, mais pour éviter de perdre trop de temps sur les aspects algorithmiques et programmation qui ne nous intéressent pas ici, nous allons une nouvelle fois reprendre l'exemple de la FIFO. Dans cette version, nous allons utiliser les sémaphores pour implémenter l'algorithme des producteurs/consommateurs avec un tampon circulaire de tampons.

Dans cet exercice, les producteurs sont les processus qui font des écritures et les consommateurs, les processus qui font des lectures. A chaque écriture, un nouveau tampon, contenant les données écrites est donc produit. Tant que la capacité du tampon de tampons n'est pas atteinte, les écritures peuvent se poursuivre. Mais lorsque le tampon de tampons est plein, les producteurs doivent être endormis, jusqu'à ce qu'une place se libère. Et symétriquement, quand une lecture se produit, si le tampon de tampons est vide, le lecteur doit être endormi jusqu'à ce qu'un producteur ne l'ai remplit avec au moins une écriture.

Vous implémenterez le tampon de tampons en créant un tableau de structures telles que les suivantes :

typedef struct {
  char *buf;
  int buflen;
} buf_slot;

La taille du tableau sera donnée par une macro définie à la compilation (choisissez une petite valeur, par exemple 4, pour faciliter les tests). Notez que dans cette structure, la mémoire pour stocker les données n'est pas allouée. C'est en effet le producteur qui devra allouer la mémoire pour stocker le résultat de son écriture, avec kmalloc. Vous pouvez éventuellement fixer une taille maximum d'écriture (par exemple 4KO max par écriture). De son coté, le consommateur devra libérer la mémoire allouée lors de sa lecture, quelle que soit la quantité lue (modèle datagramm UDP : s'il lit moins que la quantité stockée, des données sont perdues, s'il lit plus, il n'obtient que ce qui est disponible).

Nous avons vu une solution à ce problème l'an dernier, avec deux sémaphores: l'un appelé "full" et l'autre "empty". L'algorithme est très simple, si vous avez oublié la solution, essayez d'abord de la retrouver sur le papier. Dans cet algorithme, ce sont les sémaphores qui font tout le travail de synchronisation et de comptage des emplacements libres ou occupés. La seule chose qu'il reste à programmer, c'est le calcul de la prochaine position de lecture ou d'écriture dans le tableau (comme on l'utilise de façon circulaire, vous devriez utiliser des modulos quelque part ...).

Vous ferez attention à traiter correctement les erreurs: par exemple, si une allocation mémoire échoue lors de l'écriture, il ne faut pas que le producteur oublie de libérer les éventuels sémaphores qu'il a pris avant de retourner une erreur. Et rappelez-vous qu'il y a deux types d'opération pour prendre un sémaphore : down(s) et down_interruptible(s). Réflechissez bien celle dont vous avez vraiment besoin...

NEW Correction :

-- OlivierDalle - 21 Nov 2005
to top

I Attachment sort Action Size Date Who Comment
Makefile manage 1.1 K 03 Dec 2005 - 22:37 OlivierDalle Makefile
generic_mod.h manage 2.2 K 03 Dec 2005 - 22:38 OlivierDalle Fichier d'inclusion generique
fifodev_sema.c manage 5.0 K 03 Dec 2005 - 22:39 OlivierDalle Source du module

You are here: Minfo05 > ApprofondissementSysteme > TpAsySeance9

to top

Copyright © 1999-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback