Jak probíhá alokace (malloc, realloc, free)

Tato stránka není pro nikoho dùležitá. S vlastním OS nemá nic spoleèného a pro programování v TUOXu taky není nutno ji èíst. Pouze dává tìm, kdo budou volat malloc, realloc a free() pøedstavu o tom jak to funguje.

Pomocí MM funkce break (brkincr) si budeme postupnì žádat o posunutí hranice gapu. Pamìt za koncem statických dat bude obsahovat na poèátku jeden pamìtový blok, vytvoøený první dynamickou alokací, pozdìji pak nìkolik blokù. Nìkteré z nich budou volné nìkteré obsazené. Vlastnosti bloku budou definovány v jeho záhlaví. To bude tvoøeno:

ukazatelem 15 bitù ukazatel na zaèátek platných dat (zaèátek pamìťového bloku + 4), pøesnìji øeèeno jeho horních 15 bitù
bitem platnosti 1 bit specifikuje je-li blok obsazen (1 ano, 0 ne)
velikostí 16 bitù velikost alokovaného bloku v bytech (bez záhlaví)

Celkovì to tedy bude vypadat nìjak takto (0 brána jako zaèátek dynamických dat):

To celé bude konèit tam kam ukazuje brk. Alokace i dealokace bude tím pádem jednoduchá. Pøi alokaci se projde stávající dynamická pamìť, jestli v ní neexistuje dostateènì velký volný blok (pamìť je vnitønì zøetìzena, není tøeba vést nìjaké pomocné tabulky èi seznamy).

Pokud ano, rozpadne se vìtšinou na dva: použitý blok (used block) a volný blok (free block) menší velikosti. Pokud by vzniklý volný blok byl pøíliš malý (øeknìme, že by se do nìj již nemohly vejít data, jen záhlaví), volný blok nevznikne, ale naalokuje se o kousek více.

Pokud ne, pokusí se alokaèní rutina posunout hranici gapu (pokusí, protože když narazíme na stack, tak už není kam posunovat). Jestli to jde vytvoøí nový obsazený blok, jinak vrátí chybu.

Pøi volání funkce realloc(void *ptr, size_t size) záleží na vztahu již naalokované a požadované velikosti. Pokud je ptr NULL, dojde k bìžné alokaci pomocí malloc, pokud je požadovaná velikost 0, dojde k bìžné dealokaci pomocí free. Jinak dojde buï ke zmenšení alokovaného prostoru, což je jednoduché, nebo k rozšíøení alokovaného prostoru, což je složitìjší. Pøi rozšiøování dojde nejprve k pokusu o spojení se sousedním volným blokem, pokud takový existuje. Pokud neexistuje takový vhodný blok ani pøed, ani za pùvodním blokem, dojde k alokaci nového prostoru pomocí malloc, která, pokud se realokuje velký blok nemusí skonèit úspìchem.

Uvolòování pamìti (dealokace) je "piece of cake". Prostì jen shodíme used/free bit, popø. spojíme po sobì jdoucí volné bloky, pokud jde o poslední blok, posuneme zpìt hranici gapu.

DùLEŽITÁ POZNÁMKA : Alokovat lze blok veliký maximálnì 32000 bajtù.

K dispozici jsou tedy funkce:

Zdrojový kód si mùžete prohlédnout v malloc.c


Zpìt na hlavní stranu