A számítástechnikában a virtuális memória mechanizmusát az 1960-as években fejlesztették ki . A szoftver által látott (virtuális) címek on-the-fly fordításának használatán alapul fizikai RAM- címekké . A virtuális memória lehetővé teszi:
Cikk referencia James Kilburn, 1962-ben megjelent, leírja az első számítógép egy lapozható virtuális memória rendszer segítségével dob , mint egy kiterjesztése a központi memória magok a ferrit : az Atlas .
Ma minden számítógép rendelkezik virtuális memóriakezelési mechanizmussal, kivéve néhány szuperszámítógépet vagy valós idejű fedélzeti rendszert.
Az elv a következő:
Az oldal táblázatot az oldalszám indexálja. Minden sort „bejegyzés az oldaltáblázatnak” nevezünk ( oldaltáblázat bejegyzés , rövidítve PTE), és a keretszámot tartalmazza. Mivel az oldaltábla bárhol elhelyezhető a memóriában, egy speciális regisztráció (PTBR for Page Table Base Register ) tartja a címét.
A gyakorlatban a fordítási mechanizmus az MMU ( memóriakezelő egység ) nevű elektronikus áramkör része, amely az oldaltábla egy részét is tartalmazza, egy gyors regiszterekből álló asszociatív memóriában tárolva . Ezzel elkerülhető, hogy az egyes memória-hozzáférésekhez az oldal tábláját (a memóriában) keresse meg.
Itt van egy valódi példa egy olyan gépre, amelynek processzora virtuális 32 bites címeket generál, így képes elérni 4 GiB memóriát. Az oldal mérete 4KiB . Úgy levezetni, hogy az elmozdulás mező foglalja el a 12 legkevésbé szignifikáns bit , és az oldalszámot területén a 20 legjelentősebb bit.
Vegye figyelembe az egyes PTE-khez tartozó speciális mező jelenlétét. Az egyszerűség kedvéért a mező szélességét egy bitre csökkentettük: érvényességi bitre . Ha ez 0, akkor ez azt jelenti, hogy a keret száma érvénytelen. Ezért el kell sajátítani egy technikát, amely lehetővé teszi a PTE frissítését annak érvényessége érdekében.
Három eset fordulhat elő:
Az utolsó két esetben egy megszakítás - úgynevezett alapértelmezett oldal (vagy néha oldalhiba , angol fordítás angol oldalhibáról ) jön létre az anyagból, és kezet ad az operációs rendszernek. Ez a felelős azért, hogy a fő memóriában találjon egy rendelkezésre álló keretet, hogy lefoglalja azt az oldalhibáért felelős folyamatnak, és esetleg feltöltse a keret tartalmát a tömegmemóriába mentett tartalommal (jelenleg a merevlemez egy merevlemezen). csere területnek vagy csere területnek nevezett terület ).
Előfordulhat, hogy nincs több szabad keret a fő memóriában: ez akkor 100% -ban elfoglalt. Ebben az esetben egy paginációs algoritmus felelős az „áldozat” oldal kiválasztásáért. Ezt az oldalt vagy azonnal hozzárendelik a kérelmező folyamathoz, vagy először a merevlemezre menti, és az oldal táblában szereplő bejegyzés frissül. Az áldozati oldal nagyon jól tartozhat a helyhiányos folyamathoz.
Az alábbiakban felsorolunk néhány példát algoritmusokra. Az első sor a referencia-láncnak felel meg , vagyis annak sorrendjében, amelyben a folyamat hozzáfér az oldalakhoz. Feltételezzük, hogy a fő memória három képkockából áll . Az áldozat kerete aláhúzva jelenik meg. A kezdeti oldalhibákat nem számoljuk (számuk megegyezik a választott algoritmustól függetlenül).
7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 7 | 7 | 2 | 2 | 2 | 2 | 2 | 7 | ||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | |||||||||||||||||||||||||||||||||
1 | 1 | 3 | 3 | 3 | 1 | 1 |
7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 7 | 7 | 2 | 2 | 2 | 4 | 4 | 4 | 0 | 0 | 0 | 7 | 7 | 7 | |||||||||||||||||||||||||
0 | 0 | 0 | 3 | 3 | 3 | 2 | 2 | 2 | 1 | 1 | 1 | 0 | 0 | ||||||||||||||||||||||||||
1 | 1 | 1 | 0 | 0 | 0 | 3 | 3 | 3 | 2 | 2 | 2 | 1 |
7 | 0 | 1 | 2 | 0 | 3 | 0 | 4 | 2 | 3 | 0 | 3 | 2 | 1 | 2 | 0 | 1 | 7 | 0 | 1 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | 7 | 7 | 2 | 2 | 4 | 4 | 4 | 0 | 1 | 1 | 1 | ||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 3 | 3 | 3 | 0 | 0 | |||||||||||||||||||||||||||||
1 | 1 | 3 | 3 | 2 | 2 | 2 | 2 | 2 | 7 |
Viszonylag könnyű lehet megtalálni azokat a kóros eseteket, amelyek használhatatlanná teszik az algoritmust. Például az LRU algoritmus esetében ez egy olyan program lenne, amely 5 oldalt használ egy hurokban egy olyan gépen, amelynek csak 4 kerete van. Először az első 4 keretet fogja egymás után használni (1, 2, 3, 4), majd egy oldalhiba lép fel, és ez az 1. oldal, a legrégebbi betöltés, amely az áldozat lesz. A használt oldalak most (5, 2, 3, 4). Mivel a program ciklusos, az 1. oldalra van szüksége (folytatás az 5. oldalról). Ezúttal az áldozati oldal a 2. oldal, helyébe 1: (5, 1, 3, 4), majd (5, 1, 2, 4), (5, 1, 2, 3) stb. Minden iterációnál egy oldalhiba keletkezik ...
Intuitív módon az oldalkeretek számának növelésével (vagyis a fő memória növelésével) csökkenteni kell az oldalhibák számát.
Bélády „s anomália (1970) egy ellenpélda, amely azt mutatja, hogy ez nem feltétlenül igaz a FIFO algoritmus , sőt az olvasó képes lesz ellenőrizni a maga számára, hogy a szekvencia referenciák (3, 2, 1, 0, 3, 2 , 4, 3, 2, 1, 0, 4) vezet
Megjegyzés : ennek a kíváncsiságnak a mértékét nem szabad eltúlozni. Ez minden bizonnyal azt mutatja, hogy a FIFO algoritmus általában nem rendelkezik olyan tulajdonsággal, amelyet elvárhatott volna (a memória hozzáadása csökkenti az oldalhibákat), de nem azt mutatja, hogy átlagosan nincs meg . És különben sem a FIFO algoritmust soha nem használják oldalcserére.
Ezenkívül kimutatható, hogy bizonyos oldalcsere- algoritmusok ( például LRU ) nem tartoznak ilyen típusú rendellenességek alá.
A sértett oldal kiválasztásának fent említett módszerei alkalmazhatók akár egy folyamathoz tartozó oldalakon (akkor beszélünk a „helyi allokációról”), vagy az összes oldalra, tehát az összes memóriára (ebben az esetben az allokációs technika „globálisnak” mondják).
Globális allokációs rendszerben a folyamat végrehajtási ideje példányonként nagyon eltérő lehet, mivel az oldalhibák száma nem függ magától a folyamattól. Másrészt ez a rendszer lehetővé teszi a folyamathoz rendelt vezetők számának fejlődését.
Az alábbi ábra három futó folyamatot mutat be, például egy Ed nevű szövegszerkesztőt. A három példány mind ugyanazokon a virtuális címeken található (1, 2, 3, 4, 5). Ez a program két külön memóriaterületet használ: a kódot tartalmazó oldalakat, vagyis a programot leíró utasításokat, és az adatterületet, a szerkesztett fájlt. Elég, ha ugyanazokat a bejegyzéseket tartja az oldaltáblázatban, hogy a három példány megossza a kódterületet. Másrészt az adatoldalaknak megfelelő bejegyzések megkülönböztethetők.
Néhány bitvédelem hozzáadódik az oldaltábla minden bejegyzéséhez. Így könnyen meg tudjuk különböztetni a kernelhez rendelt, csak olvasható stb. Oldalakat. Lásd az alábbi példát.
Három fő probléma van:
A programok viselkedése nem kaotikus: a program elindul, meghívja azokat a funkciókat (vagy kódrészeket), amelyek viszont másokat hívnak stb. Ezen hívások mindegyike meghatároz egy régiót. Valószínű, hogy a program sok időt tölthet el néhány régión belüli futással: ez a lokalitás elve. Ugyanez az elv alkalmazható az adatokat tartalmazó oldalakra is.
Más szavakkal, egy program gyakran elér egy kis oldalkészletet, és ez az oldalhalmaz az idő múlásával lassan változik.
Ha képesek vagyunk megőrizni a memóriában ezeket a gyakran elérhető tereket, akkor csökkentjük annak esélyét, hogy egy program elkezdjen kukába kezdeni , vagyis azt állítsa, olyan oldalakra hivatkoznak, amelyeket a közelmúltban távolítottak el belőle.
A munkakészlet : munkaterületMeghatározhatunk egy paramétert, Δ, amely a folyamat által egy bizonyos időtartam alatt elérett oldalakra történő hivatkozások száma. Az alábbi ábra a munkaterület értékét mutatja két különböző időpontban:
A Δ értékét körültekintően kell megválasztani: túl kicsi nem fedi le a folyamat névleges munkaterületét ; túl nagy, felesleges oldalakat tartalmaz. Ha Δ egyenlő a végtelenséggel, akkor természetesen a teljes programot lefedi.
Egyetlen folyamat esetében grafikusan ábrázolhatjuk, hogy a memória hogyan van hozzárendelve, és vizualizálhatjuk a munkaterületeket:
A „tálcák” azok a területek, ahol nincs oldalhiba: a lefoglalt hely elég nagy ahhoz, hogy tartalmazzon minden olyan keretet, amelyre a folyamatnak viszonylag hosszú ideig szüksége van. Az oldalhibák az átmenet növekvő részében fordulnak elő, míg a memória felszabadul, ha a görbe visszaesik a következő munkaterületre: az egyensúlyi zónára.
Az operációs rendszer feladata az algoritmusok megvalósítása, hogy a Δ értéke optimális legyen, hogy a multiprogramozás és a központi egység használata maximális legyen. Más szavakkal: kerülje a szemetet . Ha az egyes folyamatok munkaterületeinek összege nagyobb, mint a rendelkezésre álló képkockák száma, szükségszerűen összeomlik.
A virtuális memória egyik előnye, hogy képes elindítani a program futtatását, amint az első kódlapja be van töltve a memóriába. Az előkészítés nem csak az első oldalt tölti be, hanem a következő néhányat is, amelyek elérésének valószínűsége nagyon nagy.
Gép | Címezhető hely | Oldal szám mezők | "Elmozdulás" mezők |
---|---|---|---|
Atlasz | 11. | 9. | |
PDP-10 | 9. | 9. | |
IBM-370 | 13 vagy 12 | 11 vagy 12 | |
Pentium Pro | 12 vagy 20 | 20 vagy 12 | |
Alfa 21064 | 13. | 30 |
Az M, U, N és NDP mezők csak akkor érvényesek, ha a V bit 1. Ha V értéke 0, akkor az NDP mező tartalmazza a címet azon a merevlemezen, ahol az oldal található.
Érték | Védelem |
---|---|
0000 | Nincs hozzáférés |
1000 | Olvasás a kernel számára |
1100 | Olvasás / írás a kernel számára |
1010 | Felhasználó és kernel olvasható |
1110 | Felhasználó olvas, kernel ír / ír |
1111 | A felhasználó és a rendszermag olvasása / írása |
A 24. bit, N ( N be van rejtve) azt jelenti, hogy az oldal nincs gyorsítótárban, és a rendszernek közvetlenül a memóriába vagy a memóriából kell olvasnia vagy írnia.
Az M ( M odified) bitet a hardver módosítja, ha az oldal tartalma módosul.
Az U bit ( U tilisée) azt jelzi, hogy az oldalt egy folyamat olvasta-e vagy írta-e. Hasznos a többiekkel együtt egy folyamat Munkakészletének meghatározásához (lásd fent).
A szegmentálás a memóriának olyan nézetet nyújt, amely összhangban van a felhasználóéval. Valójában ez nem (vagy ritkán!) A memóriát oldalak sorozatának tekinti, sokkal inkább szóközöknek vagy régióknak, amelyeket például egy adott felhasználásra szánnak: egy program kódja, az adatok, a verem, a halmaz. alprogramok, modulok, tömb stb. A szegmentálás ezt a szervezetet tükrözi.
Minden logikai objektumot egy szegmens jelöl. Egy szegmensben a címzés elmozdulás segítségével történik. A forgatónyomaték (szegmens, elmozdulás) egy memóriacímre lesz lefordítva egy két mezőt, határt és alapot tartalmazó szegmenstábla segítségével . Az alap a szegmens kezdő címe, és korlátozza ugyanannak a szegmensnek az utolsó címét:
A lapozott rendszereknek belső töredezettségi problémájuk van : az oldal végén helyet vesztegetnek. A szegmentált rendszereknek külső töredezettségi problémájuk van : a szegmensek közötti terek túl kicsik ahhoz, hogy új töredékeket fogadjanak, így a hely elpazarolható.
Helyre lehet állítani a memória tömörítésével, vagyis a szegmensek mozgatásával - miközben ezeket a módosításokat tükrözzük a szegmensek táblázataiban - úgy, hogy összefüggőek legyenek. Ez a művelet azonban drága.
Lehetséges a szegmensek megosztása a folyamatok között, amint az az alábbi ábrán látható, ahol két Ed1 és Ed2 folyamat ugyanazt a kódszegmenst (programot) használja, de különböző méretű diszjunkt adatszegmensekkel rendelkezik.
Ezt a védelmet a szegmens táblázatba felvett további bitek biztosítják, ugyanúgy, mint egy lapozott rendszer esetében.
A legismertebb példa az Intel 8086 és négy regisztere:
A 8086 utódai is tagolódnak:
Keverhető a két előző mód:
Néha szükség van a folyamat összes oldalának vagy szegmensének törlésére a fő memóriából. Ebben az esetben azt mondják, hogy a folyamat felcserélődik , és a hozzá tartozó összes adat a tömegmemóriában lesz tárolva. Ez akkor fordulhat elő hosszú ideig alvó folyamatoknál, amikor az operációs rendszernek memóriát kell rendelnie az aktív folyamatokhoz. Az oldalakat vagy a kódszegmenseket (programot) soha nem cserélik fel , hanem egyszerűen átcsoportosítják, mert megtalálhatók a programnak megfelelő fájlban ( a futtatható fájl ). Emiatt az operációs rendszer tiltja az írásbeli hozzáférést egy futtatható fájlhoz, amely használatban van; szimmetrikusan nem lehet elindítani egy fájlt, amíg azt egy másik folyamat írási hozzáférésként tartja nyitva.
A virtuális memória tömörítése javíthatja a virtuális memória rendszer teljesítményét. Ez a virtuális memóriakezelési technika adattömörítéssel csökkenti a segédtárhelyre irányuló és onnan érkező személyhívási kérelmek méretét vagy számát .
A virtuális memóriatömörítő rendszerben az oldalakat tömörítik és fizikai memóriában tárolják, általában RAM-ban , vagy tömörítve küldik kiegészítő tárhelyre, például merevlemezre vagy SSD-re . Mindkét esetben, a tartományban virtuális memória, amelynek tartalmát tömörített hozzáférhetetlen, így megkísérli elérni a tömörített oldalak ravaszt oldal hibákat , és visszafordítani a kompressziós folyamatot (kiszedésére háttértároló és a visszaállító). A tömörítési folyamat csökkenti a lapozott adatmennyiséget, és a felszabadított RAM-memóriát visszaküldi a rendelkezésre álló fizikai memóriakészletbe. Abban az esetben, ha a tömörített oldalakat a RAM memóriájában tárolják, a tömörített oldalak nyilván kevesebb helyet foglalnak el, mint az eredeti oldalak. Abban az esetben, ha a tömörített oldalakat kiegészítő tárhelyen tartják, a RAM memória teljesen felszabadul, és a kiegészítő memórián az írási és olvasási műveletek gyorsabbak, mintha az oldalakat nem tömörítették volna.