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

Erori

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

Functii

sde_memory_init

Acesta functie realizeaza initializarea bibliotecii si a spatiului.

void * sde_memory_init (size_t size);
Parametrii
  • size: dimensiunea spatiului de memorie care va fi alocat
Valoarea intoarsa
  • Functia intoarce un pointer catre spatiu.
  • NULL in caz de eroare
Erori

Erori posibile sunt:

  • SDE_OK - success
  • SDE_MALLOC_FAIL - nu s-a putut aloca spatiul de memorie

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.

sde_memory_free

Acesta functie face deinitializarea bibliotecii si a spatiului, practic dealoca toata memorie alocata.

void sde_memory_free ();
Valoarea intoarsa
  • Functia nu are valoare de intoarcere
Erori

Erori posibile sunt:

  • SDE_OK - success
  • SDE_NO_INIT - functia este folosita inainte sa se fi initializat biblioteca

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.

sde_alloc

Acesta functie face alocarea unei zone de memorie in interiorul spatiului.

void * sde_alloc (size_t size);
Parametrii
  • size: dimensiunea memoriei care se doreste sa fie alocata in interiorul spatiului.
Valoarea intoarsa
  • Functia intoarce un pointer catre zone de memorie alocata in interiorul spatiului.
  • NULL in caz de eroare
Erori

Erori posibile sunt:

  • SDE_OK - success
  • SDE_NO_INIT - functia este folosita inainte sa se fi initializat biblioteca
  • SDE_NO_SPACE_LEFT - nu s-a putat aloca zona de memorie in interiorul spatiului deoarece nu mai exista destul spatiu disponibil.

Adresa intoarsa este suma dintre:

  • adresa pointer-ului de inceput al spatiului
  • pozitia din interiorul spatiului

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;

sde_zero_alloc

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);
Parametrii
  • size: dimensiunea memoriei care se doreste sa fie alocata in interiorul spatiului.
Valoarea intoarsa
  • Functia intoarce un pointer catre zona de memorie alocata in interiorul spatiului.
  • NULL in caz de eroare
Erori

Erori posibile sunt:

  • SDE_OK - success
  • SDE_NO_INIT - functia este folosita inainte sa se fi initializat biblioteca
  • SDE_NO_SPACE_LEFT - nu s-a putut aloca zone de memorie in interiorul spatiului deoarece nu mai exista destul spatiu disponibil.

sde_free

Acesta functie face dealocarea unei zone de memorie din interiorul spatiului.

void sde_free (void *p);
Parametrii
  • p: un pointer ce a fost intors in prealabil de oricare din functiile de alocare ale bibliotecii.
Valoarea intoarsa
  • Functia nu are valoare de intoarcere
Erori

Erori posibile sunt:

  • SDE_OK - success
  • SDE_NO_INIT - functia este folosita inainte sa se fi initializat biblioteca
  • SDE_NOT_ALLOCATED - pointerul pentru care a fost ceruta dealocarea nu a fost alocat in prealabil

sde_print_allocated

Acesta functie afiseaza pe ecran toate zonele alocate din interiorul spatiului spatiului.

void sde_print_allocated ();
Valoarea intoarsa
  • functia nu intoarce valori
Erori

Erori posibile sunt:

  • SDE_OK - success
  • SDE_NO_INIT - functia este folosita inainte sa se fi initializat biblioteca

Formatul afisarii pe ecran este urmatorul:

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

Ordinea afisarii zonelor nu este relevanta.

Acest exemplu sugereaza ca exista 3 zone alocate:

  • una la pozitia 0 avand lungimea de 100 de bytes
  • una la pozitia 200 avand lungimea de 30 de bytes
  • una la pozitia 120 avand lungimea de 30 de bytes

sde_print_free

Acesta functie afiseaza pe ecran toate zonele nealocate din interiorul spatiului spatiului.

void sde_print_free ();
Valoarea intoarsa
  • functia nu intoarce valori
Erori

Erori posibile sunt:

  • SDE_OK - success
  • SDE_NO_INIT - functia este folosita inainte sa se fi initializat biblioteca

Formatul afisarii pe ecran este urmatorul:

FREE: 150 50
FREE: 230 2400

Ordinea afisarii zonelor nu este relevanta.

Acest exemplu sugereaza ca exista 3 nealocate alocate:

  • una la pozitia 150 avand lungimea de 50 de bytes
  • una la pozitia 230 avand lungimea de 2400 de bytes

sde_print_allocated

Acesta functie afiseaza pe ecran toate zonele din interiorul spatiului spatiului, atat alocate cat si nealocate.

void sde_print ();
Valoarea intoarsa
  • functia nu intoarce valori
Erori

Erori posibile sunt:

  • SDE_OK - success
  • SDE_NO_INIT - functia este folosita inainte sa se fi initializat biblioteca

Formatul afisarii pe ecran este urmatorul:

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

Ordinea afisarii zonelor nu este relevanta.

Acest exemplu sugereaza ca exista 3 zone alocate:

  • una la pozitia 0 avand lungimea de 100 de bytes
  • una la pozitia 200 avand lungimea de 30 de bytes
  • una la pozitia 120 avand lungimea de 30 de bytes

sde_error

Acesta functie intoarce cel mai recent cod de eroare.

int sde_error ();
Valoarea intoarsa
  • SDE_NO_INIT - functia este folosita inainte sa se fi initializat biblioteca
  • Functia intoarce cel mai recent cod de eroare

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());

Sugestii de rezolvare

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:

  1. Scrieti functiile sde_memory_init, sde_memory_free si sde_error. Acestea presupun alocarea spatiului (folosind malloc) si declararea unei variabile de eroare.
  2. Scrieti functia sde_alloc, sde_free astfel incat sa functioneze pentru o singura alocare
  3. Scrieti structurile de date pentru retinerea zonelor de memorie (mai multe detalii mai jos)
  4. Scrieti functiile sde_print_alloc, sde_print_free si sde_print
  5. Modificati functiile 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)
  6. Modificati functiile sde_alloc si sde_free astfel incat sa functioneze pentru un numar nelimitat de alocari (limitat doar de spatiul de memorie disponibil)

Structurile de date

Pentru retinerea zonelor din spatiul de memorie, puteti folosi ce structuri de date preferati. Aici sunt cateva sugestii:

  • doua siruri de numere, unul pentru pozitie (offset) si unul pentru dimensiune (size); elementele ar trebui sortate dupa pozitie.
  • un sir de structuri ce contin doua elemente: pozitia si lungimea; sirul ar trebui sortat dupa pozitie
  • o lista inlantuita de structuri care sa contina doua elemente: pozitie si lungime

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.

Trimiterea temei

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.

Readme

Fisierul readme are urmatorul format:

Numele vostru intreg
Grupa

Descrierea rezolvarii temei, de ce ati ales anumite solutii, etc.

Arhiva temei

Pentru a incarca tema, urmariti pasii:

  1. Creati o arhiva zip (nu rar, ace, 7zip sau alt fomrat) care sa contina:
    • toate fisierele header (*.h)
    • toate fisierele sursa (*.c)
    • fisierul Makefile (este deja facut in sablonul temei)
    • fisierul Readme
  2. logati-va pe vmchecker
  3. selectati cursul Systemes d'Explotation(FILS)
  4. selectati 2. Alocator
  5. incarcati arhiva

Arhiva trebuie sa contina toate fisierele (principale) in radacina, nu in subdirectoare. NU arhivati directorul temei, arhivati DIRECT fisierele.

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
sde/teme/tema_fr_2.1551651895.txt.gz · Last modified: 2019/03/04 00:24 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