Erinevus lehekülje "Virtuaalmälu" redaktsioonide vahel
(Uus lehekülg: '===Sissejuhatus=== Arvuti käivitab programme, käivitades instruktsioome RAMis. Ta käivitub instruktsiooni ühel aadressil ja siis liigub järgmise aadressini. Ta suudab samut...') |
(Erinevus puudub)
|
Redaktsioon: 23. märts 2018, kell 16:07
Sisukord
Sissejuhatus
Arvuti käivitab programme, käivitades instruktsioome RAMis. Ta käivitub instruktsiooni ühel aadressil ja siis liigub järgmise aadressini. Ta suudab samuti hüpata ühelt aadressilt üle teisele (ehk siis loops). Vanadel 8-bitistel arvutitel või tänapäevastes mikrokontrollerites kasutatakse kogu RAMi otse ja seal puudub igasugune peemptive multitasking mis lubab käivitada mitmel programmil korraga. Iga aadress on unikaalne ja viitab kindlale füüsikalisele aadressile.
Virtuaalmälu lubab igal protsessil omada omaenda aadressiruumi ja need pole unikaalsed. Näiteks aadress 4095 täendavad erinevatele programmidele hoopis erinevat instruktsiooni. Muidugi peavad ka need aadressid olema kusagil füüsikalises RAMis mistõttu virtuaalmälu mapib virtuaalaadressid füüsikalisteks
Aga kuidas see töötab? Kujutame ette kahte programmi ja kumbki neist kasutab 5MB RAMi. Programm üks asub füüsikalises mälus aadresisl 5242880 ja läheb 5MB-ni välja. Programm kaks algab 10485760 ja teeb sama. Kui esimene protsess tahab kasutada aadressi 0 ühendab arvuti aadressi 0 aadressile 5242880. Kui ta tahab kasutada aadressi 1 siis 5242881 jne.
See maping või ühendamine tehakse ära otse rauas spetsiaalse komponendi poolt nimega memory management unit MMU.
Boonusteks selle süsteemi puhul on kolm asja:
1. Rakendusele pole oluline kus ta füüsilises ramis asub 2. Rakendus pääseb liigi vaid oma aadressiruumile ja ei saa teisi tarkvarasid segada 3. App ei pea asetsema ramis järjestiku ning katkematuna. Ehk selle võib jagada mitmeteks tükkideks, mis puistatud mööda rami laiali.
Näiteks saame jagada 2 programmi mällu hoopis järgnevalt:
Hoolimata sellest, et esimene programm on jaotatud kahte blokki, on MMUs talle tehtud mapig järjestikuna ja katkenmatu. Seda, kuidas MMU mapib virtuaalseid aadresse füüsikalisteks valib ja haldab operatsioonisüsteemi kernel.
Page tabelid
Selleks, et neid ühendusi teha vajab MMU tabelit, kus igal real on virtuaalne aadress (VA) ja füüsiline aadress (PA)
Probleem sellise üks-ühele mapigu tabeliga on näiteks selles, et kui programm vajab 300MB mahtu siis tuleb MMU tabelisse kanda 79 miljonit rida.
Selliste olukordade vältimiseks ja MMU tabeli väikseks hoidmiseks jagatakse mälu lehtedeks (pages). Kindlaksmääratud suurusega blokkideks, mis igale programmile kasutada antud. Tüüpiline lehe suurus on 4K ehk 4096 baiti. See tähendab, et 300MB vajab nüüd vaid 76 800 kirjet. Iga kirje sisaldab 4 baiti seega on tabel 300KB suurune ja märksa hallatavam. Iga page on laaditud mäluasukohta nimega page frames.
Swapping
Demand paging teeb võimalikuks, et vaid osa programmi on korraga mällu laetud. Selle saavutamiseks kasutatakse swappingut.
Lisaks VMi ja PMi vahelisele mapingule sisaldab page tabel selleks veel sellist infot nagu validbit.
Kui validbit on ok siis on info põhimälus. Kui mitte siis on andmed kõvakettal ja nende poole pöördumisel kutsutakse välja page fault, kuna andmed on puudu ja need tuleb lugeda kõvakettalt. Programm ootab, kuni andmed on kätte saadud. Niikaua kuni programm ootab, võtab operatsioonisüsteem korraks töö üle, et andmed kohale kirjutada. Seda nimetatakse context switchiks.
Lingid
https://et.wikipedia.org/wiki/Virtuaalm%C3%A4lu
https://www.androidauthority.com/what-is-virtual-memory-gary-explains-747960/