Překladače Operační paměť © Milan Keršláger
Operační paměť ● vnitřní paměť počítače ● pro uchování programu, dat, mezivýsledků ● přímo adresovatelná procesorem ● připojena pomocí sběrnice (adresní, datová, řídící) ● uchovávány bity, adresace po bajtech ● přístup pomocí strojových instrukcí ● adresa je v registru ● přenos dat mezi registrem a pamětí ● využití cache
Přístup k paměti ● přímo adresovatelná ● adresní registr → omezení velikosti – IA-32 → 32 bitů = 4 GiB – x86_64 → dnes 48 bitů = 256 TiB ● nepřímo adresovatelná ● různé triky (pomocné registry, I/O) – PAE, XMS, … ● virtualizace paměti ● rozdělení na virtuální a fyzické adresy
Správa operační paměti ● v procesoru MMU ● anglicky Memory Managment Unit ● řízení přístupu k operační paměti (řízení sběrnic) ● řízení cache ● překlad virtuálních adres na fyzické a zpět ● řešení nepřímé adresace ● v jádře operačního systému ● řízení chodu MMU ● rozvržení operační paměti ● přidělování paměti procesům
Virtualizace paměti ● proces vidí jiné uspořádání, než je skutečnost ● odstranění fragmentace ● umožňuje zvětšit dostupnou paměť ● pro podporu multitaskingu ● rozlišuje dvě různé adresy ● logická adresa – pracují s ní strojové instrukce (proces) ● fyzická adresa – získána převodem z logické (v MMU) – paměť RAM nebo pevný disk
Využití virtualizace ● multitasking ● každý proces má vlastní logický adresní prostor ● není nutné používat relokaci nebo relativní adresy ● rozšíření adresního prostoru ● místo na pevném disku je lacinější, než RAM ● efektivnější využití paměti ● nepoužívané části jsou odsunuty na disk ● zvětší se místo pro diskovou cache
Adresace paměti ● segmentace ● fyzická adresa = segment + offset – proces pracuje jen s offsetem – segment spravuje operační systém ● trpí fragmentací volného místa ● stránkování ● virtuální adresa → tabulka stránek → fyzická adresa – poměrně komplikovaný systém – dnes majoritně používán (Windows, Linux na PC) ● řeší fragmentaci, lepší optimalizace (RAM × disk)
Organizace paměti ● paměť procesu ● text → jen pro čtení (kód programu, konstanty) ● halda → dynamicky alokovaná data – new() ● zásobník → volání funkcí, lokální proměnné ● organizace paměti v operačním systému ● v paměti je jádro a (běžící) proces ● v IA-32 je málo místa (4 GiB) – využívání triků → PAE – x86_64 problém řeší, ale jen pro 64bitové OS
Linux – 3+1 ● kernel (jádro systému) ● syscall nevyžaduje remapování ● vyžaduje ho model 4+4 ● mmap ● knihovny, mapované soubory ● heap ● dynamicky alokovaná paměť ● text ● program, konstanty
Windows – 2+2 ● standardní mapování pro 32bitové jádra ● jednoduchá kontrola (jádro vs. userspace) ● proces maximálně 2 GiB ● oblast na 2 GiB lze využít jako cache ● alternativa 3+1 ● parametr jádra při startu ● speciálně kompilovaná aplikace (je jich málo)
Proměnné ● kompilační překladač ● globální a statické proměnné – rezervace místa při překladu – v datové části paměti ● lokální proměnné – umisťovány na zásobník – do kódu se přidávají procedury pro jejich obsluhu – umožňuje rekurzi, reaktivaci po návratu z podprogramu ● proměnné platné v bloku programu – též na zásobník, ale po ukončení bloku zrušeny
Rezervace místa ● zarovnání paměti ● násobky 2, 4, 8, 16,... → dle architektury počítače ● každý typ proměnné má svoji velikost ● v jazyce C lze zjistit → sizeof() – informace jak pro typ, tak pro konkrétní proměnnou ● pole ● posloupnost prvků stejného typu – pracujeme s offsetem od začátku – seznam v případě dynamické změny hranic pole ● vícerozměrná pole → násobky
Záznam a struktura ● nehomogenní posloupnost prvků ● možné optimalizovat pořadí – nelze pak snadno vypočítat umístění položky v paměti ● variantní záznamy sdílejí paměť (v C uniony) – záznam má rozdílnou strukturu podle hodnoty prvku ● deklarace: ● staticky – alokace při kompilaci ● dynamicky – umisťování na haldu → new()
Třídy a objekty ● třída ● obdoba typu záznam – obsahuje data, metody (členské funkce), vlastnosti ● objekt je instance třídy ● obdoba proměnné ● neexistuje univerzální způsob uložení ● různé jazyky provádějí různě ● virtuální metody ● vytvoření tabulky virtuálních metod
Halda ● prostor pro dynamické alokace ● probíhají až za běhu programu ● umístění haldy není fixní ● odkazy na data jen pomocí referencí (ukazatelů) ● definováno při startu programu ● alokace dle požadavků (v hlavičce binárky) ● zvětšení jako direktiva překladače ● problém fragmentace haldy ● obvykle se neřeší → programátor vlastní správu
Zásobník ● anglicky „stack“ ● implementace ● HW: uvnitř CPU ● SW: pole či seznam ● datová struktura LIFO ● dno zásobníku – může zde být kontrolní obsah ● vrchol zásobníku – ukazatel (v CPU – speciální nebo též jakýkoliv registr) ● instrukce PUSH a POP (CREATE, IS_EMPTY) PUSHPOP Dno zásobníku Pointer Vrchol zásobníku
Využití zásobníku ● návratové adresy z procedury (funkce) ● ve strojovém kódu – CALL → uloží adresu násl. instr. + skok – RET → vyzvedne návr. adresu + skok na ni ● lokální proměnné ● data uložena „nad“ návratovou adresou – přístup pomocí ukazatelů ● před RET je nutno je všechny zrušit ● rekurze
Speciality zásobníku ● umístění uvnitř CPU → SPARC ● jako speciální registry (registrová okna) ● pro argumenty funkcí atp. ● umístění ve speciální paměti → PIC ● není přímo dostupná ● má omezenou velikost ● procesor bez registrů ● aby Turing-kompletní, tak se dvěma zásobníky ● doplňující instrukce ● top (? vrchol), swap (prohození), rotate, dup (-likace)
Rekurze ● opakované (vnořené) volání stejné funkce ● nutně musí být přítomna ukončující podmínka ● využívá se zásobník ● lokální proměnné → náročné na paměť – direktiva překladače pro zvětšení prostoru pro zásobník ● rekurzi lze linearizovat ● využijeme zásobník ● např. je nevhodné použít rekurzi uvnitř jádra OS
Typy rekurze ● přímá rekurze ● procedura volá sama sebe ● nepřímá (vzájemná) rekurze ● volání sama sebe v cyklu (přes dvě procedury) ● lineární rekurze ● jen jedno rekurzivní volání sama sebe ● vzniká lineární struktura ● stromová rekurze ● vícenásobné rekurzivní volání sama sebe ● vzniká binární (ternární,...) strom
Běhové prostředí ● anglicky „run-time environment“ ● podpora pro běh programu ● knihovny, podprogramy ● interpret pro Java bytecode ● překladač předpokládá běhové prostředí ● v jazyce C knihovna „libc“ ● nezaměňovat s běžnými doplňujícími knihovnami ● poskytování dalších funkcí ● optimalizace, ladění, typová kontrola atd.
Garbage collector ● součást běhového prostředí ● usnadňuje programování ● ale složitější ladění ● zpomaluje běh programu ● uvolňování nepoužívané paměti ● probíhá automaticky za běhu programu – typicky po určité době, využití generací ● sledují se reference na objekt (data) – vytvoření počitadla odkazů na objekt – vlastně sleduje úniky paměti (memory leak)