This is an old revision of the document!


Devoir 2 - Allocateur de mémoire

Le but de ce devoir est de créer une bibliothèque d’allocation de mémoire appelée sde_alloc. Il simule la modalité dans laquel la mémoire est allouée à l’aide de l’allocateur standard, c’est-à-dire des fonctions malloc et free.

Informations générales

Date limite: 17 Mars, 23:55
Points: 1 point de la note finale
Le devoir est à rendre sur: vmchecker.cs.pub.ro
Rendre en retard: 1 points / jour (maximum 4 jours)

Connaissance évaluée

  • Utiliser le langage C
  • Utiliser des structures de données
  • Comprendre l'allocation de mémoire

Règles

  1. Le code source doit être indenté (-0.1p)
  2. Vous devez écrire un fichier nommé Readme et expliquer comment vous avez écrit les devoirs (-0.1p)
  3. Le devoir ne doit pas à avoir des fuites de mémoire (-0.5p)

Copiage

Le devoir est individuel. Toute tentative de copie entraînera 0p pour les devoirs. Système anti-copie automatisé sera utilisé.

Questions

Si vous avez des questions concernant le devoir, posez-les en postant un issue sur le github repository avec le format [allocator] <le titre de votre question> . Vous aurez besoin d'un compte github pour cela.

NE POSTEZ AUCUN CODE. Ceci est considéré comme copiage et vous aller recevoir 0p pour le devoir.

Si vous souhaitez recevoir un e-mail lorsque des problèmes sont signalés ou lorsqu'il y a de nouveaux messages, accédez au site github repository et cliquez Watch.

Le Allocateur de mémoire

Le but de ce devoir est d’écrire une bibliothèque qui gère l’allocation de mémoire. Lors de l'initialisation, la bibliothèque allouera une grande zone de mémoire (spécifiée par l'utilisateur) à l'aide des fonctions d'allocation standard (malloc). La zone mémoire initialement allouée, appelée espace, représente l'espace que la bibliothèque va gérer.

L'utilisateur de la bibliothèque utilisera ses fonctions pour allouer de la mémoire dans l'espace.

Les étapes d'utilisation de la bibliothèque sont les suivantes:

  1. initialization d'un espace avec sde_memory_init
  2. allouer et desallouer de la mémoire dans l'espace en utilisant sde_alloc et sde_free
  3. désinitialisation de l'espace de mémoire en utilisant sde_memory_free

Les fonctions de la bibliothèque sont les suivantes:

// Initialize the system with size bytes of memory
void * sde_memory_init (size_t size);
 
// Stop the system and free all resources
void sde_memory_free ();
 
// Allocate memory (size in bytes)
void * sde_alloc (size_t size);
 
// Reallocate memory
void * sde_realloc (void * p, size_t size);
 
// Allocate memory and fill it with zero
void * sde_zero_alloc (size_t size);
 
// Reallocate memory and fill the rest with zero
void * sde_zero_realloc (void * p, size_t size);
 
// free memory
void sde_free (void *p);
 
// Print all allocated (ALLOC: address -> size)
void sde_print_allocated ();
 
// Print all free (FREE: address -> size)
void sde_print_free ();
 
// Print all blocks (ALLOC: address -> size or FREE: address -> size)
void sde_print ();
 
// Return the last error
int sde_error ();

Zones de mémoire

La bibliothèque alloue initialement un espace de mémoire. A l'intérieur, cet espace contiendra plus de zones de mémoire allouées et non alloué (free). Chaque zone de mémoire est caractérisée par deux paramètres:

  • position (offset)
  • sa longueur (size)

Au debut, l'espace de mémoire est constitué d'une seule zone non allouée qui a une position 0 et une longueur égal à la longueur de l'espace de mémoire. Après la première allocation, l'espace contiendra deux zones:

  • une zone allouée (avec position 0 et la longueur spécifiée a l'allocation)
  • une zone non allouée suivant immédiatement la zone allouée et la longueur représentée par le reste de l'espace

Après plusieurs allocations, l'espace de mémoire aura plusieurs zones allouées et non allouées.

 Memory Space

Erreurs

La bibliothèque peut avoir l'une des erreurs suivantes

#define SDE_OK 						0	// success
#define SDE_NO_INIT 		-1	// you are trying to use a function before calling sde_memory_init
#define SDE_MALLOC_FAIL 			-2	// the malloc function you used has returned null
#define SDE_NO_SPACE_LEFT			-3	// there is no space to allocated the requested size
#define SDE_NOT_ALLOCATED			-4 // the pointer was not allocated using the library

Fonctions

sde_memory_init

Cette fonction initialise la bibliothèque et l'space.

void * sde_memory_init (size_t size);
Paramètres
  • size: la taille de l'espace de mémoire à allouer
Valeur de retour
  • La fonction renvoie un pointeur sur l'espace.
  • NULL en cas d'erreur
Erreurs

Les erreurs possibles sont:

  • SDE_OK - success
  • SDE_MALLOC_FAIL - impossible d'allouer espace de mémoire

Cette fonction doit être appelée avant toute autre fonction de la bibliothèque. L'implémentation de la fonction doit allouer l'espace de mémoire (à l’aide des fonctions d’allocation standard) et initialiser les autres variables nécessaires.

sde_memory_free

Cette fonction désinitialise la bibliothèque et l'space, pratiquement désallouée toute la mémoire allouée.

void sde_memory_free ();
Valeur de retour
  • La fonction n'a pas de valeur de retour
Erreurs

Les erreurs possibles sont:

  • SDE_OK - success
  • SDE_NO_INIT - la fonction est utilisée avant l'initialisation de la bibliothèque

Cette fonction doit être appelée avant que le programme s’arrête. Après avoir appelé cette fonction, aucune ne peut utiliséeune une autre fonction dans la bibliothèque (sauf sde_error). Pour une utilisation ultérieure de la bibliothèque, il faut appeler la fonction sde_memory_init.

sde_alloc

Cette fonction alluée une zone mémoire à l'intérieur de l'space.

void * sde_alloc (size_t size);
Paramètres
  • size: la taille de la mémoire destinée à être allouée à l'intérieur de l'espace.
Valeur de retour
  • la fonction renvoie un pointeur sur la zone mémoire allouée à l'intérieur de l'espace.
  • NULL en cas d'erreur
Erreurs

Les erreurs possibles sont:

  • SDE_OK - success
  • SDE_NO_INIT - la fonction est utilisée avant l'initialisation de la bibliothèque
  • SDE_NO_SPACE_LEFT - impossible d'allouer la zone mémoire à l'intrieur de l'espace car l'espace disponible est insuffisant.

L'adresse de retour est la somme de:

  • l'adresse du pointeur de début de l'espace
  • la position à l'intérieur de l'espace

Par exemple, si le pointeur sur l'espace est space_address et que la position dans l'espace est n, le pointeur est calculé comme suit:

int address; 
void *pointer;
 
address = (int)space_address;
address = address + n;
pointer = (void*)address;

sde_zero_alloc

Cette fonction alluée une zone mémoire à l'intérieur de l'espace et le remplit avec l'octet 0. Fondamentalement, il est identique à sde_alloc, elle ajoute simplement le remplissage zéro.

void * sde_zero_alloc (size_t size);
Paramètres
  • size: la taille de la mémoire destinée à être allouée à l'intérieur de l'espace.
Valeur de retour
  • la fonction renvoie un pointeur sur la zone mémoire allouée à l'intérieur de l'espace.
  • NULL en cas d'erreur
Erreurs

Les erreurs possibles sont:

  • SDE_OK - success
  • SDE_NO_INIT - la fonction est utilisée avant l'initialisation de la bibliothèque
  • SDE_NO_SPACE_LEFT - impossible d'allouer la zone mémoire à l'intrieur de l'espace car l'espace disponible est insuffisant.

sde_free

Cette fonction supprime une zone mémoire allouée à l'intérieur de l'espace.

void sde_free (void *p);
Paramètres
  • p: un pointeur précédemment renvoyé à l'une des fonctions d'allocation de bibliothèque.
Valeur de retour
  • La fonction n'a pas de valeur de retour
Erreurs

Les erreurs possibles sont:

  • SDE_OK - success
  • SDE_NO_INIT - la fonction est utilisée avant l'initialisation de la bibliothèque
  • SDE_NOT_ALLOCATED - le pointeur pour lequel la désalocation a été demandée n'a pas été attribué à l'avance

sde_print_allocated

Cette fonction affiche à l'écran toutes les zones allouées dans l'espace.

void sde_print_allocated ();
Valeur de retour
  • La fonction n'a pas de valeur de retour
Erreurs

Les erreurs possibles sont:

  • SDE_OK - success
  • SDE_NO_INIT - la fonction est utilisée avant l'initialisation de la bibliothèque

Le format d'affichage à l'écran est le suivant:

ALLOC: 0 100
ALLOC: 200 30
ALLOC: 120 30

L'ordre d'affichage des zones n'est pas pertinent.

Cet exemple suggère qu'il y a 3 zones attribuées:

  • une en position 0 ayant une longueur de 100 octets
  • une en position 200 avec une longueur de 30 octets
  • une en position 120 ayant une longueur de 30 octets

sde_print_free

Cette fonction affiche toutes les zones non allouées à l'intérieur de l'space.

void sde_print_free ();
Valeur de retour
  • La fonction n'a pas de valeur de retour
Erreurs

Les erreurs possibles sont:

  • SDE_OK - success
  • SDE_NO_INIT - la fonction est utilisée avant l'initialisation de la bibliothèque

Le format d'affichage à l'écran est le suivant:

FREE: 150 50
FREE: 230 2400

L'ordre d'affichage des zones n'est pas pertinent.

Cet exemple suggère qu'il existe 3 allocations non allouées:

  • une en position 150 ayant une longueur de 50 octets
  • une en position 230 ayant une longueur de 2400 octets

sde_print_allocated

Cette fonction affiche à l'écran toutes les zones de l'espace, qu'elles soient allouées ou non.

void sde_print ();
Valeur de retour
  • La fonction n'a pas de valeur de retour
Erreurs

Les erreurs possibles sont:

  • SDE_OK - success
  • SDE_NO_INIT - la fonction est utilisée avant l'initialisation de la bibliothèque

Le format d'affichage à l'écran est le suivant:

ALLOC: 0 100
ALLOC: 200 30
ALLOC: 120 30
FREE: 150 50
FREE: 230 2400

L'ordre d'affichage des zones n'est pas pertinent.

Cet exemple suggère:

  • qu'il y a 3 zones attribuées:
    • une en position 0 ayant une longueur de 100 octets
    • une en position 200 avec une longueur de 30 octets
    • une en position 120 ayant une longueur de 30 octets
  • qu'il existe 3 allocations non allouées:
    • une en position 150 ayant une longueur de 50 octets
    • une en position 230 ayant une longueur de 2400 octets

sde_error

Cette fonction renvoie le code d'erreur le plus récent.

int sde_error ();
Valeur de retour
  • La fonction renvoie le code d'erreur le plus récent.

Avant de revenir, chaque fonction de la bibliothèque définit un code d'erreur. Il peut être reçu par l'utilisateur en utilisant sde_error.

Par exemple, après un appel sde_alloc, printf affichera 0 si l’allocation a réussi ou un numéro d'erreur si sde_alloc avait une erreur.

sde_alloc (10);
 
printf ("%d\n", sde_error());

Suggestions pour résoudre

Le devoir est relativement complexe par rapport au précédent. Un modèle pour le début du devoir est disponible dans repository dans le répertoire tema2. Pour résoudre le devoir, nous suggérons les étapes suivantes:

  1. Ecrivez les fonctions sde_memory_init, sde_memory_free et sde_error. Celles-ci impliquent l'allocation de l'espace (avec malloc) et la déclaration d'une variable d'erreur.
  2. Ecrivez les fonctions sde_alloc, sde_free pour travailler pour une seule allocation
  3. Écrire des structures de données pour conserver des zones de mémoire (plus de détails ci-dessous)
  4. Ecrivez les fonctions sde_print_alloc, sde_print_free et sde_print
  5. Modifiez les fonctions sde_alloc et sde_free afin qu'elles fonctionnent avec un nombre fixe d'allocations maximum (afin que vous puissiez utiliser des structures de données de taille fixe pour conserver les allocations).
  6. Modifier les fonctions sde_alloc et sde_free afin qu'elles fonctionnent avec un nombre illimité d'allocations (limitées uniquement par l'espace mémoire disponible)

Structures de données

Pour conserver les zones dans la l'espace mémoire, vous pouvez utiliser les structures de données que vous préférez. Voici quelques suggestions:

  • deux chaînes de nombres, une pour la position (offset) et une pour la taille (size); les éléments doivent être triés par position.
  • une série de structures contenant deux éléments: la position et la longueur; la chaîne doit être triée par l'élément position
  • une liste de structures contenant deux éléments: position et longueur

Au début, nous vous recommandons d'utiliser des structures de données de taille fixe, puis de passer à une taille variable. Pour les deux premières variantes des structures de données, le plus simple est l’allocation dynamique avec une taille initiale, et si la taille devient trop petite, la réallocation avec la longueur plus haut.

Télécharger les devoirs

Les devoirs doivent être téléchargés sur vmchecker. Connectez-vous avec votre nom d'utilisateur moodle, sélectionnez le cours Systemes d'Explotation (FILS) et téléchargez l'archive de devoir.

Readme

Le fichier readme a le format suivant:

Nom complet
Groupe

Une explication comment vous avez écrit le devoir, ce que vous avez utilisé, les idées principales.

Archivage de devoir

Pour télécharger votre devoir, suivez les instructions suivantes:

  1. Créez une archive zip (pas rar, ace, 7zip ou autre) contenant:
    • vos fichiers antet (*.h)
    • vos fichiers source (*.c)
    • le fichier Makefile (déjà fait dans le template de devoir)
    • le fichier Readme
  2. Connectez-vous avec vmchecker
  3. sélectionner le cours Systemes d'Explotation (FILS)
  4. sélectionnez 2. Allocator
  5. télécharger l'archive

L'archive doit contenir les fichiers dans sa racine, pas dans un dossier. NE PAS archiver un dossier avec les fichiers, archiver DIRECTEMENT les fichiers.

NE PAS inclure les fichiers objets (*.o) et le fichier executable (Suggestion: utilisez make clean pour les supprimer avant d’archiver le devoir).

Lorsque l'archive est téléchargée, vmchecker va exécuter:

unzip archive.zip homework
cd homework
make build
make run
sde/teme/tema_fr_2.1551697551.txt.gz · Last modified: 2019/03/04 13:05 by alexandru.radovici
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0