Changes between Version 15 and Version 16 of TME2-2014


Ignore:
Timestamp:
Feb 7, 2014, 10:10:23 AM (11 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TME2-2014

    v15 v16  
    77== Objectifs
    88
    9 Le but de cette séance est de programmer les fonctions auxiliaires et l'allocateur mémoire que va utiliser le système. Ces fonctions sont un sous-ensemble de la bibliothèque libc. La librairie contient aussi une API de gestion de listes doublement chainée que nous verrons plus tard.
    10 Nous allons écrire et valider sur Linux. Elles seront adaptées au système plus tard (il y aura très peu de modification).
     9Le but de cette séance est de programmer les fonctions auxiliaires et l'allocateur mémoire que va utiliser le système. Ces fonctions sont un sous-ensemble de la bibliothèque libc. La librairie contient aussi une API de gestion de listes doublement chainées que nous verrons plus tard.
     10Nous allons écrire et valider sur Linux. Elles seront adaptées au système plus tard (il y aura très peu de modifications).
    1111
    1212Pour les fonctions auxiliaires:
     
    2424== Principes de la gestion de la mémoire dynamique
    2525
    26 La zone mémoire disponible pour faire des allocations dynamiques peut être vue comme un ensemble de blocs mémoire (zone de mémoire contiguë de taille variable). l'allocateur doit répondre à des requêtes de type réservation/libération de certains nombres de ces blocs.
     26La zone mémoire disponible pour faire des allocations dynamiques peut être vue comme un ensemble de blocs mémoires (zone de mémoire contiguë de taille variable). l'allocateur doit répondre à des requêtes de type réservation/libération de certains nombres de ces blocs.
    2727
    2828Afin de répondre à ces requêtes, un allocateur doit connaitre l'état de ces blocs: quels sont les blocs libres et ceux occupés (pas encore libérés). Le but d'un allocateur est de répondre à ces requêtes en minimisant d'une part, l'espace mémoire perdu dû à la fragmentation des blocs et d'autre part, le temps de réponse (minimiser l'overhead de gestion).
    2929
    30 Il existe plusieurs stratégies pour atteindre ces deux buts mais il n'y a pas de stratégie optimale car cela dépend du comportement du demandeur (les tailles demandées, la durée de vie d'une réservation, l'ordre des libérations, etc...).
     30Il existe plusieurs stratégies pour atteindre ces deux buts, mais il n'y a pas de stratégie optimale, car cela dépend du comportement du demandeur (les tailles demandées, la durée de vie d'une réservation, l'ordre des libérations, etc.).
    3131
    3232La stratégie d'allocation que nous vous proposons d'implémenter est de type First-Fit. Dans cette stratégie, l'allocateur cherche parmi les blocs libres celui qui a une taille supérieure ou égale à la taille demandée. Il arrête sa recherche dès qu'il en trouve un. Si la taille du bloc trouvé est supérieure à la taille demandée (d'une certaine quantité), il soustrait la taille en trop et en fabrique un nouveau bloc libre. Enfin, il marque le bloc trouvé comme occupé et rend son adresse. Vous pouvez dans un second temps implémenter la stratégie Next-Fit. Dans cette stratégie, l'allocateur utilise un pointeur sur le premier bloc libre afin d'accélérer la recherche.
     
    4040[[Image(exemplefree.png, nolink, align=center, 400px)]]
    4141
    42 Nous avons vu, lors d'une allocation, que l'allocateur peut-être mené à partitionner un bloc libre si sa taille est strictement supérieur à la taille demandée de certaine quantité. Le choix de cette quantité est très important pour la réutilisation des blocs.
     42Nous avons vu, lors d'une allocation, que l'allocateur peut-être amené à partitionner un bloc libre si sa taille est strictement supérieure à la taille demandée.
    4343
    44 L'allocateur doit définir une taille minimum acceptable au dessous du laquelle le partitionnement ne se fera pas. Autrement dit si la taille restante d'un bloc libre n'est pas significative ce n'est pas la peine de partitionner ce bloc sous peine d'accroitre la fragmentation de la mémoire.
     44L'allocateur doit définir une taille minimum acceptable au-dessous de laquelle le partitionnement ne se fera pas. Autrement dit si la taille restante d'un bloc libre n'est pas significative ce n'est pas la peine de partitionner ce bloc sous peine d'accroitre la fragmentation de la mémoire.
    4545
    46 L'allocateur voit les blocs comme multiple de sous blocs de taille fixe, c'est la taille minimum pour répondre à une allocation mémoire. Par exemple : si la taille d'un bloc minimal (un sous bloc) est de 32 octets alors une allocation de 52 octets se traduit par une réservation d'un bloc de  2 * 32 soit de 64 octets. Une allocation de 4 octets se traduit par réservation d'un bloc de 1 * 32 octets. En fait, dans le but de mieux tirer profit du cache de données de niveau 1, on fixe la taille minimale d'un bloc à taille d'une ligne de cache. dans notre cas la taille minimale sera de 64 octets (16 mots de 4 octets).
     46L'allocateur voit les blocs comme multiple de sous blocs de taille fixe, c'est la taille minimum pour répondre à une allocation mémoire. Par exemple : si la taille d'un bloc minimal (un sous bloc) est de 32 octets alors une allocation de 52 octets se traduit par une réservation d'un bloc de  2 * 32 soit de 64 octets. Une allocation de 4 octets se traduit par réservation d'un bloc de 1 * 32 octets. En fait, dans le but de mieux tirer profit du cache de données de niveau 1, on fixe la taille minimale d'un bloc à taille d'une ligne de cache. Dans notre cas la taille minimale sera de 64 octets (16 mots de 4 octets).
    4747
    48 Lors de la libération, l'allocateur reçoit uniquement l'adresse du bloc à libérer mais pas sa taille. l'allocateur doit mettre en place un mécanisme pour retrouver la taille d'un bloc à partir de son adresse.
     48Lors de la libération, l'allocateur reçoit uniquement l'adresse du bloc à libérer, mais pas sa taille. l'allocateur doit mettre en place un mécanisme pour retrouver la taille d'un bloc à partir de son adresse.
    4949
    5050L'allocateur associe à chaque bloc un descripteur qui indique l'état du bloc (libre ou occupé) et sa taille. Un bloc est donc composé de deux parties, un descripteur et un champ données. la figure suivante illustre cette association.
     
    120120
    121121Pour compiler vous devez
    122  * aller dans le répertpoire **libk** et taper **make**.
     122 * aller dans le répertoire **libk** et taper **make**.
    123123 * aller dans le répertoire **test** et taper **make**
    124124
    125 Pour chaque fonction, ou groupe de fonction (kmalloc), vous allez devoir écrire le service et le programme de test en faisant attention a tester les cas limite.
    126 Les fichiers sont compilables mais sont vides ou appelle le service de la libc de linux. Je vous demande aussi de commenter en détail les Makefile.
     125Pour chaque fonction, ou groupe de fonction (kmalloc), vous allez devoir écrire le service et le programme de test en faisant attention à tester les cas limites.
     126Les fichiers sont compilables, mais sont vides ou appelle le service de la libc de linux. Je vous demande aussi de commenter en détail les Makefile.
    127127
    128 Vous pouvez creer des fichiers de test par service.
     128Vous pouvez créer des fichiers de test par service.
    129129 * **./test_kstrlen**
    130130 * **./tsst_kmalloc