Váš počítač má více než jen paměť RAM (random access memory). Je to chaotická, fragmentovaná a neustále se měnící paměťová krajina, kterou CPU předstírá, že je nekonečná. Toto je realita dynamických datových struktur běžících na moderním hardwaru.
Typická pracovní stanice má dnes 16–64 MB fyzické paměti RAM. Ale nenechte se zmást těmito malými čísly. Díky technologii zvané virtuální paměť si systém vyměňuje data mezi touto RAM a pevným diskem. Procesor vidí iluzi. Zdá se mu, že má 200-500 megabajtů souvislého prostoru. Tato iluze funguje. Kód se provede. Ale když musí operační systém přistupovat k pevnému disku, aby načetl stránku paměti, vše se zpomalí. Cítíte to v podobě zpoždění. Cítíte to na zvýšení otáček ventilátoru. Navzdory snížení výkonu je virtuální paměť levným způsobem, jak „rozšířit“ kapacitu paměti RAM. Toto je nezbytné kompromisní opatření.
Řekněme, že máme prázdný list. Celková kapacita paměti je 50 megabajtů. Už ne. Nic méně. Toto je náš rozpočet.
Tento 50megabajtový blok vlastní operační systém. Sdílí tento koláč. Nerovnoměrně. Nikdy ne rovnoměrně.
Nejprve přichází na řadu kód. Spustitelné instrukce pro všechny spuštěné aplikace a také samotné jádro operačního systému. Tato sekce je statická. Během běhu programu se nemění. Dále následují globální proměnné. Jedná se o obecné konstanty a stavové příznaky, ke kterým má přístup jakákoli část aplikace. Jsou v paměti od okamžiku spuštění aplikace až do jejího ukončení.
Následuje zásobník.
Stoh je pevně strukturován. Roste a zmenšuje se synchronně s voláním funkcí. Když zavoláte funkci, její lokální proměnné a parametry se vloží do zásobníku. Po dokončení funkce jsou vytaženy ze zásobníku. Zásobník si pamatuje pořadí volání. Zajistí, že se vrátíte na správné místo. Ale má maximální velikost. Během provádění nemůžete zásobník požádat, aby přidělil více paměti. Pokud se o to pokusíte, dojde k přetečení zásobníku. Program se zhroutí.
Když program skončí, operační systém jej uvolní. Kód, globální proměnné, zásobníkový prostor – to vše se vymaže. Tato paměť se zpracovává. Je připravena na další program.
Ale tady je problém. V každém okamžiku může být přibližně 50 procent z tohoto 50megabajtového prostoru nevyužito. Proč? Protože zásobník obsahuje pouze to, co se právě provádí. Kód obsahuje pouze instrukce. Nezpracované fragmenty paměti jsou rozptýleny. To jsou díry.
Operační systém shromažďuje tyto díry dohromady. Říká tomu bazénu hromada.
Zde dochází k dynamické alokaci paměti. Halda je jediné místo v paměti, kde si program může vyžádat přesné množství místa přesně v okamžiku, kdy je potřeba. V době kompilace nedeklarujete pole 1000 celých čísel. Nevíte, jestli budete potřebovat 1000 nebo 100 000 prvků. čekáš. Spustíte kód. Rozhodnete se, že tento prostor potřebujete. Pak zavoláte malloc.
„malloc“ znamená alokaci paměti. Chytne blok z hromady. Vrátí ukazatel. Používáte tento ukazatel. Až budete hotovi, zavoláte „zdarma“. Blok se vrátí do bazénu.
To je základní rozdíl mezi statickou a dynamickou pamětí. Zásobník je automatický. Je to vázáno na rozsah. Hromada je ruční. Je to svázáno se záměrem.
Proč vám na tom záleží? Protože většina chyb ve složitém softwaru není způsobena špatnou logikou. Vznikají kvůli špatné správě paměti. Pokud alokujete paměť na haldě a zapomenete ji uvolnit, dojde k nevracení paměti. Dostupná velikost haldy se zmenšuje. Nakonec v systému dojde místo. Programy zamrznou. Operační systém násilně ukončuje procesy. Ztratíte neuložená data.
Naopak, pokud se pokusíte alokovat příliš mnoho paměti na zásobníku, překročíte limit zásobníku. Program se zhroutí.
Hromada poskytuje flexibilitu. Umožňuje vám vytvářet datové struktury, které mohou růst. Propojené seznamy. Stromy. Grafy. Žádná z těchto struktur nemůže být určena v době kompilace s pevnou velikostí. Musí být vytvořeny za běhu. Musí žít na hromadě.
Je halda ideální? Ne. Je to roztříštěné. Jak jsou bloky různých velikostí přidělovány a uvolňovány, hromada se stává puzzle s chybějícími dílky. Vyhledávání souvislého bloku volné paměti se může zpomalit. To je důvod, proč může malloc někdy trvat znatelně dlouho. Musí hledat. Musí dát kousky dohromady. Musí zvládnout tento chaos.
Ale bez hromady se moderní výpočetní technika zhroutí.

























