Operační systémy 11. Správa paměti Obsah: historie, rozdělení a typy pamětí organizace paměti procesu metody přidělování paměti ochrana paměti virtualizace paměti segmentace, stránkování © Milan Keršláger http://www.pslib.cz/ke/slajdy 14. 3. 2013 http://creativecommons.org/licenses/by-nc-nd/3.0/
Historie pamětí děrné štítky, děrné pásky mechanický zápis, mechanické nebo optické čtení feritové paměti využití elektromagnetické indukce obnovování informace (dynamická paměť) zpožďovací smyčka využívá omezené (též snížené) rychlosti šíření el. rtuť, cívka, piezoelektrický krystal na výstup dat bylo nutno počkat → sériový přístup využití jako paměť (periodický zápis), v TV přístroji
Rozdělení pamětí (1) podle materiálu a fyzikálních vlastností magnetické, optické, polovodičové, zpožďovací smyčka... metoda uchování informace statické používají klopný obvod, jsou dražší, rychlejší → cache dynamické periodické obnovování obsahu (refresh) → RAM závislost na napájení volatilní → udržení informace závislé na napájení nevolatilní → udržení informace nezávislé na napájení
Rozdělení pamětí (2) podle přístupu k uloženým informacím sekvenční – např. magnetická páska asociativní – adresace obsahem (klíč) sériový – posuvný registr FIFO RAM (Random Access Memory) s libovolným přístupem (náhodný je nesmysl) přímý přístup k datům podle zvolené adresy přibližně mu odpovídá i pevný disk
Rozdělení pamětí (3) podle schopnosti čtení a zápisu RWM – Read Write Memory pro čtení i zápis, používáme pro ně označení RAM ROM – Read Only Memory PROM – uživatelsky programovatelná EPROM – smazatelná PROM (UV záření) EEPROM – elektricky smazatelná EPROM Flash EPROM – rychlé mazání po větších blocích
Rozdělení paměti (4) podle určení vnitřní paměť primární registry CPU, cache, paměť RAM v přímém dosahu z CPU vnější paměť sekundární paměť pevný disk využívána jako virtuální paměť mimo přímý dosah CPU – odděleno řadičem terciální paměť CD, DVD, magnetické pásky využívána pro zálohování (vyměnitelné médium)
Výběr adekvátní paměti rychlost statické jsou nejrychlejší, ale nejdražší dynamické jsou pomalejší, ale laciné cena za jednotku uchované informace terciální je nejlevnější sekundární je snadno a relativně rychle přístupná primární je nejdražší, ale odpovídá rychlosti CPU podle uchování informací nevolatilní pro uchování dat volatilní pro běh procesu
DDR SDRAM Double Data Rate Synchronous Dynamic RAM běžně používaný typ pro operační paměť volatilní → po odpojení napájení se obsah ztratí pro udržení informace je nutný refresh periodické obnovování náboje na parazitní kapacitě čtení je destruktivní → po přečtení obratem znovu zápis je to nejlacinější typ RAM paměti různé typy: DDR, DDR2, DDR3, různé frekvence nejrychlejší je čtení sousedních buněk (řádků) čtení ze vzdálenějšího řádku → čekací prodleva vyšší frekvence → delší prodlevy → rychlost neroste lineárně
Flash nevolatilní paměť pro udržení obsahu nepotřebuje napájení omezená životnost pro zápisové cykly podle typu 10 až 100 tisíc přepsání FTL (Flash Translation Layer) → rozkládání zápisů kvůli úspoře na řídících obvodech: práce s velkými bloky dat (stovky kB až MB) USB flash disk → skrze řadič USB portu SSD (Solid State Drive) → náhrada za HDD rychlejší čtení/zápis, ale vysoká režie při běžném užívání řádově zhruba pětinásobné zrychlení čtení proti HDD
Pevný disk elekromagnetické uložení dat přístup skrze řadič (PATA, SATA, SCSI, …) práce s bloky dat (klasicky 512 B, nově 4 KiB) rotační plotna, hlavičky čtení/zápis sekvenčně kolem 100 MB/s, náhodně 20 MB/s průměrná přístupová doba 10 ms (0,01 sekundy) z hlediska CPU extrémně pomalé zařízení 10 ms, 2 GHz procesor → 20 miliónů tiků vnitřních hodin CPU čtení z disku → přesun procesu do fronty blokovaných v podstatě neomezená životnost zápisových cyklů používání jako virtuální paměti → „rozšíření RAM“ zvyšuje výkon a použitelnost počítače (i přes pomalost)
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 (slovech) přístup pomocí strojových instrukcí adresa je v registru přenos dat mezi registrem a pamětí využití cache
Přístup k operační paměti přímo adresovatelná adresní registr (v CPU) → 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, EMS, paměťové banky u Didaktiku… virtualizace paměti rozdělení na virtuální a fyzické adresy část adresního prostoru v RAM a část na disku
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 MM (Memory Manager) řízení chodu MMU rozvržení operační paměti přidělování paměti procesům
Organizace paměti organizace paměti 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(y) 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
32bitový Linux → 3+1 v adresním prostoru proces i jádro → syscall nevyžaduje remapování části adresního prostoru: kernel (jádro systému) stack (zásobník) mmap knihovny, mapované soubory heap (halda, hromada) dynamicky alokovaná paměť text (jen pro čtení) program, konstanty rezervovaná oblast (černě)
32bitové Windows → 2+2 standardní mapování pro 32bitová jádra jednoduchá kontrola (jádro vs. userspace) rozlišení nejvyšším bitem adresy buňky v paměti proces maximálně 2 GiB oblast nad 2 GiB lze využít jako cache alternativa 3+1 parametr jádra při startu jen pro speciálně kompilované aplikace MS SQL server, Exchange normální aplikace větší prostor využít nemohou
32bitový Linux → 4+4 jádro i proces vlastní adresní prostor proces má k dispozici celé 4 GiB víc, než 4GiB není na 32bitové platformě možné není to úplně pravda, protože: proces může skrze jádro ovládat PAE není to jednoduché, programátor to musí naprogramovat ve Windows speciální rozhraní (knihovní funkce) syscall vyžaduje přemapování paměti PAE má měřitelnou režii (řádově procenta) v některých případech to nevadí programy, které hlavně počítají a nedělají syscally
Metody přidělování paměti procesům přiděluje paměť jádro systému: přidělování veškeré volné paměti nejjednodušší (CP/M, DOS) → jen jeden běžící proces přidělování pevných bloků paměti paměť rozdělena předem → umí už multitasking program umístěn tam, kam se „vejde“ přidělování proměnných bloků paměti při startu dle požadavků spouštěného programu přidělování bloků na žádost přidělování (a uvolňování) i za běhu procesu
Přidělování veškeré volné paměti ochrana paměti → mezní registr možné jen v případě, že to podporuje procesor i jádro OS CP/M (1973) jádro na konci paměti problém → různé množství RAM v různých počítačích při umístění na jinou adresu strojový kód nefunguje absolutní skoky nebo adresace dat neodpovídá skutečnosti pro každou velikost RAM jiná verze jádra (32, 48, 64 KiB) nebo relokace ISIS II. (Intel 1977) nejprve jádro OS, pak program → relokace programu DOS (1979 jako QDOS) jako IIS, navíc specialita → rezidentní programy
Paměť CP/M jádro OS program a data ochrana paměti multitasking 64 KiB ochrana paměti procesor typicky bez HW podpory bez ochrany paměti jinak mezní registr hranici nelze překročit CPU → vnitřní přerušení skok na ISR uvnitř jádra OS ISR program ukončí vyžaduje privilegovaný režim program nemůže hranici měnit multitasking jedině celý proces nahrát na disk a pak zpět → časově náročné jádro OS program a data 100H systémová oblast
Mezní registr nejjednodušší ochrana paměti nutná hardwarová podpora v CPU jeden (pro CP/M) nebo dva registry (pro MFT) vyžaduje privilegovaný režim nastavení registru je privilegovaná instrukce proces → neprivilegovaný stav CPU pokus o přístup do paměti za mezním registrem → → vyvolání vnitřního přerušení obsluha přerušení (ISR) je v jádře OS jádro OS úlohu ukončí (chyba „porušení ochrany paměti“)
Umístění kódu v RAM strojový kód používá absolutní adresy absolutní adresa se používá při: při čtení dat z paměti do registru, skoky v programu překladač určí správné adresy v kódu program musí být do RAM umístěn vždy stejně tj. na adresu, kterou předpokládal překladač při umístění na jinou adresu v RAM je nutná korekce absolutních adres → relokace relokace jádra systému (ISIS) relokace programu (DOS, Windows, knihovny)
Relokace přizpůsobení kódu konkrétnímu umístění strojový kód používá absolutní adresy při nahrání kódu na jinou adresu by nefungovalo modifikace absolutních adres podle relokační tabulky nebo vyřešení symbolů relokační tabulka je součástí spustitelného souboru adresy tak, jako by byl program od adresy 0 lokátor připočte k adrese bázovou adresu tj. při umístění na adresu 100 se přičte všude 100 přičtení jen k adresám, které jsou v relokační tabulce
Přidělování pevných bloků paměti multitasking vyžaduje více procesů v RAM 1967 – IBM rozšíření MFT pro OS/360 MFT → Multiprograming with Fixed number of Tasks paměť je při startu pevně rozdělena na bloky 1 MB např. na 256 kB pro OS a dále bloky pro procesy (1×256, 2×128, 3×64 a 2×32 KiB), jiné dělení → restart výhoda: jednoduché nevýhody: program musí deklarovat předem své požadavky plýtvání pamětí (velikost > proces) fragmentace → v součtu paměť je, ale nelze spustit ochrana paměti: mezní registry
Strategie výběru bloku při požadavku na paměť musí jádro rozhodnout, který blok bude procesu přidělen strategie rozhodnutí ovlivňuje fragmentaci first fit přidělíme první nalezený vyhovující blok (či jeho část) last fit přidělíme poslední vyhovující blok (či jeho část) výsledek závisí na aktuální situaci fragmentace volného místa worst fit přidělíme největší blok → také snaha o zmenšení fragmentace bere ohled na další požadavky, které mohou přijít best fit přidělíme nejvhodnější blok
Přidělování bloků proměnné velikosti 1967 – IBM rozšíření MVT pro OS/360 Multiprograming with Variable number of Tasks nástupce za jednodušší MFT nejlepší tehdejší varianta, ale složité, problematické proces žádá o paměť při svém startu i za běhu je možné žádat nebo vracet další paměť po skončení je paměť procesu uvolněna → fragmentace součet nároků nemůže překročit dostupné množství ochrana paměti → mezní registry jeden proces vlastní jeden souvislý úsek paměti nebo 1 mezní registr + maximální offset (segmentace)
Přidělování bloků na žádost proces žádá jádro OS o další úsek paměti jádro vytvoří blok požadované velikosti ze kterého volného úseku bude blok přidělen? → viz předchozí stránka „Strategie výběru bloku“ proces dostane ukazatel na začátek volného místa proces nesmí použít nepřidělenou paměť ochrana paměti mezní registry jsou nedostatečné paměť procesu je v blocích → není souvislá ochrana paměti metodou zámků a klíčů je používáno všemi dnešními moderními systémy
Metoda zámků a klíčů ochrana nesouvislých úseků paměti paměť je rozdělena na stránky (např. 4kB) každé stránce je přiděleno číslo (tj. zámek) procesor má speciální registr (tj. klíč) procesor smí použít jen paměť, kde klíč=zámek jádro používá univerzální klíč 0 (není omezení) změna registru (klíče) je privilegovaná instrukce proces běží v neprivilegovaném stavu zámky jsou v paměti, kam proces nemůže nepovolený přístup → vnitřní přerušení → ISR v OS
Uvolňování bloků paměti průběžné uvolňování nemusí být podporováno například Mac OS 9 v 90. letech 20. století vznikl velký problém u webových prohlížečů → paměť zabraná procesem se jen zvětšuje po skončení programu je uvolněna všechna paměť dnešní systémy uvolňování podporují ochrana paměti se musí průběžně adaptovat → metoda zámků a klíčů
Fragmentace (volné) paměti při průběžné alokaci a uvolňování paměti vznikají izolované úseky volné paměti časem je volná paměť čím dál více rozdrobena lze omezit volbou vhodné strategie výběru bloku paradoxně je lepší přidělovat paměť z největšího bloku podobně i fragmentace souborů a volného místa na disku po čase je nemožné alokovat větší úsek paměti volné místo je rozdrobeno do menších bloků není možné volné úseky spojit do jednoho řeší se pomocí virtualizace paměti rozlišujeme virtuální adresy procesu a fyzické adresy v RAM
DOS rozdělení paměti: na začátku jádro, buffery, proměnné dále místo pro program až do 640 kiB do konce paměti rezervovaný prostor pro paměť rozšiřujících karet BIOS, VGA RAM, RAM síťové karty, BIOS pro VGA a řadič... později též využito (i 64 kiB nad 1 MiB jako HIGH) v paměti i více programů, ale běží vždy jen jeden DOS byl bez podpory multitaskingu paměť se přiděluje na požádání při startu, i za běhu, paměť lze i vracet, ochrana není (!!!)
Rezidentní program specialita DOSu TSR → Teminate and Stay Resident program se ukončí, ale zůstane v paměti náhrada absence podpory multitaskingu v DOSu DOS neposkytuje ochranu paměti → žádná ochrana TSR se váže na přerušení či služby DOSu aktivace při stisku klávesy, tiku časovače, zápisu na disk... jádro DOSu není reentrantní jen jeden proces může volat službu DOSu TSR musí čekat (naštěstí je to možné detekovat) velmi rozšířené obsluha myši, národní klávesnice, ale i VIRY
Linux, Windows NT používají přidělování paměti na žádost alokace paměti při startu programu za běhu je možné paměť alokovat i vracet viz malloc() je podporována ochrana paměti používá se metoda zámků a klíčů (a virtuální paměť) porušení ochrany paměti je řešeno ukončením procesu ukončením je veškerá alokovaná paměť vrácena vzniká problém OOM (Out Of Memory) proces žádá o paměť, ale nelze vyhovět řešení je na programátorovi (ukončením procesu?)
malloc() proces může požádat za běhu jádro o paměť proces při volání malloc() sdělí velikost jádro sdělí procesu adresu, kde místo začíná proces nesmí psát do místa, které přiděleno nebylo nehlídá se však, když proces přepisuje vlastní paměť paměť je interně hlídána po blocích → metoda zámků a klíčů pro odhalení špatné práce s pamětí → Valgrind apod. překrytí funkce jádra knihovní funkcí požadavky na paměť se sdružují do větších celků knihovna požádá o více paměti, než deklaroval proces další požadavek pak nevyžaduje volání jádra sníží se tím režie → volání jádra trvá déle
free() uvolnění paměti (proces vrátí alokovanou paměť) proces sdělí adresu začátku bloku, který už nepotřebuje paměť lze pak přidělit jinému procesu opět překrytí knihovní funkcí snaha o zvýšení efektivity paměť je spravována ve stránkách (4 KiB blok) nemá smysl řešit (de)alokaci jednoho bajtu skrze jádro proces nesmí uvolnit paměť, která mu nepatří chyby při správě paměti jsou časté využívají se různé ladící knihovny (např. Valgrind) Java → garbage collector → automatizovaná správa
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) adresa paměti v RAM nebo na pevném disku
Využití virtualizace multitasking každý proces má vlastní logický adresní prostor není nutné používat relokaci nebo relativní adresy efektivnější využití paměti nepoužívané části paměti jsou odsunuty na disk zvětší se místo pro diskovou cache zakázání odkládacího souboru paradoxně horší rozšíření adresního prostoru místo na pevném disku je lacinější, než RAM
Adresace virtuální paměti segmentace fyzická adresa = segment + offset proces pracuje jen s offsetem segment spravuje operační systém u počítačů PC k dispozici od začátku, ale omezeně (8086+) obtížné řešení fragmentace volného místa stránkování virtuální adresa → tabulka stránek → fyzická adresa poměrně komplikovaný systém (nutná podpora v CPU) u počítačů PC vyžaduje procesor i386 nebo novější (i386+) dnes majoritně používán (Windows, Linux) řeší fragmentaci, lepší optimalizace (RAM × disk)
Segmentace paměti – 1 fyzická = segment + offset převod zajišťuje MMU → typicky uvnitř CPU segment i offset uloženy ve speciálních registrech CPU offset používá proces (strojové instrukce) každý proces má adresní prostor začínající od nuly offset je virtuální adresa, kterou používají stroj. instrukce segment nastavuje jádro OS je to privilegovaná instrukce jeden proces může mít i více segmentů pro kód programu, data, zásobník, halda, … data jsou logicky roztříděna vyžaduje více segment a offset registrů v CPU
Segmentace paměti – 2 ochrana paměti: privilegovaný režim (segment) mezní registr (offset) fragmentace volného místa řeší se setřásáním segmentů segmenty se v paměti překopírují k sobě nelze dělat moc často → velmi náročné na čas jádro opraví segment registry, proces nic nepozná sdílená paměť mezi procesy se sdílí celý segment data knihovny musí být uložena v privátním segm.
Segmentace paměti – 3 registrace segmentů pro procesy proces má v PCB umístěnu tabulku změna kontextu → změny registrů zajišťuje jádro OS zvětšování segmentu za běhu procesu je možné, ale za segmentem musí být prostor odkládání na disk umožňuje mít více virtuální paměti, než je fyzické na disk se odkládají celé segmenty → swapování
Stránkování paměti virtuální → tabulka stránek → fyzická adresa převod zajišťuje MMU → typicky uvnitř CPU tabulka stránek je v RAM, řízeno speciálními registry proces používá výhradně virtuální adresy každý proces má adresní prostor začínající od nuly každý proces má jen jeden virtuální adresní prostor tabulka vytváří souvislý prostor z více částí (stránky) tabulku stránek sestavuje jádro OS běžný proces do ní nemůže zasahovat ochrana paměti: metoda zámků a klíčů
Tabulka stránek paměť rozdělena na stránky stejné velikosti stránky mají typicky 4 KiB (8 KiB atp.) byla-li by příliš velká → vnitřní fragmentace někdy používány rámce (frames), jinak frame = stránka na offset uvnitř stránky je 12 bitů (212 = 4 KiB) vyšší bity adresy jsou číslo stránky podle tabulky se převádí jen číslo stránky číslo stránky logické adresy → č. stránky fyzické adresy potřebujeme jen vrchní bity adresy (ne offset ve stránce) číslo stránky je tedy index v tabulce stránek ušetřených 12 bitů lze využít na příznaky
Stránkování na žádost anglicky: demand paging proces nevyužívá celou namapovanou paměť využívá jisté části, které se časem mění pomalu nevyužívané části (stránky) odsuneme na disk → odstránkování (soubor, oddíl, vyhrazený disk) zvětšení dostupné paměti o místo na disku do tabulky stránek přidáme příznak „paged“ je-li stránka v paměti, převod na fyzickou jako obvykle při pokusu o přístup do odstránkované stránky → vnitřní přerušení „výpadek stránky“ (page fault)
Výpadek stránky vnitřní přerušení obsluha uvnitř jádra OS → nalezení volné stránky opravíme tabulku stránek zopakujeme instrukci, která výpadek způsobila není-li v paměti volná stránka výběr stránky, kterou nejprve odsuneme na disk nejlépe takovou, která bude nejdéle nepoužita nemáme křišťálovou kouli můžeme ale usuzovat podle dosavadního vývoje → různé algoritmy výběru stránky
Výběr stránky FIFO vyhodíme stránku, která je v paměti nejdéle může to však být intenzivně využívaná stránka FIFO anomálie → více paměti, více výpadků LRU – Least Recently Used podle času posledního použití stránky (ale i fronta) HW příliš náročné NUR – Not Used Recently zjednodušení LRU → jednobitový příznak použití jádro OS příznaky periodicky zpracovává a nuluje
Zahazování stránek zápis na disk je pomalý některé stránky na disku již jsou → kód programu, obsah souboru výhodné při mapování souborů do paměti stránku prostě zrušíme a při výpadku obnovíme ušetříme zápis identického obsahu při odstránkování při obnovení nahráváme obsah ze souborového systému v tabulce stránek speciální příznak + identifikace stránkovací soubor je vždy výhodný jeho vypnutí způsobí paradoxně zpomalení → odstránkovaná paměť se použije na cache
Mapování souborů do paměti využívá se mechanismu výpadku stránky speciální systémová služba → mmap() obsah souboru se namapuje do paměti → jako zahozené stránky (viz výše) při pokusu o čtení dojde k výpadku stránky obsluha je silně optimalizovaná na rychlost pro čtení ze souboru se využívá existující postup výhodné ve specifických případech čtení části souboru, periodické čtení atp. silný tlak na paměťový prostor (4 resp. 2 GiB je málo)
Garbage collector správa paměti procesu součást běhového prostředí procesu 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)
Copy on Write využíváno při vzniku nových procesů v unixových systémech volání fork() vznikne nový proces, který je kopií původního
Sdílená paměť
Negativní projevy OOM – Out Of Memory dojde-li paměť (i virtuální) → velký problém jádro typicky vybere oběť → ukončí nějaký proces memory trashing cyklické odkládání stránek a jejich obnovování může vyřadit systém z provozu (DoS) page storm nastane vždy při nedostatku paměti po chvíli stránkování je nalezeno nové optimum
Memory leak únik paměti proces alokuje paměť, ale neumí ji využít např. zapomene adresu, na které volný prostor je periodické zapomínání může vést k vyčerpání paměti následně OOM, pád aplikace apod. paměť pak nemůže být využita ani uvolněna malloc(), write, read, free() velmi často u komplikovaných programů webové prohlížeče, překladače, databázové servery, …
IA-32 a PAE rozšíření adresovatelnosti na 64 GiB platí jen pro celkovou dostupnou paměť využívání stránek 4kiB nebo 2MiB limit pro 4 GiB zůstává zachován nemění se velikost adresy → zachována kompatibilitu možnost využití NX bitu (je-li implementován) nevýhody záznamu v tabulce stránek 64 bitů (pův. 32) markantní zvýšení režie tabulky stránek řešeno pomocí použití 3 úrovní tabulek místo 2 zvýšení režie změny kontextu