Virtuaalmälu

Virtuaalmälu on arvuti riist- ja tarkvara kasutatav mäluhaldustehnoloogia, mille eesmärk on programmide kasutuses oleva aadressiruumi laiendamine. Kui virtuaalmälu ei kasutataks, ei pruugiks programm, mis kasutab rohkem mälu, kui arvutil füüsiliselt olemas on, üldse töötada. Virtuaalmälu kasutamise korral kopeeritakse põhimällu ainult need programmi osad, mida programmi tööks jooksvalt vajatakse. Seeläbi ei tule programmil töö käigus mälust puudust.
Virtuaalmälu füüsilisse mällu kopeerimise hõlbustamiseks jagab operatsioonisüsteem virtuaalmälu lehekülgedeks. Iga lehekülg koosneb eelsätestatud hulgast mäluaadressidest ning salvestatakse kettale, et sellele hiljem ligi pääseda. Kui mõni programm salvestatud mälulehekülge vajab, kopeerib operatsioonisüsteem selle kettalt põhimällu ja teisendab virtuaalsed aadressid füüsilise mälu aadressideks. Virtuaalsete aadresside füüsilisteks aadressideks teisendamist nimetatakse vastendamiseks (ingl. mapping). Lehekülgede kettalt põhimällu kopeerimist nimetatakse lehekülgede saalimiseks.

Ajalugu

Enne virtuaalmälu mõiste tekkimist pidid 1940. ja 1950. aastatel kõik suuremad programmid primaar- ja sekundaarmälu salvestamise haldamiseks kasutama vastavat sisseehitatud loogikat. Näiteks oli võimalik kasutada ülekatmise meetodit. Paralleelarvutuste võimaldamiseks jagasid paljud varased süsteemid mälu mitme programmi vahel virtuaalmälu kasutamata. Sellist mälu jaotamist kasutas näiteks suurarvuti PDP-10, mis tegi seda registrite abil. Seetõttu oli virtuaalmälu kasutuselevõtu eesmärgiks lisaks primaarmälu laiendamisele ka teha selle võimaluste kasutamise programmeerijatele võimalikult lihtsaks.
1956. aastal avaldas saksa füüsik Fritz-Rudolf Güntsch Berliini Tehnikaülikoolis oma doktoritöö, mis kirjeldas kuue 100-sõnalise ploki suuruse põhimälu ja tuhande 100-sõnalise ploki suuruse aadressiruumiga masinaid, kusjuures riistvara liigutas automaatselt plokke primaarse ferriitmälu ja sekundaarse trummelmälu vahel. Güntschi peetakse tänapäeval virtuaalmälu idee avastajaks ja väljaarendajaks. 1962. aastal käiku võetud esimene Atlas rakendas esmakordselt lehekülgede saalimist arvuti töömälu laiendamisvõimalusena. See arvuti kombineeris oma 16 000 sõna primaarset ferriitmälu lisaks 96 000 sõna sekundaarse trummelmäluga ja oli sellega tänapäevaste saalivate süsteemide eelkäija. Tegelikult arendati saalimise töötavad prototüübid välja juba 1959. aastaks, aga tol ajal polnud see metoodika veel laiemaks avalikkuseks valmis ja vajas edasist arendustööd. 1961. aastal lasi Burroughs Corporation iseseisvalt, mainitud süsteemidest sõltumatult, välja esimese tõelise virtuaalmäluga kommertsarvuti, B5000, mis kasutas mälu saalimise asemel selle segmenteerimist.
Virtuaalmälu väljaarendamine oli kirjeldatud süsteemides veel algusjärgus ning enne selle kasutamist laiemale avalikkusele tutvustatavates operatsioonisüsteemides tuli ületada veel mitmeid takistusi. Dünaamiline aadresside tõlkimine vajas veel kallist ja keerukat eriotstarbelist riistvara, mistõttu aeglustasid esialgsed realisatsioonid mälule ligipääsemist märgatavalt ning kardeti, et uued, terve süsteemi mastaabis välja ehitatud sekundaarmälu kasutavad algoritmid võivad olla varasematest rakenduspõhistest algoritmidest vähem tõhusad. 1969. aastaks lõppesid vaidlused virtuaalmälu kasutamise üle kommertsarvutites ning veenduti selle kasulikkuses, kuna David Sayre’i juhitud IBM-i uurimisrühm suutis näidata, et nende virtuaalmälu ülekattesüsteem töötas järjekindlalt paremini kui parimad manuaalselt kontrollitud süsteemid. NORD-1 oli esimene virtuaalmälu kasutav väikearvuti. 1970. aastatel rakendati virtuaalmälu ka teistes väikearvutites, neist silmapaistvamalt VMS-il jooksvad VAX mudelid.
x86 arhitektuuris hakati virtuaalmälu kasutama Intel 80286 protsessoriga, kuid selle saalimistehnoloogia ei skaleerunud suuremate segmentide korral kuigi hästi. Intel 80386-ga tuli ka mäluhaldusüksus  ja olemasoleva segmentatsioonikihi alune saalimistugi, mis lubas lehekülje tõrke erindeid teiste erinditega aheldada. Sellegipoolest oli segmentide kirjeldajate laadimine kulukas operatsioon, mistõttu jäid operatsioonisüsteemide loojad tihti saalimise juurde, selmet saalimist ja segmentatsiooni kombineeritult kasutada.

Saalitud virtuaalmälu

Enamasti jagatakse virtuaalne mäluruum lehekülgedeks, mis on tavaliselt vähemalt 4 kB suurused. Lehekülg on järjestikuste virtuaalsete ehk loogiliste mäluaadresside plokk, millest igaühel on vastavusse seatud füüsilised mäluaadressid. Loogilised mäluaadressid on nähtavad ja kasutatavad jooksvatele protsessidele, füüsilised mäluaadressid on mäluseadmele tegelikult nähtavad ja kasutatavad. Seega aitab saalitava virtuaalmälu kasutamine ära hoida ka mälu fragmenteerumist.
Ühe protsessiga seotud mälu lehekülgede kogu nimetatakse töökomplektiks. Sisuliselt on tegu vähima lehekülgede hulgaga, mis peab mingi protsessi edukaks täitmiseks arvuti mälus asuma. Kui kõigi aktiivsete programmide töökomplektide salvestamiseks pole piisavalt mälu, leiab aset pukslemine, mida on kirjeldatud allpool.
Rakendusele nähtavate virtuaalsetele mäluaadressidele vastavate füüsiliste mäluaadresside üle arvepidamiseks on tarvis võimalikult lihtsat ja kiiret meetodit. Aadresside liigi teisendamiseks luuakse lehekülgede tabelid. Aadresside omavahelise ühendamisega tegelevat riistvarakomponenti nimetatakse mäluhaldusüksuseks.
Lisaks tavapärasele 4 kB suurustele lehekülgedele võib esineda ka teistsuguseid suurusi. Pidev füüsilise mälu plokk on 4 kB suurune, seda nimetatakse füüsilise mälu kaadriks ja virtuaalse mälu lehekülje tüüpiline suurus on sellest tuletatud. Samas võib kasutada ka teistsuguseid lehekülgede pikkusi. Väiksemate pikkuste korral tekib mäluruumis vähem sisemist fragmentatsiooni. Suuremate pikkuste korral on mäluruumis vähem lehekülgi ja seega väiksem lehekülgede tabel, esineb vähem lehekülje tõrke erindeid ning lehekülgede kirjutamis- ja lugemisoperatsioonid kulutavad vähem aega.
Mälulehekülgede saalimiseks nimetatakse protsessi, mille käigus teisaldatakse osa virtuaalmälu lehekülgedest kõvakettale ning põhimällu laaditakse vaid hetkel töötavate protsesside poolt kasutatavad leheküljed. Sel moel on võimalik arvutis jooksutada ka protsesse, mis füüsilisse muutmällu ära ei mahuks, kuid mille aktiivsed osad ei vaja nii palju mälu. Sisuliselt on kogu mäluruum laiendatud, ent kasutuses on sellest reaalselt vaid üks osa.
Kuna protsessidel pole ligipääsu füüsilistele mäluaadressidele, peavad need oma operatsioone teostama loogiliste mäluaadresside kaudu. Seetõttu on võimalik virtuaalmälu abil süsteemile lisada turvalisust, kuna iga lehekülje suhtes on võimalik protsessile anda erinevaid lugemis-, kirjutamis- ja käivitusõigusi.

Lehekülgede tabelid

Lehekülgede tabelid on tabelid, milles on omavahel vastavusse seatud rakenduse kasutatavad loogilised mäluaadressid ja mälumooduli poolt tegelikult kasutatavad füüsilised mäluaadressid. Tabeli iga kirje juures on märge, kas vastav lehekülg asub füüsilises mälus või mitte. Kui see on füüsilises mälus, sisaldab lehekülgede tabeli kirje füüsilist mäluaadressi, kuhu see lehekülg salvestatud on. Kui aga riistvara leheküljele viitamisel ilmneb, et seda hetkel ühegi aadressiga füüsilises mälus vastavusse pole seatud, viskab riistvara lehekülje tõrke erindi, mis käivitab operatsioonisüsteemi saalimise kontrollsüsteemi. Loogiliste ja füüsiliste aadresside omavahelise seostamisega tegelevat riistvara nimetatakse mäluhaldusüksuseks.
Lehekülgede tabelite teostamiseks on kasutusel mitu võimalust. Terve süsteem võib näiteks kasutada vaid üht lehekülgede tabelit, mille puhul kasutavad erinevad samaaegselt jooksutatavad rakendused virtuaalmälu ulatuse erinevaid osasid. Igale rakendusele võib vastata aga ka eraldi oma lehekülgede tabel ja segment, millisel puhul on olemas mitmed eraldi virtuaalsed aadressiruumid ja rakendused, millel on eraldi lehekülgede tabelid, viitavad erinevatele füüsilistele mäluaadressidele. Moodustada võib ka keerulisemaid lehekülgede tabelite ja segmentide vahelisi süsteeme, ent lõppkokkuvõttes jääb põhimõte samaks.

Saalimise kontrollsüsteem

Et süsteem saaks kasutada rohkem operatiivmälu, kui arvutil tegelikult füüsiliselt olemas on, tuleb aeg-ajalt teha saalimisoperatsioone virtuaalmälu ja füüsilise mälu vahel. Operatsioonisüsteem peab arvestust selle üle, millised leheküljed on parasjagu kasutuses ja milliseid enam ei kasutata või millised pole mingi pikema ajavahemiku vältel enam üldse kasutuses olnud. Kui ilmneb tarvidus mõne uue lehekülje kasutamiseks, ent füüsilisele mälule viitavad lehekülgede tabelid on täis, asendatakse tarbetud leheküljed füüsilises mälus lehekülgede tabeli abil ning leheküljed, mida enam ei kasutata, suunatakse varuks virtuaalmällu. Kui seejärel mõni protsess nõuab lehekülge, mis füüsilisest mälust eemaldati, tekib lehekülje rikke erind (ka leheküljepöördusviga) ja käivitatakse saalimise kontrollsüsteem.
Saalimise kontrollsüsteemi käivitamisel tehakse kindlaks, kas lehekülje rikke erindi tekkimisel soovitud loogilise mäluaadressiga lehekülg on üldse olemas. Lehekülje olemasolu korral eraldatakse sellele vaba mäluruum, tõstetakse lehekülg tagasi füüsilisse mällu ning käivitatakse lehekülje rikke erindi põhjustanud käsk uuesti, et vältida võimalikke süsteemi tõrkeid. Kui kõigi aktiivsete programmide töökomplektide salvestamiseks pole piisavalt vabastatavat mälu, võib tekkida pukslemiseks nimetatav olukord.

Pukslemine

Pukslemine (thrashing) on olukord, mille vältel tegeleb arvuti põhiliselt mälulehekülgede saalimisega ja teiste protsesside töötlemine jääb tagaplaanile. Olukord võib tekkida, kui kõiki aktiivsete programmide töökomplektide salvestamiseks pole füüsilises mälus piisavalt ruumi. Olukord seisneb lehekülgede pidevas edasi-tagasi saalimises ja vanade lehekülgede üha uuesti välja vahetamises.
Kõige lihtsam lahendus mälupuudusele on arvutile füüsilise mälu lisamine, kuna see võimaldab töötavate protsesside töökomplektide kogumahu suurendamist. Abiks võib olla ka kasutatavate rakenduste arhitektuuri, ressursijaotuse ja mälukasutuse ülevaatamine ja ümberkujundamine. Samas on võimalus vähendada aktiivsete protsesside arvu, mis vähendaks nõudlust füüsilise mälu järele.