Správa paměti Flashcards
(8 cards)
Virtuální paměť procesů
Umožňuje každému procesu pracovat s vlastním, izolovaným adresním prostorem, nezávisle na fyzické paměti (RAM). Tento mechanismus zajišťuje efektivní a bezpečné využití paměti, chrání procesy před vzájemným ovlivněním a umožňuje provádění větších programů, než je fyzická velikost paměti.
Adresní prostor
32bitový systém: každý proces má virtuální adresní prostor o velikosti 4 GiB (2³² bajtů)
64bitový systém: velikost prostoru je 2⁶⁴ bajtů
Rozložení paměti
Spodní adresy (od 0x00000000 výše): běžná data + prostor pro jádro
Horní adresy (do 0xFFFFFFFF): zásobník (stack)
Základní bloky paměti procesu
Každá paměť, která je přiřazena procesu,
se dělí na 4 základní bloky:
– Segment instrukcí (Code)
– Datový segment (Data)
1) Code segment (Text)
Obsahuje strojové instrukce programu
Znám při překladu, nemění velikost
2) Data segment
Obsahuje statická data známá při překladu (např. konstanty, globální proměnné, textové řetězce)
Také neměnná velikost během běhu
3) Heap (halda)
Slouží k dynamické alokaci paměti
Obsahuje objekty, instance tříd, dynamické proměnné.
Založená na stromové datové struktuře
Roste směrem nahoru (k vyšším adresám)
4) Stack (zásobník)
Používá princip LIFO (Last In, First Out)
Obsahuje: lokální proměnné, parametry funkcí, návratové adresy.
Roste směrem dolů (k nižším adresám)
Spravován pomocí stack pointeru (ukazatel na vrchol zásobníku)
Statické přidělování paměti
Staticky se ukládají datové struktury, které jsou definovány při překladu programu. K jednotlivým paměťovým úsekům lze přistupovat pomocí názvu proměnné. V průběhu se adresa ani velikost bloku nemůže měnit.
Dynamické přidělování paměti
Dynamicky se paměť přiděluje na základě požadavku při průběhu programu. K dynamicky přidělenému paměťovému úseku se dá přistoupit pouze nepřímo pomocí ukazatele. Ukazatel je součástí statické nebo dynamické struktury. Dynamicky přidělovaná paměť se čerpá z vyhrazeného prostoru paměti počítače.
Regenerace paměti je její pročištění od nepoužívaných částí paměti.
Dynamické přidělování paměti bez regenerace
V jazycích bez regenerace (tj. bez garbage collectoru) má programátor přímou odpovědnost za správu paměti — tedy nejen za její alokaci, ale i uvolnění.
Dynamické přidělovaní paměti bez regenerace přiděluje požadované úseky postupně tak jak jsou za sebou umístěny až do vyčerpaní vyhrazené paměti. Využívá pracovního ukazatele, který ukazuje na první adresu volné paměti.
Nevýhody:
Memory leaks (úniky paměti)
Nastanou, když programátor zapomene paměť uvolnit — blok zůstává alokován, ale už se k němu nelze dostat.
Dangling pointers
Když se paměť uvolní, ale ukazatel na ni se dále používá → způsobí chyby nebo pády programu.
Double free
Dvakrát uvolněná paměť – může vést k nekonzistenci heapu, chybám nebo zneužitelným zranitelnostem (např. v C).
Operace free/delete okamžitě neuvolní paměť, ale přepíše indikátor paměti na false; regenerace probíhá později po větších částech.
Dynamické přidělování paměti s regenerací
Na rozdíl od dynamického přidělovaní bez regenerace se zde regeneruje pro každé operaci free/delete. S tím přichází problém s fragmentací paměti. Po uvolnění paměti by tyto části mohly vytvářet sekvence malých, oddělených a přitom sousedních prvků. Často je defragmentace těchto volných bloků spojena s operací free/delete. Snaží se slučovat volné úseky se sousedními volnými úseky.
Garbage collector
Používá se u vyšších programovacích jazyků java,c#,python. Cílem GC je zabránit únikům paměti (memory leaks) a chybám, jako je přístup k již uvolněné paměti. Je nejpokročilejším způsobem dynamického přidělovaní paměti.
Skládá se ze tří fází:
– Allocation přiděluje po sobě jdoucí úseky stejně jako metoda bez regenerace až do vyčerpání celého vyhrazeného prostoru.
– Marking nastává pouze pokud je vyčerpán celý prostor. Prochází prostorem a vyhledává a označuje úseky, které nejsou aktivní a jejich návrat do společné paměti způsobí
regeneraci.
– Garbage collecting: provádí se defragmentace přesunem všech uvolněných úseků do jednoho souvislého úseku. Tím se vytvoří nový souvislý úsek pro alokaci.
Tyto tři fáze se opakují dokola, pokud nedojde k situaci, že nový úsek není dostačující
pro fázi alokace: v tom případě dojde k ukončení programu.
Fáze garbage collectoru
Skládá se ze tří fází:
1) Allocation přiděluje po sobě jdoucí úseky stejně jako metoda bez regenerace až do vyčerpání celého vyhrazeného prostoru.
2) Marking nastává pouze pokud je vyčerpán celý prostor. Prochází prostorem a vyhledává a označuje úseky, které nejsou aktivní a jejich návrat do společné paměti způsobí regeneraci.
3) Garbage collecting: provádí se defragmentace přesunem všech uvolněných úseků do jednoho souvislého úseku. Tím se vytvoří nový souvislý úsek pro alokaci. Tyto tři fáze se opakují dokola, pokud nedojde k situaci, že nový úsek není dostačující pro fázi alokace: v tom případě dojde k ukončení programu.