Doteraz sme hovorili o instrukciach a operandoch, neskor blokoch a teraz sa presunieme na stranky. Stranka je totiz pamatova jednotka OS, ktora nadobuda velkost od 512 - 8KB. Je stale mensia ako subor, ktory moze mat az niekolko giga a zaroven je kontrolovana OS a nie uzivatelom, ci pamatovym radicom. Virtualna pamat je tiez pod kontrolou OS.
Virtualna pamat alebo adresovanie pamate je zvlastny sposob spravy operacnej pamate. Umoznuje OS vyuzivat vnutornu pamat, ktora je podstatne vacsia, ako je skutocna fyzicka velkost pamate. Umoznuje zdielat pamat, vzajomnu ochranu programov a ochranu dat (ktora je dnes dolezitejsia, ako vyuzitie principu lokalit). Kazdy beziaci program pracuje so svojim virtualnym priestorom. Program moze byt umiestneny do pamate, to ale zalezi na OS. Ak sa tak stane, tak z virtualneho adresoveho priestoru je program namapovany do pamate. Mapovanie je zabezpecene hardwarom. Mapovanie je vlastne funkcia, ktora mapuje virtualnu adresu na adresu v pamati.
Virtualny priestor je rozdeleny na tzv. pages, ktore sa priraduju jednotlivym procesom. Fyzicka pamat je zase rozdelena do rovnako velkych ramcov, tzv. frames. Velkost stranky je rovnaka ako velkost ramca. Stranky su teda mapovane do ramcov a tvoria suvisly prostor virtualnej pamate, teda virtualny adresovy priestor. Rozdiel oproti cache pamatiam je, ze v pripade VP, nie su vsetky stranky mapovane do ramcov a teda VA priestor nie je podmnozinou PA priestoru. Korenspopndujuce ramce su navyse vo fyzickej pamati rozne umiestnene. Stranka nie je len "jednotkou mapovania" ale aj jednotkou prenosu medzi diskom a hlavnou pamatou.
Na prevod VA -> PA je vyuzivana tzv. Lookup Table (LTB) alebo Page Table. Tato tabulka je umiestnena vo fyzickej pamati. Virtualna adresa obsahuje cislo stranky (page#) a offset. Page# je nieco ako bol index v cache pamatiach. Najde ten spravny riadok a v tomto pripade vravime, ze nasiel stranku. Stranka obsahuje bit platnosti, pristupove prava a cislo ramca. Offset vo VA je vlastne velkost stranky. Bit platnosti funguje tak, ako u cache s write back zapisom. Vystupom z LTB je teda fyzicka adresa. Presna struktura LTB je dana OS. VP je plne asociativna.
Kazdy proces, ktory v OS bezi, ma svoju vlastnu tabulku stranok a ta sa mu javi ako linearna pamat. Pamat, ktoru ma proces k dispozicii, nie je obmedzena fyzickou velkostou instalovanej pamate. Bez virtualnej pamate by musel operacny system pridelit aj pamat, ktoru proces v skutocnosti nevyuzije, alebo by ju vyuzil az neskor. Metody spravy pamati zabezpecuju optimalnu vymenu pamatovych stranok, medzi fyz. pamatou a diskom. Malo pouzivana cast pamate tak vobec nemusi zavedena vo fyz. pamati.
Pri zlom dimenzovani realnej operacnej pamate, moze dojst k strate vypoctoveho vykonu (ping pong efekt ako u cache).
Vo VP maju stranky vzdy rovnaku velkost a preto sa da setrit miestom (fragmentacia). Ak proces narasta, tak sa vymenia nepouzivane stranky, ak to nestaci, tak sa stranky odswapuju na disk. Stranky k swapovaniu vybera LRU.
Teraz, stranky sme odswapovali a co ak teraz tie stranky potrebujeme? Ak nenajdeme data v tabulke stranok, tak dostaneme Page Fault. Ziadana stranka sa nacita z disku do prazdneho ramca v pamati, prenos sa deje prostrednictvom DMA. Ked je DMA ukoncene, tak vysle signal prerusenia a updatuje sa tabulka stranok procesu. Pri prepnuti spat na povodnu ulohu, su pozadovane data v hl. pamati - teda stranka sa nacitala. A v pripade, ze nemame dostatok pamate, tak uvolnime ramec tak, ze stranku s dirty bitom naleziacu programu zapiseme na disk a tabulku aktualizujeme.
Co robit, ak je pamat prilis mala?
Pre urychlenie mapovania mozme pouzit cache TLB. Procesor poziada o preklad VA -> PA. V TLB sa najde preklad a pozrieme sa do cache, ci tam najdeme tieto data. Ak nie, tak musime do hlavnej pamate.
Pouzijeme tzv. transition lookaside buffer, kde mam nabufferovanu cast TLB. Do TLB siahame, ak v buffer nenajdeme, co hladame. Potom pride na rad cache a ak ani tam nic nenajdeme, tak musime znovu do fyzickej pamate. Buffer je vlastne cache pre polozky tabulky stranok. Pouziva sa aj pre vypocet LRU a obsahuje dirty bit.
Co robit, ak je pamat prilis velka?
Pokial proces bezi, tak cela jeho tabulka musi byt vo fyzickej pamati. A ak je pamat prilis velka (napr. 4GB), tak mame problem. Pamat bud uplne zahltime, alebo sa tam TLB vobec nevojde. Riesenie
- viacurovnove strankovanie
- inverzna tabulka stranok
- segmentacia
Viacurovnove strankovanie vyzaduje 3 pristupy do pamate. Ak nenajdem polozku v 1. tabulke, tak pokracujem na nizsiu uroven. Virtualna adresa opat obsahuje page No., offset a este jeden offset d, ktory adresuje fyzicku pamat. ERROR - FIX
Dalsim sposobom, ako nalozit s prilis vela miestom je Inverzna tabulka stranok. Jedna sa vlastne o priklad implementacie hashingu. Najprv polozime hash tabulku pred vstup do TLB. Pomocou hashovacej tabulky budeme hladat. Vzhladom na to, ze viac VA moze byt mapovanych do toho isteho vstupu, je pouzity chaining.
A poslednym sposobom, ktory budeme rozoberat je pouzite segmentacie spojenej so strankovanim. Predstavme si, ze mame nejaky user space, v ktorom je text programu, data programu, nejaky ten stack a halda ... a potom mame fyzicku pamat, do ktorej to musime namapovat. Tak toto je presne priklad, ako je povodne segmentacia zamyslana. A my ju pouzijeme trosku inak. Jednotlive segmenty su implementovane ako strankovany virtualny adresny priestor. Teda VA adresa bude mat cislo segmentu, cislo stranky a offset stranky. Segment No. bude ukazovat na Page Table a cislo stranky na zaznam v segment page table. Vyhodou segmentou je napriklad lepsia implementacia ochrany.
Pomocou cisla segmentu najdeme PTBR tabulky stranok pre dany proces a segment. K nemu sa pricita cislo stranky a tak najdeme adresu segmentu a pripocitame k nej cislo stranky a cez segmentovu tabulku najdeme PA zo segmentovej tabulky.
V pripade pouzitia segmentou je fyziky pamatovy priestor rozdeleny do segmentov - blokov s roznou velkostou. Segment je skupina po sebe nasledujucich pamatovych miest, ktore mozu menit svoju velkost. Segment vzdy zaujima suvisle miesto vo fyz. pamati. Adresy v segmente su relativne voci zaciatku segmentu.
Data v segmentovej a strankovej tabulke sa fragmentuju externe alebo interne. Externa fragmentacia je typicka pre segmentovanie. Absolutny adresovy priestor je v tomto pripade k dispozicii hned po splneni poziadavku, ale nie je suvislo obsadzovany. Interna fragmentacia je typicka pre strankovanie a teda alokovana cast pamate moze byt vacsia, ako sa pozaduje.