Zadanie 1 – Správca pamäti
V štandardnej knižnici jazyka C sú pre alokáciu a uvoľnenie pamäti k dispozícii funkcie malloc, a free. V tomto zadaní je úlohou implementovať vlastnú verziu alokácie pamäti.
Vašou úlohou je implementovať TRI funkcie:
void *memory_alloc(unsigned int size);
void memory_free(void *ptr);
void memory_init(void *ptr, unsigned int size);
Vo vlastnej implementácii môžete definovať aj iné pomocné funkcie ako vyššie spomenuté, nesmiete však použiť existujúce funkcie malloc a free.
Funkcia memory_alloc má poskytovať služby analogické štandardnému malloc. Teda, vstupné parametre sú veľkosť požadovaného súvislého bloku pamäte a funkcia mu vráti: ukazovateľ na úspešne alokovaný kus voľnej pamäte, ktorý sa vyhradil, alebo NULL, keď nie je možné súvislú pamäť požadovanej veľkosť vyhradiť.
Funkcia memory_free slúži na uvoľnenie vyhradeného bloku pamäti, podobne ako funkcia free. V prípade, že parameter vstupujúci do volania funkcie nie je (platný) smerník alokovaný funkciou memory_alloc, do nového riadku vypíšte chybovú hlášku Invalid pointer! A program ukončite s návratovou hodnotou 1 (chyba – volanie exit(1) ).
Vaša implementácia správcu pamäti bude hodnotená podľa úspešnosti alokácií vzhľadom na voľné bloky pamäte. Pokiaľ je aspoň 20% voľnej pamäti, mali by ste úspešne prideliť pamäť.
Funkcia memory_init slúži na inicializáciu spravovanej voľnej pamäte. Predpokladajte, že funkcia sa volá práve raz pred volaniami memory_alloc a memory_free. Viď testovanie nižšie. Ako vstupný paramter funkcie príde blok pamäte, ktorú môžete použiť pre organizovanie a aj pridelenie voľnej pamäte.Vaše funkcie nemôžu používať globálne premenné okrem jednej globálnej premennej na zapamätanie smerníku na pamäť, ktorá vstupuje do funkcie memory_init. Smerníky, ktoré prideľuje vaša funkcia memory_alloc musia byť výhradne z bloku pamäte, ktorá bola pridelená funkcii memory_init.
Pred odovzdaním si vlastnú implementáciu dôkladne otestujte. Do testovača by ste mali odovzdávať už funkčnú verziu. Môžete síce do testovača odovzdať aj na viac krát, ale pokiaľ tam bude mať niekto 30 odovzdaných pokusov, niečo asi nie je v poriadku.
Ukážka testu:
#include <string.h>
int main()
{
char region[50];
memory_init(region, 50);
char* pointer = (char*) memory_alloc(10);
if (pointer)
memset(pointer, 0, 10);
if (pointer)
memory_free(pointer);
return 0;
}