Virtuális memória 1
Problémák Lehet hogy a program nem fér be a memóriába Mozgatás diszkre és vissza A programok lokalitásának elve A program rövid idő alatt csak kis részét használja a memóriának Biztonság A program nem nyúlhat ki a partíciójából Kezdetben nem tudhatjuk mennyi memória kell Dinamikus foglalás 2
Megoldás A processzusok által látott memória terület különbözik a fizikailag létező memóriától Követelmények Minden program csak a saját memória területét látja, mintha az egész az övé volna Bármely címre lehet hivatkozni a saját területen belül A program ne vegyen észre semmit a megvalósításból A virtuális memória elérésének hatékonysága ne legyen rosszabb mint a fizikai memóriához való hozzáférés hatékonysága 3
Lapozás (paging) A virtuális és fizikai memóriát egyenlő darabokra osztjuk fel Virtuális memóriában: lap (page) Fizikai memóriában:lapkeret (frame) A keretek száma kisebb mint a lapoké Egy lappal csak akkor tudunk dolgozni, ha keretbe helyezzük 4
Lapozás 0-64K a virtuális címek A gépnek csak 32K memóriája van Csak a szükséges részek töltődnek be 4K a lapméret A valós rendszerekben a lapméret 512 byte, 1K, 4K (2 hatványa) 5
Lapozás Vannak lapok melyek nincsennek a fizikai memóriában Jelölés: jelenlét/hiány bit Mi lesz ha olyan címre hivatkozunk, mely egy be nem töltött lapon van? MOV REG, 32780 6
Lapozás MOV REG, 32780 Az MMU észleli a problémát és laphiba megszakítást generál az operációs rendszernek! Az operációs rendszer egy lapkeretet kiír a lemezre Betölti a kívánt lapot Módosítja a laptérképet a szükséges módon A megszakítást okozó utasítástól folytatja. 7
Lapozás Nincs külső töredezettség Kicsi belső töredezettség Támogatja a megosztást Lehetővé teszi hogy a memória fizikai felépítésétől elvonatkoztassunk A programozó csak a virtuális címmel foglalkozik 8
MMU CPU kártya CPU MMU Memória Lemez vezérlő MMU Memory Management Unit A virtuális címeket fizikai címekké alakítja Adat sín 9
CPU által generált cím: Lapszám (p) Címfordítás a laptábla indexe, amely a fizikai memória címet tartalmazza ez a bázis cím Lap offszet (d) a fizikai memória címmel kombinálva kapjuk a végleges címet 10
Címfordítás Szám Bit p m-n d n 2 m címtartomány és 2 n lapméret esetén Címtartomány: 2 16 = 65535 Lapméret: 2 12 = 4096 64K 4K Lapok száma: 2 16-12 = 2 4 = 16 11
MMU működése 16 db 4K lap esetén 4 bit: lapszám (2 4 = 16) Kimenő fizikai cím (24580) 12 bit: offszet (eltolás), 2 12 = 4096 címet reprezentálhat Ezért használunk 2 hatványa lapméretet Lap tábla 12 bites eltolás közvetlenül másolódik Virtuális lap számát a laptábla indexeként használjuk Jelenlét bit MMU 12 Bejövő virtuális cím (8196)
MMU működése, másképpen 13
Laptábla A laptábla célja hogy a lapokat lapkeretekre képezzük le Lényegében egy függvény argumentuma: a virtuális lapszám eredmény: a lapkeret száma Két probléma: A laptábla nagyon nagy lehet A leképezés gyors legyen 14
A laptábla nagyon nagy lehet 2 m címtartomány és 2 n lapméret esetén Címtartomány: 2 32 = 4 294 967 296 Lapméret: 2 12 = 4096 Lapok száma: 2 32-12 = 2 4 = 1 048 576 4 GB 4 KB Több mint 1 millió lap, melyekhez bejegyzés kell Minden processzusnak saját laptáblája van!! 64 bit esetén még több 15
A leképezés gyors legyen Minden memóriahivatkozásnál végre kell hajtani a címfordítást Egy utasítás több memóriahivatkozást is eredményezhet 16
Laptábla: Gyors hardware regiszterekből álló tömb Amikor egy processzus elindul, a rendszer betölti a memóriából a processzus laptábláját a regiszterekbe Előny Legegyszerűbb Leképezés alatt nem kell a memóriához fordulni Hátrány Processzus váltásnál a laptábla regisztrekbe töltése csökkenti a teljesítményt 17
Teljes laptábla a memóriában Egy regiszter mutat a laptáblára Processzus váltásnál csak egy regisztert kell átírni Hátrány Minden utasításnál több memóriahivatkozás 18
Kétszintű laptábla Második szintű laptábla 32 bites cím, két darab 10 bites mezőből és 12 bites offszetből áll. Felső szintű laptábla Jelenlét bit 0 lapok 19
Kétszintű laptábla, címfordítás Felső szintű laptábla Második szintű laptábla 20
Laptábla bejegyzés Gyorsítótár letíltás Módosított Jelenlét/hiány bit Lapkeret száma Hivatkozott Védelmi bitek Módosított bit: ha írtunk a lapra értéke 1 lesz, ha értéke 0 nem kell kiírni a lemezre (dirty bit) Hivatkozott bit: ha olvastunk vagy írtunk értéke 1 lesz; segít ha egy lapot ki kell dobni, akkor a használtat nem választjuk 21
TLB A laptáblákat a memóriában tartjuk Sajnos nagyban befolyásolja a teljesítményt Hivatkozáslokalitás A legtöbb hivatkozás a lapok egy kis számára vonatkozik Megoldás: Hardware eszköz Translation Lookaside Buffer (címfordítási gyorsítótár) 22
TLB 8-64 bejegyzést tud tárolni MMU először a TLB-ben keresi a lapot, egyidejűleg (párhuzamosan)! Ha a művelet nem sérti a védelmet, azonnal kapjuk a lapkeret címet Ha sérti, védelmi hiba 23
TLB Lapszám nincs a TLB-ben Laptáblából keresi ki a táblát TLB-ből kidob egy bejegyzést Módosított bitet vissza kell írni a laptáblába Betölti a TLB-be az új lapot Minden adatot felül kell írni a TLB-ben 24
MMU működése TLB-vel 25
Szoftveres TLB Modern rendszereknél a TLB feltöltése szintén az operációs rendszer része SPARC MIPS, HP PA, Power PC Ha egy lap nincs a TLB-ben, TLB hiba generálódik és az operációs rendszer kapja meg a vezérlést Nagyon kevés utasítással szabad végrehajtani! TLB hiba gyakoribb mint lap hiba Sokféla módszerrel javítható a működése 26
32 bites cím, 4KB lapok Invertált laptáblák Több mint 1 millió bejegyzés Laptábla kb 4MB-os 64 bites cím, 4KB lapok Több mint 10 52 bejegyzés Egy bejegyzés 8 byte A laptábla kb. 30 millió GB!!! 27
Invertált laptáblák A valós tár minden lapkeretéhez tartozik egy bejegyzés 64 bites címtér, 4 KB lapméret, 256 MB RAM Csak 65 536 bejegyzés kell Nehezebb a virtuálisról a fizikai címre való fordítás pid processzus p lapja pid nem használható indexként Az (pid,p) párost kell megkeresni a laptáblában 28
Invertált laptáblák Nem hatékony keresés, legrosszabb esetben O(n) 29
Invertált laptáblák Itt is segíthet a TLB!!! Vagy Keresésre használható hasító (hash) tábla Egy bejegyzés egy láncolt listát tartalmaz kulcs ütközés megoldására 30
Valós rendszerek Pentium: 2 szintű laptábla Pentium 4: 3 szintű laptábla AMD64: 4 szintű laptábla UltraSPARC: 3 szintű laptábla IBM RS/6000, PowerPC: invertált laptábla 31
fork, Copy-On-Write, COW fork: Processzus létrehozására használtuk Lemásolta a processzust, majd rögtön felülírtuk (execve) Nem hatékony Megoldás: Processzus összes lapját olvashatóra állítjuk Új processzus lapjait ugyanazokra a lapkeretekre képezzük, szintén csak olvashatóan Ha valamelyik processzus írni próbál egyik lapjára, kivétel generálódik és ekkor másolunk 32
COW, C lap módosítása előtt Fizikai memória Processzus 1 Processzus 2 A Lap B Lap C Lap 33
COW, C lap módosítása után Fizikai memória Processzus 1 Processzus 2 A Lap B Lap C Lap C Lap 34
Laphiba Igény szerinti lapozás (demand paging) Egy lap csak akkor töltődik be amikor szükség van rá A processzus nincs a memóriában Első utasítás, rögtön laphibát generál, és behozza a lapot Gyors további laphibák (verem, globális változók) Egy idő múlva minden szükséges lap a memóriában lesz Lap betöltés Ha referencia mutat a lapra Érvénytelen referencia >>abort Nincs a memóriában >> betöltés 35
Laphiba, lemezre írás-beolvasás 36
Érvényes-érvénytelen bit Minden laptábla bejegyzés tartalmaz egy bitet v: memóriában i: nincs a memóriában (érvénytelen, invalid) Keret #. laptábla érvényes - érvénytelen bit v v v v i i i Ha címfordítás során a bit i akkor laphiba generálódik 37
Érvényes-érvénytelen bit 38
Laphiba, lépések 1. Utasítás egy új lapra hivatkozik 2. Megszakítás, operációs rendszer meghívódik 3. Lap a lemezen 4. Lap betöltése egy üres keretbe 5. Laptábla beállítása i-ről v-re 6. Utasítás ismételt végrehajtása!!!!! 39
Nincs üres lapkeret Ki kell dobni egy lapot Laphiba Ha gyakran használt lapot dobunk ki, hamar vissza kell tölteni Melyiket dobjuk ki? A megoldás mindig erőforrásigényes így minnél kevesebbszer szeretnénk végrehajtani 40
Lapcserélési algoritmusok Sokféle eljárás létezik A probléma felmerül a gyorsítótárak esetén is A lehető legkevesebb laphibát akarunk 41
42 First-In-First-Out (FIFO) algoritmus 3 lapkeret esetén 1 1 1 2 2 1 2 3 3 4 2 3 4 4 1 3 1 4 1 2 2 5 1 2 5 5 1 2 1 5 1 2 2 5 3 2 3 5 3 4 4 5 3 4 5 Kívánt lap: 9 laphiba laphiba generálódik
43 First-In-First-Out (FIFO) algoritmus 4 lapkeret esetén 1 1 1 2 2 1 2 3 3 1 2 3 4 1 2 3 1 1 2 3 2 5 2 3 5 5 1 3 1 5 1 2 2 5 1 2 3 4 1 2 4 4 5 2 5 Kívánt lap: 4 4 4 4 4 4 3 3 3 10 laphiba
Belady anomáliája Belady László, 1969: Korábban azt hitték, ha több a lapkeret akkor csökken vagy azonos számú lesz a laphiba Bár több a lapkeret, mégis több a laphiba 44
Optimális lapcserélési algoritmus Egyszerű leírni, de lehetetlen megvalósítani Azt a lapot cseréljük le, melyet a leghosszabb ideig nem használunk Sajnos nem látunk a jövőbe A laphiba idejében nem lehet megmondani, hogy mely lapokra lesz hivatkozás Szimulátorban első futtatás során nyomonkövetjük a hivatkozásokat Második futásnál használható az optimális algoritmus 45
46 Optimális lapcserélési algoritmus 4 lapkeret esetén 1 1 1 2 2 1 2 3 3 1 2 3 4 1 2 3 1 1 2 3 2 1 2 3 5 1 2 3 1 1 2 3 2 1 2 3 3 4 2 3 4 4 2 3 5 Kívánt lap: 4 4 4 5 5 5 5 5 5 6 laphiba Jövőbe látás
Not-Recently-Used (NRU) Gyorsítótár letíltás Módosított Jelenlét/hiány bit Lapkeret száma Hivatkozott Védelmi bitek Módosított bit: ha írtunk a lapra értéke 1 lesz, ha értéke 0 nem kell kiírni a lemezre (dirty bit) Hivatkozott bit: ha olvastunk vagy írtunk értéke 1 lesz; segít ha egy lapot ki kell dobni, akkor a használtat nem választjuk 47
Not-Recently-Used (NRU) Amikor egy processzus elindul, mindkét bitet (módosított, hivatkozott bit) nullázzuk Időnként (minden) órajelre nullázzuk a Hivatkozott bitet Így megkülönböztetjük azokat a lapokat amelyekre nem hivatkoztunk az időben 48
Not-Recently-Used (NRU) Négy csoportba sorolhatók a lapok 0. osztály: nem hivatkozott, nem módosított 1. osztály: nem hivatkozott, módosított 2. osztály: hivatkozott, nem módosított 3. osztály: hivatkozott, módosított Az algoritmus véletlenszerűen kiválaszt egy lapot a legkisebb sorszámú nemüres osztályból és ezt a lapot dobja ki a memóriából 49
Második lehetőség lapcserélési alg. Second chance FIFO módosítása Ne dobjon ki gyakran használt lapot Ha a Hivatkozott bit nulla: nem használtuk a lapot és eldobható egy: töröljük a bitet és a lapot a lista végére tesszük, úgy kezeljük, mintha most jött volna be a memóriába Olyan lapot keresünk, amelyre nem volt hivatkozás az utolsó időintervallumban 50
Második lehetőség lapcserélési alg. Ha mindegyikre volt hivatkozás, akkor FIFO-ként működik Hiszen amikor a listán végigmentünk az első lapot nullás bittel kapjuk meg Elsőnek betöltött lap Betöltési idő Utoljára betöltött lap A-t úgy kezeljük Mint egy újonnan Betöltött lapot 51
Óra lapcserélési algoritmus A második lehetőség algoritmus folyamatosan mozgatja a lapokat a listában Nem túl hatékony Hatékonyabb egy körkörös lista A mutató mindig a legrégebbi lapra mutat 52
Óra lapcserélési algoritmus Laphiba esetén a mutatónál levő lapot vizsgáljuk: Hivatkozott bit értéke: 0: eldobjuk a lapot 1: nullázzuk a bitet és a következő lapra lépünk 53
Least-Recently-Used (LRU) Optimális algoritmus közelítése Az utoljára használt lapok valószínűleg újra kellenek Amikor laphiba történik akkor a legrégebben használt lapot dobjuk el Nehezen megvalósítható Egy láncolt listát készítünk a lapokból A lista elején van a legutoljára használt lap, végén a legrégebben használt lap A probléma, hogy a listát minden hivatkozásnál frissíteni kell 54
Least-Recently-Used (LRU) Alternatív implementáció Rendeljünk egy számlálót minden laphoz Minden hivatkozásnál növeljük a számlálót Laphiba esetén a legkisebb számlálóértékű lapot választjuk 55
n lapkeret a gépben LRU bitmátrix-al n x n mátrixot definiálunk (csupa nulla) k-adik lapra hivatkozunk k-adik sor csupa 1-es k-adik oszlop csupa 0 lesz Legkisebb bináris értékű sor tartozik a legrégebben használt laphoz 56
LRU bitmátrix-al 0 1 2 3 2 1 0 3 2 3 57
Összefoglalva Algoritmus Optimális FIFO Második esély Óra LRU NRU Megjegyzés Nem valósítható meg, de tesztnek jó Fontos oldalakat is kicserélhet FIFO-nál sokkal jobb Valóságos Kiváló, de nehéz pontosan megvalosítani Az LRU egy durva közelítése 58
Tervezési szempontok 59
Munkahalmaz A processzus által használt lapok halmaza a munkahalmaz (working set) Ha az egész munkahalmaz a memóriában van akkor a processzus laphiba nélkül fut Ha nem fér el a memóriában akkor sok laphibát generál 60
Vergődés (thrashing) CPU kihasználtsága növekszik a multiprogramozással a processzusok számával Több processzus, kevesebb memória áll rendelkezésre Egyes processzusok munkahalmaza nem fér be a memóriába Növekvő laphiba 61
Vergődés (thrashing) Egyre több processzusnak nincs elég memóriája Csökken a CPU kihasználtsága A rendszer I/O korlátozottá válik A processzusok nem számítással (hasznos tevékenységgel) hanem lapcserékkel van elfoglalva 62
Munkahalmaz modell A vergődés elkerülése érdekében a sok lapozásos rendszer megpróbálja nyomon követni a processzusok munkahalmazát (working set) és a program indítása előtt betölteni Denning, 1970 63
Globális-lokális lapcsere Globális lapcsere A processzus az összes lapkeretből választhat lapcsere esetén Egy processzus elvehet lapkeretet egy másik processzustól Lokális lapcsere A processzus csak a saját lapkeret választékából választhat 64
Globális-lokális lapcsere Globális lapcsere jobban működik A processzus munkahalmaz mérete a futás során változhat Lokális lapcsere esetén, ha nő a munkahalmaz vergődéshez vezet ha csökken a munkahalmaz memóriát vesztegetünk A globális lapcsere algoritmusnak döntenie kell, hogy mennyi memóriát foglaljon a processzusnak 65
Foglalás Minden processzusnak kell egy minimum mennyiségű lapkeret Két foglalási stratégia Fix méretű Prioritásos 66
Egyenlő méretű Fix méretű foglalás Minden processzus ugyanannyi lapkeretet kap 100 keret esetén, 5 processzus, 20 lapkeret mindegyik processzusnak Arányos méretű A processzus méretének megfelelő számú lapot foglal 67
Prioritásos foglalás Arányos méretű foglalás, de a prioritás alapján 68
Laphiba gyakorisági algoritmus Page Fault Frequency, PFF Megmondja, hogyan növeljük vagy csökkentsük a processzuslapok számát Növelni kell a lapkeretek számát Csökkenteni kell a lapkeretek számát Lapkeretek száma 69
Teherelosztás A PFF használata mellett is előfordulhat vergődés Néhány processzusnak kell lap De nincs processzus ami fel tudna adni lapot Megoldás Csökkentsük a memóriáért versenyző processzusok számát 70
Program szerkezet int data [128,128]; Minden sor egy lap 1. program for (j = 0; j <128; j++) for (i = 0; i < 128; i++) data[i][j] = 0; 128x128 =16385 laphiba 2. program for (i = 0; i < 128; i++) 128 laphiba for (j = 0; j <128; j++) data[i][j] = 0; 71
I/O és lapozás Néha szükség lehet arra, hogy ne engedjük egy lap eldobását, pl. I/O esetén Rögzíteni kell a lapot 72
VM stratégia A virtuális memória rendszer működése és hatékonysága sok tényezőtől függ Laptábla kialakítása (több szintű, hasító táblás) Lapméret Lapcsere stratégia Betöltési stratégia Munkahalmaz mérete Globális-lokális foglalás 73
Lapméret Általában választható érték Kis lap méret Előny Kisebb belső töredezettség Jobban használható különböző adatszerkezeteknél Hátrány Egy processzusnak sok lap kell Nagyobb laptábla 74
Lapméret 75
Betöltési stratégia Meghatározza mikor töltsünk be egy lapot Szüksége szerinti betöltés Laphiba esetén Előtöltés Javítja az I/O-t, nagyobb egységben olvasunk 76
Lapcsere stratégia Azt a lapot kell eltávolítani, melynél a legvalószínűbb hogy a jövőben nem hivatkozunk rá Korlátok: Kernel kód Kernel adatszerkezetek I/O bufferek 77
Takarítási stratégia Jó lenne ha mindig rendelkezésre állna néhány szabad lap Paging daemon Háttérben fut Ha nincs elég szabad lap, akkor a lapcserélési algoritmus alapján kijelöl néhányat Időzíti, hogy a lapokat kiírjuk a merev lemezre, így amikor laphiba van lesz szabad lap 78