Warning
This page is located in archive. Go to the latest version of this course pages.

Cvičení 11 : Uživatelský paměťový alokátor pro OS NOVA

Na tomto cvičení si zkusíte implementovat alokátor dynamické paměti, který bude využívat systémové volání brk z minulého cvičení.

Domácí příprava

Pro toto cvičení budete potřebovat:

Zadání úlohy

Implementujte jednoduchý alokátor paměti pro uživatelský prostor OS NOVA. Váš alokátor bude implementovat funkce my_malloc a my_free s následujícími prototypy:

extern "C" void *my_malloc(unsigned int size);
extern "C" int my_free(void *address);

Tyto dvě řádky vložte na začátek vašeho souboru user/mem_alloc.cc. extern “C” zajišťuje, aby funkce šla volat jak z programů v C+​+, tak v C.

Od alokátoru budou očekávány následující vlastnosti:

  • Bude schopen alokovat a uvolnit paměť.
  • Při kompilaci nejsou generována žádná varování.
  • Alokátor bude možné používat po přilinkování k aplikaci user/hello.c ze zdrojových kódů OS NOVA.
  • my_malloc alokuje paměť velikosti size a vrací adresu začátku alokované paměti. Pokud paměť požadované velikosti nelze alokovat, my_malloc vrací 0.
  • my_free uvolní paměť alokovanou funkcí my_malloc. Parametr address je hodnota dříve vrácená funkcí my_malloc. Pokud je paměť úspěšně uvolněna, funkce vrátí 0, v opačném případě je vrácen nenulový kód chyby, který si můžete nadefinovat jak chcete.
  • Pokud je my_free zavolána na již uvolněnou paměť nebo na paměť, která nebyla alokována voláním my_malloc, jedná se o chybu. Můžete předpokládat, že program používající váš alokátor nemodifikuje jinou paměť na heapu než tu, vrácenou funkcí my_malloc.
  • Bude používat systémové volání brk pro získání paměti pro alokaci.
  • Paměťová režie alokátoru pro 16bytové alokace bude maximálně 100%. Tedy pokud např. zavolám 1024krát my_malloc(16), alokátor si od jádra vyžádá voláním brk maximálně 32 KiB paměti.
  • Paměť uvolněná voláním my_free půjde znovu alokovat.
  • Paměť alokovaná funkcí my_malloc bude přístupná minimálně do doby zavolání my_free.
  • Žádná část paměti alokované funkcí my_malloc nebude znovu alokována dříve, než bude zavoláno odpovídající my_free.

Nepovinně (pro plný počet bodů) budou navíc vyžadovány následující vlastnosti:

  • Po uvolnění menších sousedních bloků bude možné ve stejné oblasti alokovat jeden velký souvislý blok.

Co se odevzdává:
Archiv obsahující vaši implementaci v souboru user/mem_alloc.cc a soubor kern/src/ec_syscall.cc z minulého cvičení. Můžete ho vytvořit následující řádkou z kořenového adresáře NOVY (nebo si můžete upravit pravidlo hw11 v Makefilu):

zip hw11.zip kern/src/ec_syscall.cc user/mem_alloc.cc 

courses/b4b35osy/cviceni/cviceni11_alokator.txt · Last modified: 2019/12/23 11:10 by sojkam1