Mäluhaldusüksus

Mäluhaldusüksus (inglise keeles memory management unit, lühend MMU) on riistvarakomponent, mis teisendab keskseadmes (protsessoril) kasutatavad virtuaalaadressid füüsilisteks aadressideks põhimälus.

Tööpõhimõte

Kuidas mäluhaldusüksus tõlgib virtuaalaadressi füüsiliseks aadressiks põhimälus.

Kaasaegsed operatsioonisüsteemid kasutavad MMU-d selleks, et anda igale programmile oma virtuaalmälu ruum. MMU peamine ülesanne on tõlkida iga mälupöörduse juures programmi kasutatav virtuaalne aadress vastavaks füüsiliseks aadressiks põhimälus. Selleks jagab MMU mälu kindla suurusega blokkideks ehk lehekülgedeks ja peab tabelit, mis seob virtuaalsed leheküljed füüsilistega. Kui programm pöördub lehekülje poole, mida hetkel füüsilises mälus ei ole, annab MMU operatsioonisüsteemile märku ja operatsioonisüsteem laeb lehekülje andmekandjalt mällu. Lisaks aadressitõlkele tagab MMU mälukaitse — kui programm üritab pöörduda mällu, kuhu tal pole õigust, peatab MMU selle. Tänu sellele saavad mitu programmi korraga arvutis töötada, ilma et nad üksteise mälu rikuksid.

Tänapäeval on aadress tavaliselt 32- või 64-bitine. Pikema aadressiga saab kirjeldada rohkemate füüsiliste aadresside asukohta. Aadressitõlge toimub lehekülgede kaupa. Virtuaalne aadress jagatakse kaheks osaks: ülemised bitid moodustavad virtuaalse lehekülje numbri ja alumised bitid kirjeldavad nihet lehekülje sees. Näiteks 32-bitine aadress võib koosneda 20 bitist, kuhu on kirjutatud lehekülje number, ja ülejäänud 12 bitti kirjeldavad nihet mis näitab aadressi asukohta leheküljel. 12 bitiga saab kirjeldada 4096 mäluaadressi, mis tähendab, et leheküljed on 4 KB suurused. MMU võtab lehekülje numbri, otsib leheküljetabelist sellele vastava füüsilise lehekülje numbri ja liidab sellele nihke. Nii saadaksegi lõplik füüsiline aadress.

Erinevad lähenemised mälujaotusele

Aja jooksul on välja kujunenud mitu erinevat meetodit, kuidas MMU saab programmidele mälu eraldada. Esimestes lihtsamates arvutites kasutati base and bound meetodit, millest arenes välja segmenteerimise meetod. Eraldi meetodina kujunes välja lehekülje meetod, mis on tänapäeva süsteemides kõige levinum. Põhiline vahe nende vahel seisneb selles, et lehekülje meetodil on kogu mäluruum jaotatud ühesuurusteks lehtedeks, aga base and bound ja segmenteerimise meetodil võivad mäluplokkide suurused üksteisest palju erineda.

Baas ja piir

Baas ja piir (inglise keeles base and bound) on lihtne ja algeline mäluruumi jagamise moodus. Programmile antakse mälus piisavalt suur ala, et see saaks toimetada, ja tabelisse kirjutatakse üles antud mäluruumi alguskoht ehk baas ja kui palju seda mälu anti ehk piir. Näiteks kui baas on 10000 ja piir on 2000, siis programm saab tegutseda aadressidel 10000 kuni 12000.

Meetodi tugevus on lihtsus — iga programmi kohta on vaja üles märkida ainult kaks numbrit, baas ja piir. Nõrkus on aga see, et mälu kirjutatakse täis alustades algusest. Esimesel täitmisel on kõik ideaalne, aga niipea, kui üks programm asendatakse teisega, mis võtab veidi vähem ruumi, tekib programmide vahele jupike kasutamata mälu. Olukorra kordumisel mäluruumis on kasutatav mäluruum tunduvalt väiksem kui riistvara võimaldatav maksimum. Seda nähtust nimetatakse väliseks fragmentatsiooniks.

Segmenteerimise meetod

Segmenteerimise meetod toimib analoogselt baas ja piir meetodiga, aga siin jaotatakse programm väiksemateks funktsionaalseteks osadeks — näiteks kood, andmed ja pinu on kõik erinevates kohtades mälus. Tugevuseks on jällegi lihtsus, kuigi tegemist on keerukama meetodiga kui baas ja piir meetod, ja tabelisse peab üles märkima veidi rohkem infot — iga segmendi kohta eraldi baas ja piir.

Nõrkus on samuti sama mis baas ja piir meetodil, ainult veidi vähendatud kujul. Kuna programmid on jaotatud väiksemateks osadeks, jääb vähem ruumi kasutamata. Siiski see fragmentatsiooni probleem päriselt ei kao.

Lehekülje meetod

Lehekülje meetodil jaotatakse terve mäluala ühesuurusteks lehekülgedeks ja programmidele antakse mäluruumi lehekülgede kaupa. Iga lehekülg võib olla füüsilises mälus ükskõik kus, ja MMU ülesanne on teha ühendus virtuaalse lehekülje aadressi ja füüsilise aadressi vahel.

Lehekülje meetodi tugevus on see, et kuna mälu on jaotatud väikesteks samasuurusteks lehekülgedeks, ei teki välist fragmentatsiooni — kõik augud on täpselt ühe lehekülje suurused ja sinna mahub uus lehekülg alati ära. Nõrkus aga seisneb selles, et mäluruumi läheb raisku siis, kui programmid vajavad tööks ekstra mäluruumi. See ruum antakse neile uuel leheküljel, isegi kui tegemist on väga vähe ekstra mälu vajava protsessiga. Sellisel juhul tundub, et arvuti mälu on täielikult kasutuses, sest kõik leheküljed on kasutuses, aga tegelikult on paljud leheküljed üsna tühjad.

Segmenteerimine pluss lehekülje meetod

See meetod ühendab segmenteerimise meetodi ja lehekülje meetodi. Nagu lehekülje meetodis jagatakse mälu kohe alguses lehekülgedeks ja programmid funktsionaalseteks segmentideks. Kui segment on suurem kui üks lehekülg, jaotatakse segment juppideks lehekülgede vahel. Sellise meetodi puhul on virtuaalmälu aadressis lisaks lehekülje numbrile ja nihkele veel ka segmenti kirjeldav number. See annab korraga nii mäluruumi täieliku täitmise, mis tuleb lehekülje meetodist, kui ka loogilise jaotuse, mis tuleb segmenteerimisest. Siiski jäävad osad leheküljed poolikult täidetuks nagu puhta lehekülje meetodi korral.

Leheküljetabel

Leheküljetabel on mälus olev andmestruktuur, mis seob virtuaalsed leheküljenumbrid füüsiliste leheküljenumbritega. Iga virtuaalse lehekülje kohta on tabelis üks kirje ehk PTE (page table entry).

Lisaks füüsilise lehekülje numbrile sisaldab kirje veel mitut tüüpi infot. Seal on kehtivuse bitt, mis näitab, kas lehekülg on hetkel füüsilises mälus. On muudatuse bitt ehk dirty bit, mis näitab, kas lehekülge on pärast mällulaadimist muudetud — see on oluline, sest muutmata lehekülge ei pea tagasi kettale kirjutama. On ka kasutuse bitt, mida lehekülgede väljavahetamise algoritmid kasutavad, juurdepääsuõigused (kas lehekülge tohib lugeda, sinna kirjutada või seal asuvat koodi täita) ja privileegitase, mis määrab, kas lehekülg on kättesaadav kasutajarežiimis või ainult kerneli režiimis.

Mitmetasemelised tabelid

Kui virtuaalne aadressiruum on suur, läheb ühetasandiline leheküljetabel ebamõistlikult suureks. Selleks et tabeleid väiksematena hoida, kasutatakse tänapäeval peaaegu eranditult mitmetasemelisi leheküljetabeleid. Põhimõte on selline, et ühest üüratust nimekirjast tehakse puukujuline hierarhia väiksematest tabelitest. Kasutamata virtuaalmälu piirkondade jaoks ei pea üldse alamtabeleid looma — see säästab palju mälu.

Puuduseks on see, et mitmetasemeline tabel on aadressi tõlkimisel aeglasem, sest iga aadressi tõlkimiseks tuleb teha mitu mälupöördust ühe asemel. x86-64 arhitektuuris hõlmab see nelja taseme tabelite läbikäimist, mis tähendab nelja lisamälupöördust enne kui programm päris andmeteni jõuab.

Translatsioonipuhver

Translatsioonipuhver ehk TLB (translation lookaside buffer) on väike kiire vahemälu MMU sees, mis hoiab hiljuti kasutatud leheküljetabeli kirjeid. Ilma TLB-ta tuleks iga programmi mälupöörduse jaoks enne andmeteni jõudmist tabelid mälust läbi käia, mis tänapäeva mitmetasemeliste tabelite puhul tähendaks ühe pöörduse asemel mitut.

Kui protsessor tekitab virtuaalse aadressi, vaadatakse esmalt TLB-st, kas vastav tõlge on seal olemas. Kui jah (TLB hit), saab füüsilise aadressi kohe kätte. Kui ei (TLB miss), peab MMU tegema täieliku leheküljetabeli läbikäimise (page walk), mis on palju aeglasem.

Analoogiliselt saab seda võrrelda raamatu lugemisega. Kui me loeme leheküljetabelit, siis loeme raamatut algusest, kuni leiame vajaliku info. Aga kui oleme info juba leidnud ja tahame seda raamatut edasi lugedes uuesti vaadata, siis mäletame enam-vähem, mis leheküljel see oli, ning saame kohe infoga uuesti tutvuda. Kõvasti kiirem kui raamatut iga kord uuesti algusest lugema hakata.

TLB miss'iga seotud kulu on niivõrd suur, et kogu kaasaegne süsteem on disainitud seda minimeerima. Tihti on kaasaegsetes protsessorites mitu tasandit TLB-sid, sarnaselt protsessori vahemälu tasemetele. Iga kord, kui toimub kontekstilülitus ehk operatsioonisüsteem vahetab töös oleva protsessi, peab TLB tühjendama, sest uue protsessi virtuaalaadressid kaardistuvad teistmoodi kui eelmise oma. Selle kulu vähendamiseks võtsid Intel ja AMD 2008. aastal kasutusele sildid (tags) TLB kirje juures — see võimaldab TLB-l hoida samaaegselt mitme protsessi tõlkeid ilma kogu TLB tühjendamiseta.

Mälukaitse

MMU annab operatsioonisüsteemile võimaluse eraldada igale protsessile oma virtuaalne aadressiruum ja kaitsta ühe protsessi mälu teise eest. Kaitsemehhanism põhineb leheküljetabeli kirjetes olevatel õigustel: iga lehekülje jaoks määratakse eraldi, kas seda tohib lugeda, sinna kirjutada ja sealt käske täita. Õiguste kontroll toimub riistvaraliselt iga mälupöörduse juures, mistõttu see eriti ei koorma protsessorit.

Kui programm üritab teha midagi, mida tal teha ei tohi, tekitab MMU erindi ja annab kontrolli üle operatsioonisüsteemile, kes otsustab, mida edasi teha — kas anda teada veast või programm sulgeda.

Ajalugu

Ilma virtuaalmälu ja mäluhaldusüksuseta, sai üks arvuti käitada ainult ühte programmi korraga. Kui kaks programmi tahtsid samal ajal töötada, esines suur risk, et nad kirjutavad ühele ja samale füüsilisele mäluaadressile, rikkudes üksteise andmeid. Seetõttu ei saadud arvuti võimsust täielikult ära kasutada.

Atlas Manchesteri Ülikoolis 1963.aastal

Lahendus loodi Manchesteri Ülikoolis, kus ehitati üht oma aja kiiremaid arvuteid — Atlast. Atlas on tähelepanuväärne kui esimene masin virtuaalmäluga (toona kutsuti seda "üheastmeliseks mäluks", one-level store), mis kasutas lehekülgede jaotamise tehnikat. Atlase esimene tootmisversioon avati 1962. aasta detsembris. Projekti juhtis professor Tom Kilburn ja arvuti arendati koostöös ettevõttega Ferranti Ltd. Atlase virtuaalmälu kaardistas programmeerijale kättesaadavad virtuaaladressid 16 384 sõna suuruse põhi-tuumamälu ja 98 304 sõna suuruse trumlimälu peale. Kaasaegse arvuti jaoks on Atlase emulaator saadaval, see võimaldab uurida selle algse arhitektuuri tööd.

Atlasega samal ajal arendas Burroughs Corporation välja oma kommertsarvuti B5000, mis jõudis turule 1961. aastal ja oli esimene kommertskasutuses olnud virtuaalmäluga arvuti. B5000 ei kasutanud aga lehekülgi vaid segmenteerimist. IBM System/360 Model 67, mis tuli välja 1965. aastal, sisaldas MMU-d nimega dünaamiline aadressitõlge (dynamic address translation, DAT). Hiljem, alates 1972. aastast, kasutas sarnast MMU-d ka IBM System/370 seeria.

Kõige varasemates mikroprotsessorites ei olnud MMU-d üldse, ja need 8-bitised süsteemid kasutasid lihtsamaid lahendusi nagu pankade vahetamist (bank switching). Mõnedes varastes mikroprotsessorsüsteemides oli MMU eraldi kiip — näiteks Motorola 68851 (1984) kasutati koos Motorola 68020 protsessoriga Macintosh II-s. Hiljem integreeriti MMU samale kiibile protsessoriga, näiteks Motorola 68030, Intel 80286 ja hilisemates x86 protsessorites.

Intel 80286 lisas tõelise segmenteerimise koos segmentide tabeliga, kuid ei toetanud veel lehekülgedeks jaotamist. Intel 80386 tõi 1985. aastal kaasa 32-bitise x86 arhitektuuri ning esimest korda ka täieliku lehekülgedega MMU toe x86 perekonnas. x86-64 arhitektuur, mis tutvustati 21. sajandi alguses, eemaldas segmenteerimise peaaegu täielikult ja võttis kasutusele lameda mälumudeli koos neljatasandilise leheküljetabeliga. Mõned uuemad x86-64 protsessorid toetavad ka viietasandilist tabelit, mis võimaldab 57-bitiseid lineaarseid aadresse.

Tänapäev

Enamik tänapäeva süsteeme jaotab mälu 4 KB suurusteks lehekülgedeks, kuid suuremate mälumahtude tõhusamaks haldamiseks toetatakse ka palju suuremaid lehekülgi. x86 protsessorid on alates Pentium Pro-st ja AMD Athlonist toetanud 4 KB lehekülgede kõrval ka 4 MB lehekülgi, ning uuemad x86-64 protsessorid oskavad kasutada 1 GB lehekülgi . ARM64 on selles osas paindlikum — arendaja saab valida lehekülje suuruseks 4 KB, 16 KB või 64 KB.

Suurematel lehekülgedel ehk "huge pages"-il on see eelis, et üks TLB kirje katab palju rohkem mälu, mis vähendab TLB möödalaskude arvu mälumahukate rakenduste puhul, näiteks andmebaasides ja virtualiseerimisel.

Erinevad protsessoriarhitektuurid lähenevad MMU disainile veidi erinevalt. x86-64 ja ARMv8 (AArch64) kasutavad mõlemad neljatasemelist leheküljetabelit standardse 48-bitise virtuaalaadressiga, kuigi nende täpne struktuur ja kirjete formaat erinevad. RISC-V kasutab paindlikumat skeemi, kus tasemete arv sõltub valitud režiimist (Sv32, Sv39, Sv48, Sv57).

Vaata ka

Viited

  1. 1 2 3 4 5 6 7 Tanenbaum, Andrew S.; Bos, Herbert (2014). Modern Operating Systems, 4th ed. Pearson. ISBN 978-0-13-359162-0. Peatükk 3: Memory Management.
  2. 1 2 3 4 5 6 7 Arpaci-Dusseau, Remzi H.; Arpaci-Dusseau, Andrea C. (2018). Operating Systems: Three Easy Pieces, v1.00. Arpaci-Dusseau Books. Peatükid 13–22: Memory Virtualization. Saadaval: https://pages.cs.wisc.edu/~remzi/OSTEP/
  3. 1 2 3 4 Intel Corporation. Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 3A: System Programming Guide, Part 1, peatükk 4 "Paging". https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
  4. 1 2 3 4 5 Hennessy, John L.; Patterson, David A. (2017). Computer Architecture: A Quantitative Approach, 6th ed. Morgan Kaufmann. ISBN 978-0-12-811905-1. Peatükk 2: Memory Hierarchy Design.
  5. ↑ Intel Corporation. Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 3C: System Programming Guide, Part 3, peatükk 28 "VMX Support for Address Translation". https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
  6. ↑ Lavington, Simon (2012). "The Atlas Milestone". Communications of the ACM. https://cacm.acm.org/opinion/the-atlas-milestone/
  7. 1 2 Kilburn, T.; Edwards, D. B. G.; Lanigan, M. J.; Sumner, F. H. (1962). "One-Level Storage System". IRE Transactions on Electronic Computers, kd EC-11, nr 2, lk 223–235.
  8. ↑ Atlas Emulator for Modern PCs. School of Informatics, University of Edinburgh. https://www.icsa.inf.ed.ac.uk/research/groups/hase/models/atlas/
  9. 1 2 Arm Ltd. AArch64 Memory Management Guide / Arm Architecture Reference Manual for A-profile architecture. https://developer.arm.com/documentation/
  10. ↑ RISC-V International. The RISC-V Instruction Set Manual: Volume II — Privileged Architecture, sektsioonid 10.3–10.6. https://riscv.org/technical/specifications/