Memoria virtuală — definiție, funcționare și paginare
Memoria virtuală este o tehnică de gestionare a memoriei care permite sistemelor de calcul să ofere aplicaţiilor un spaţiu de adrese contigu şi suficient de mare, indiferent de dimensiunea fizică a memoriei RAM. Aceasta reprezintă o componentă esenţială a multor sisteme moderne și o tendință majoră în tehnologiei folosite în calculatoare. Hardware-ul (partea fizică a computerului) rulează software-ul, iar acest software folosește memoria calculatorului pentru a stoca cod, date și structuri temporare. Majoritatea calculatoarelor personale și serverelor rulează simultan mai multe aplicații — fenomen numit multiprocesare — iar memoria virtuală face posibilă partajarea eficientă și sigură a resurselor de memorie între procese.
Definiție și scop
Principiul de bază al memoriei virtuale este că fiecare aplicație „vede” un spațiu de adrese liniar, ca și cum ar avea la dispoziție un bloc mare de memorie continuă. Acest spațiu este virtual pentru că repartiția fizică a datelor poate fi fragmentată: o parte poate sta în memoria principală (RAM), alta pe disc (în fișierul de swap sau în partiție de swap), iar unele zone pot fi generate la nevoie. Acest mecanism oferă:
- izolare între procese (un proces nu poate citi/viola memorie unui alt proces fără permisiuni);
- abstracție pentru programator (nu trebuie gestionată memoria fizică în detaliu);
- utilizare mai eficientă a RAM-ului prin păstrarea în memorie doar a datelor active;
- posibilitatea de a rula programe mai mari decât memoria fizică disponibilă.
Cum funcționează — traducerea adreselor
Când un program accesează o adresă virtuală, aceasta trebuie tradusă în adresa fizică corespunzătoare din RAM. Traducerea este realizată de o componentă hardware numită unitate de gestionare a memoriei (MMU) împreună cu sistemele de operare, care construiesc şi mențin tabelele de pagini. MMU folosește aceste tabele pentru a converti rapid adresele virtuale în adrese fizice. Pentru a accelera procesul, există o memorie cache specială, TLB (Translation Lookaside Buffer), care păstrează intrările de traducere cele mai des folosite.
Memoria virtuală împarte adresele în unități numite pagini (de obicei 4 KiB, dar pot fi și 2 MiB sau 1 GiB, în funcție de arhitectură). RAM-ul este împărțit în cadre (frames) de aceeași dimensiune. Tabelul de pagini leagă fiecare pagină virtuală de un cadru fizic sau marchează faptul că pagina nu se află în RAM (în acest caz ea este „valabilă” pe disc).
Paginare și gestionarea încărcării (page fault)
Când un program accesează o pagină virtuală care nu se găsește în memoria fizică, se produce un eveniment numit page fault (întrerupere de pagină). Sistemul de operare gestionează această situație astfel:
- se oprește execuția instrucțiunii curente;
- se caută în fișierul de swap sau în spațiul de backing store pagina cerută;
- dacă memoria este plină, se alege o pagină victimă din RAM care poate fi scrisă pe disc (dacă e modificată);
- se încarcă pagina necesară în cadrul eliberat și se actualizează tabela de pagini;
- se reia execuția programului de la instrucțiunea întreruptă.
Încărcarea unei pagini de pe disc este mult mai lentă decât citirea din RAM, astfel încât page fault-urile frecvente pot degrada semnificativ performanța (fenomen numit thrashing).
Algoritmi de înlocuire a paginilor
Sistemele de operare folosesc algoritmi pentru a decide ce pagină din RAM să fie înlocuită atunci când e nevoie de spațiu. Câțiva algoritmi uzuali:
- FIFO (First-In, First-Out) — înlocuiește pagina introduse prima în memorie;
- LRU (Least Recently Used) — elimină pagina neutilizată de cel mai mult timp (foarte eficient dar mai complex de implementat);
- Clock (variantă eficientă a LRU) — folosește un bit de utilizare și o „roată” pentru a găsi victimă;
- Algoritm hibrid sau politici specifice pentru cache-uri de pagină și tipuri de aplicații.
Structuri de date asociate
Tabelele de pagini pot fi organizate ca tabele simple sau ierarhice (de exemplu, tabele multi-nivel) pentru a economisi memorie la adrese mari. Alte mecanisme: pagini de dimensiuni mari (huge pages) pentru a reduce overheadul de traducere și paginare, paginare la cerere (demand paging), și copy-on-write, care permite partajarea memoriei până când un proces modifică conținutul.
Adevărate avantaje
- izolare și securitate între procese;
- suport pentru execuția de programe mai mari decât memoria fizică;
- utilizare mai eficientă a memoriei prin păstrarea în RAM doar a datelor active;
- posibilitatea de a map-a fișiere direct în spațiul de adrese (memory-mapped files), facilitând I/O eficient;
- simplitate pentru programatori: adresare logică independentă de memoria fizică.
Limitări și dezavantaje
Memoria virtuală nu este gratuită. Dezavantajele includ:
- suprataxă de performanţă la page fault-uri (încărcarea de pe disc este lentă);
- necesitatea de memorie suplimentară pentru tabelele de pagini și TLB;
- complexitate crescută a sistemului de operare și a hardware-ului (MMU, protecții);
- posibilă degradare severă a performanței prin thrashing dacă există prea multe page fault-uri.
De ce unele sisteme integrate nu folosesc memoria virtuală
Anumite sisteme informatice, cum ar fi sistemele integrate sau sistemele real-time, nu utilizează memoria virtuală deoarece au nevoie de un timp de răspuns foarte predictibil și constant. În memoria virtuală, timpul de acces poate varia semnificativ: accesul la o pagină prezentă în RAM este rapid, în timp ce accesul la o pagină care trebuie adusă de pe disc este mult mai lent. Această fluctuație face dificilă garantarea unor întârzieri maxime stricte, esențiale în aplicații critice (control industrial, automobile, echipamente medicale). Din acest motiv, multe sisteme integrate folosesc o gestionare statică a memoriei sau mecanisme dedicate de protecție și partajare, fără paginare.
Sinteză
Memoria virtuală este o abstracție puternică care oferă izolare, flexibilitate și eficienţă în utilizarea memoriei într-un sistem de calcul. Ea combină funcționalități hardware (MMU, TLB) și software (sistemele de operare, tabele de pagină, algoritmi de înlocuire) pentru a face posibilă execuția eficientă a multor programe simultan. Cu toate acestea, pentru aplicaţii cu cerinţe stricte de latenţă sau în medii cu resurse foarte limitate, utilizarea memoriei virtuale poate fi necorespunzătoare.

Programul crede că are o gamă largă de adrese contigue, dar în realitate părțile pe care le folosește în prezent sunt împrăștiate în memoria principală, iar părțile inactive sunt salvate într-un fișier pe disc.
Întrebări și răspunsuri
Î: Ce este memoria virtuală?
R: Memoria virtuală este o modalitate de gestionare a memoriei calculatorului care permite aplicațiilor să acceseze un bloc de memorie de o anumită dimensiune. Acest bloc de memorie poate proveni din diferite părți, cum ar fi memoria principală sau discul.
Î: Cum funcționează memoria virtuală?
R: Memoria virtuală funcționează permițând unității logice aritmetice a procesorului să efectueze traduceri între resursele aplicației și cele ale sistemului. Sistemele de operare moderne fac, de asemenea, o parte din această muncă. Atunci când o aplicație încearcă să acceseze un bloc de memorie care nu se află în memoria de sistem, aceasta va fi oprită, iar blocul va fi încărcat în memoria de sistem.
Î: Care sunt câteva exemple de computere care nu utilizează memoria virtuală?
R: Sistemele încorporate sunt un exemplu de calculatoare care nu utilizează memoria virtuală deoarece au nevoie de timpi de răspuns rapizi sau de timpi de răspuns care să rămână mereu aceiași. Este dificil de prezis timpul de răspuns cu memoria virtuală, astfel încât aceasta nu este utilizată în sistemele integrate.
Î: Ce este multiprocesarea?
R: Multiprocesarea este atunci când un computer poate face mai mult de un lucru în același timp, rulând mai multe aplicații simultan care îi împart resursele.
Î: Ce se întâmplă atunci când o aplicație încearcă să acceseze un bloc de memorie care nu se află în memoria sistemului?
R: Atunci când o aplicație încearcă să acceseze un bloc de memorie care nu se află în memoria de sistem, aceasta va fi oprită, iar blocul va fi încărcat în memoria de sistem.
Î: Ce este paginarea?
R: Paginarea se referă la ceea ce se întâmplă atunci când ceea ce se afla în acea parte a memoriei de sistem trebuie să fie scris înapoi pe disc din cauza faptului că o aplicație accesează o altă parte care nu era stocată acolo inițial.