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.
Biblioteca poate intoarce una din urmatoarele erori
#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
Acesta functie realizeaza initializarea bibliotecii si a spatiului.
void * sde_memory_init (size_t size);
Erori posibile sunt:
Aceasta functie trebuie apelata inaintea oricarei alte functii din biblioteca. Implementarea functiei trebuie sa aloce spatiul de memorie (folosind functiile standard de alocare) si sa initializeze alte variabile necesare.
Acesta functie face deinitializarea bibliotecii si a spatiului, practic dealoca toata memorie alocata.
void sde_memory_free ();
Erori posibile sunt:
Aceasta functie trebuie apelata inaintea de oprirea programului. Dupa apelarea acestei functii, nu se mai poate folosi nici o alta functie din biblioteca (cu exceptia sde_error). Pentru folosirea ulterioara a bibliotecii, trebuie apelata din nou functia sde_memory_init.
Acesta functie face alocarea unei zone de memorie in interiorul spatiului.
void * sde_alloc (size_t size);
Erori posibile sunt:
De exemplu, daca pointer-ul catre spatiu este space_address
si pozitia in interiorul spatiului este n
, pointer-ul este calculat asa:
int address; void *pointer; address = (int)space_address; address = address + n; pointer = (void*)address;
Acesta functie face alocarea unei zone de memorie in interiorul spatiului si o umple cu byte-ul 0. Practic este identica cu sde_alloc, doar ca adauga umplerea cu zero.
void * sde_zero_alloc (size_t size);
Erori posibile sunt:
Acesta functie face dealocarea unei zone de memorie din interiorul spatiului.
void sde_free (void *p);
Erori posibile sunt:
Acesta functie afiseaza pe ecran toate zonele alocate din interiorul spatiului spatiului.
void sde_print_allocated ();
Erori posibile sunt:
Formatul afisarii pe ecran este urmatorul:
ALLOC: 0 100 ALLOC: 200 30 ALLOC: 120 30
Acest exemplu sugereaza ca exista 3 zone alocate:
Acesta functie afiseaza pe ecran toate zonele nealocate din interiorul spatiului spatiului.
void sde_print_free ();
Erori posibile sunt:
Formatul afisarii pe ecran este urmatorul:
FREE: 150 50 FREE: 230 2400
Acest exemplu sugereaza ca exista 3 nealocate alocate:
Acesta functie afiseaza pe ecran toate zonele din interiorul spatiului spatiului, atat alocate cat si nealocate.
void sde_print ();
Erori posibile sunt:
Formatul afisarii pe ecran este urmatorul:
ALLOC: 0 100 ALLOC: 200 30 ALLOC: 120 30 FREE: 150 50 FREE: 230 2400
Acest exemplu sugereaza ca exista 3 zone alocate:
Acesta functie intoarce cel mai recent cod de eroare.
int sde_error ();
Fiecare functie din biblioteca, inainte de a intoarce, seteaza un cod de eroare. Acesta poate fi primit de utilizator prin folosirea functiei sde_error.
Spre exemplu, in urma unui apel sde_alloc, printf va afisa 0 daca alocarea a fost facuta cu succes sau un numar de eroare in cazul in care sde_alloc a avut o eroare.
sde_alloc (10); printf ("%d\n", sde_error());
Tema este relativ complexa fata de cea anterioara. Un sablon pentru inceperea temei este disponibil in repository in directorul Devoir/allocator.
Pentru a rezolva tema, va sugeram urmatorii pasi:
sde_memory_init
, sde_memory_free
si sde_error
. Acestea presupun alocarea spatiului (folosind malloc) si declararea unei variabile de eroare.sde_alloc
, sde_free
astfel incat sa functioneze pentru o singura alocaresde_print_alloc
, sde_print_free
si sde_print
sde_alloc
si sde_free
astfel incat sa functioneze pentru un numar maxim fix de alocari (astfel incat sa puteti folosi structuri de date cu dimensiune fixa pentru a retine alocarile)sde_alloc
si sde_free
astfel incat sa functioneze pentru un numar nelimitat de alocari (limitat doar de spatiul de memorie disponibil)Pentru retinerea zonelor din spatiul de memorie, puteti folosi ce structuri de date preferati. Aici sunt cateva sugestii:
Initial recomandam folosirea structurilor de date cu dimensiune fixa, apoi trecerea la dimensiune variabila. Pentru primele doua, cel mai simplu este alocarea dinamica cu o dimensiune initiala si, daca dimensiunea devine prea mica, realocarea lor cu lungime mai mare.
Tema se va incarca pe vmchecker. Logati-va pe site cu folosind utilizatorul de pe moodle, selectati cursul Systemes d'Explotation (FILS) si incarcati arhiva temei.
Fisierul readme are urmatorul format:
Numele vostru intreg Grupa Descrierea rezolvarii temei, de ce ati ales anumite solutii, etc.
Pentru a incarca tema, urmariti pasii:
NU includeti fisierele obiect (*.o) si executabilul. (Sfat: folositi make clean pentru a sterge acestea inainte de arhivarea temei)
Dupa ce incarcati arhiva, vmchecker va rula:
unzip archive.zip homework cd homework make build make run