This is an old revision of the document!
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
.
Le devoir est individuel. Toute tentative de copie entraînera 0p pour les devoirs. Système anti-copie automatisé sera utilisé.
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.
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 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:
sde_memory_init
sde_alloc
et sde_free
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 ();
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:
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:
Après plusieurs allocations, l'espace de mémoire aura plusieurs zones allouées et non allouées.
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
Cette fonction initialise la bibliothèque et l'space.
void * sde_memory_init (size_t size);
Les erreurs possibles sont:
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.
Cette fonction désinitialise la bibliothèque et l'space, pratiquement désallouée toute la mémoire allouée.
void sde_memory_free ();
Les erreurs possibles sont:
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.
Cette fonction alluée une zone mémoire à l'intérieur de l'space.
void * sde_alloc (size_t size);
Les erreurs possibles sont:
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;
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);
Les erreurs possibles sont:
Cette fonction supprime une zone mémoire allouée à l'intérieur de l'espace.
void sde_free (void *p);
Les erreurs possibles sont:
Cette fonction affiche à l'écran toutes les zones allouées dans l'espace.
void sde_print_allocated ();
Les erreurs possibles sont:
Le format d'affichage à l'écran est le suivant:
ALLOC: 0 100 ALLOC: 200 30 ALLOC: 120 30
Cet exemple suggère qu'il y a 3 zones attribuées:
Cette fonction affiche toutes les zones non allouées à l'intérieur de l'space.
void sde_print_free ();
Les erreurs possibles sont:
Le format d'affichage à l'écran est le suivant:
FREE: 150 50 FREE: 230 2400
Cet exemple suggère qu'il existe 3 allocations non allouées:
Cette fonction affiche à l'écran toutes les zones de l'espace, qu'elles soient allouées ou non.
void sde_print ();
Les erreurs possibles sont:
Le format d'affichage à l'écran est le suivant:
ALLOC: 0 100 ALLOC: 200 30 ALLOC: 120 30 FREE: 150 50 FREE: 230 2400
Cet exemple suggère:
Cette fonction renvoie le code d'erreur le plus récent.
int sde_error ();
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());
Le devoir est relativement complexe par rapport au précédent. Un template 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:
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.sde_alloc
, sde_free
pour travailler pour une seule allocationsde_print_alloc
, sde_print_free
et sde_print
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).sde_alloc
et sde_free
afin qu'elles fonctionnent avec un nombre illimité d'allocations (limitées uniquement par l'espace mémoire disponible)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:
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.
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.
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.
Pour télécharger votre devoir, suivez les instructions suivantes:
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