|
Dupa cum am vazut la prezentarea arhitecturii von Neumann, memoria constituie unul din elementele de baza ale structurii unui sistem de calcul, rolul sau fiind acela de a retine in primul rand programul si datele care se prelucreaza. La inceput, calculatoarele dispuneau de putina memorie si era nevoie de multa inventivitate din partea programatorilor pentru ca aceasta sa ajunga pentru programe, care tindeau sa devina tot mai lungi. Odata ce tehnologia a oferit posibilitatea ca memoria sa poata fi obtinuta la un pret acceptabil, ea s-a diversificat incontinuu, aparand mai multe tipuri de memorie intr-un calculator, fiecare din acestea avand locul si rolul sau bine stabilit. Tehnologic exista doua tipuri principale de memorie:
- memorie RAM
- memorie ROM
A. Memoria RAM
Numele acesteia provine de la denumirea ei in engleza: Random Access Memory. Informatia care se gaseste stocata in ea la diferite adrese (instructiuni sau date) poate fi citita sau inscrisa cu o noua valoare. Se spune ca suporta atat operatii de citire (read), cat si operatii de scriere (write). Informatia elementara care se memoreaza este o informatie binara, putand deci lua valoarea 0 sau 1, iar circuitul fizic elementar care poate memora aceasta informatie se numeste bistabil (are doua stari stabile: 0 sau 1).
O prima forma de implementare fizica este memoria RAM de tip static sau SRAM (Static RAM), numita astfel deoarece informatia odata inscrisa se pastreaza nealterata pana eventual la oprirea calculatorului, cand se pierde. Bistabilii de tip SRAM sunt alcatuiti din doi tranzistori.
Folosind o tehnologie diferita, s-a reusit ca pentru o celula de memorie sa se foloseasca un singur tranzistor (deci densitatea de informatie memorata va fi dubla fata de cea anterioara), obtinandu-se un tip de memorie numit dinamic sau DRAM (Dynamic RAM). Acesti tranzistori pot sa-si piarda sarcina electrica pe care o inmagazineaza (deci informatia memorata in ultima instanta) si atunci este nevoie de o operatie de reimprospatare periodica (refresh), care se realizeaza cu ajutorul unor circuite concepute in acest scop (in general la fiecare 2 ms). Memoria de tip DRAM este considerabil mai lenta decat cea SRAM, dar are o densitate de integrare mai mare (acelasi numar de celule de memorie ocupa mai putin spatiu) si este mai ieftina, motiv pentru care este folosita pe scara larga in sistemele de calcul.
Blocurile de memorie RAM au in general o organizare matriceala. Daca la inceput aveau forma unor circuite integrate distincte, o data cu evolutia tehnologiei aceste cipuri au fost plasate pe placute de memorie cu 30, 72, 162 picioare, iar capacitatea lor a crescut in timp de la 256Ko, 1Mo, 2Mo, pana la 256Mo, 512Mo sau 1Go si chiar mai mult.
B. Memoria ROM
Aceasta memorie nu suporta decat citirea datelor din ea (ROM = Read Only Memory - memorie numai pentru citire). La fel ca si in cazul memoriei RAM, capacitatea ei a crescut o data cu evolutia tehnologiei, de la circuite de 1Ko sau 2Ko la 64Ko, 128Ko etc.
Initial, informatia era inscrisa intr-un modul ROM la fabricarea acestuia si nu mai putea fi schimbata. Avansul tehnologiei a permis realizarea unor circuite in care informatia se poate sterge si rescrie (desigur, nu de catre procesor, ci cu ajutorul unor dispozitive dedicate, care nu se gasesc in calculator). Spunem ca aceste circuite sunt de tip ROM programabil sau PROM.
Cel mai des folosite sunt circuitele EPROM, la care scrierea informatiei se realizeaza pe cale electrica. Daca stergerea se face cu lumina ultravioleta printr-o fereastra de cuart plasata deasupra cipului, avem circuite de tip UVEPROM. Daca stergerea se face electric, avem EEPROM. O varianta mai noua a tehnologiei EEPROM este memoria de tip Flash, care este larg utilizata in diverse dispozitive de stocare. Un mare avantaj al acesteia din urma il reprezinta posibilitatea de a sterge sau inscrie doar o parte a informatiei memorate.
Numarul de stergeri si reinscrieri care pot fi aplicate asupra unui asemenea circuit, indiferent de tehnologia folosita, este limitat (in majoritatea cazurilor in jurul a 50-100). Exceptie face memoria Flash, care permite pana la 100000 de stergeri si reinscrieri. Oricum, limitarea nu este deranjanta, deoarece memoria ROM se foloseste in calculator pentru memorarea programelor BIOS. Operatia de actualizare a BIOS-ului poate fi necesara in unele situatii, dar foarte rar; dincolo de acest caz particular, este chiar de dorit ca BIOS-ul sa nu poata fi modificat de programe.
Una din cele mai importante interfete dintre utilizator si calculator o constituie monitorul. Daca la inceput ecranul putea afisa numai caractere si doar in mod monocrom, o data cu dezvoltarea tehnologiei si sistemul video care asigura afisarea a trecut prin transformari majore, fiind capabil ca pe langa caractere sa apara si grafice, eventual in culori. De altfel, majoritatea sistemelor de operare actuale fac din aceasta interfata grafica modul principal de existenta.
Elementele principale ale sistemului de afisare sunt echipamentul de afisare (monitorul), adaptorul (controlerul) video si memoria video.
Putem sa definim ca memorie video zona de memorie accesata simultan de procesor si de controlerul video, care la iesire este capabila sa produca o secventa seriala sincrona de informatii capabile sa comande un dispozitiv de tip CRT sau LCD.
Aceasta memorie poate fi vazuta intr-o prima aproximatie ca un registru urias de deplasare ce contine in el imaginea. Un punct de pe ecran se numeste pixel. Acest punct poate avea anumite caracteristici (atribute) cum ar fi culoarea, stralucirea etc.
Imaginea care trebuie afisata este stocata intr-un ecran virtual din memoria video. Controlerul video genereaza o imagine miscand fascicolul de electroni de la stanga la dreapta si de sus in jos pe ecran, similar cu cititul unei pagini. La sfarsitul unei linii orizontale fascicolul este stins si mutat la inceputul liniei urmatoare, baleind linia, s.a.m.d. Aceasta baleiere poarta numele de rastru.
Prentru fiecare pozitie a unui pixel din rastru, datele de afisat sunt citite din ecranul virtual aflat in memoria video. Aceste date sunt aplicate la intrarile unor circuite DAC (Digital-Analog Convertor), care le convertesc in nivele de tensiune pentru cele trei culori primare RGB (Red, Green, Blue) folosite in televiziunea color. Dupa terminarea unui cadru, fascicolul se intoarce in stanga sus si incepe un nou cadru s.a.m.d. Un astfel de tip de afisaj se mai numeste si afisaj APA (All Points Addressable).
Pentru ca imaginea sa nu aiba efect de palpaire, care poate fi deranjant si chiar vatamator pentru ochi, se impune ca frecventa de reimprospatare a ecranului (numarul de cadre pe secunda) sa fie mai mare de 70 Hz.
Au existat mai multe tipuri de controlere video:
- MDA (Monochrome Dispozitiv Adaptor), construit de IBM in 1981, o data cu primul PC. Nu avea posibilitati grafice, putand afisa numai caractere ASCII standard.
- Hercules, care a rezolvat problema imbinarii textului cu grafica pe acelasi ecran. Placa monocroma HGC (Hercules Graphic Card) putea afisa 720 348 puncte monocolor pe ecran.
- CGA (Color Graphic Adaptor), produs de IBM, care putea ajunge la 640 200 puncte cu 16 culori.
- EGA (Enhanced Graphic Adaptor), cu rezolutie de 640 350 puncte.
- VGA (Video Graphic Array), cu 640 480 puncte si 256 culori.
- SVGA (Super Video Graphic Array), cu 1024 768 puncte afisabile.
Toate placile dintr-o serie pot in general lucra cu programe scrise pentru seriile anterioare. Mai sus am prezentat caracteristicile modului de functionare grafic al acestor placi, dar exista si un mod de functionare caracter. In acest mod se considera ca memoria contine coduri de caractere ASCII si nu puncte direct afisabile, iar un circuit special numit generator de caractere livreaza pixeli din codul ASCII citit.
Vom mai reveni la placa de tip APA, insistand putin si asupra afisajului de culoare al punctelor. Un monitor color poate afisa peste 16 milioane de culori, dar adaptorul video limiteaza aceasta cifra. Daca utilizam pentru fiecare pixel cate un octet pentru a memora caracteristicile sale de culoare, putem avea 256 (28) culori. Daca extindem memoria folosita pentru un pixel la 2 octeti, atunci sunt posibile 65536 de culori, iar daca pentru fiecare culoare fundamentala (RGB) se rezerva un octet (deci 3 octeti pe pixel) depasim 16 milioane.
In terminologia calculatoarelor, modul de afisare cu 1 octet rezervat pentru un pixel se numeste pseudo-color, cu 2 octeti high color, iar cu 3 octeti true color.
Pentru ca din informatia numerica sa se obtina un nivel de tensiune analogic corespunzator, in adaptoarele video se utilizeaza convertoarele numeric-analogice (DAC). Acestea sunt de obicei pe 8 biti si cate unul pentru fiecare culoare fundamentala. Deci am fi in stare sa afisam peste 16 milioane de culori, dar de obicei informatia de culoare pentru aplicatii grafice nepretentioase este cuprinsa pe un octet - deci numai 256 culori la un moment dat din cele 16 milioane posibile. Cele 256 culori alese pentru afisare din domeniul de 16 milioane formeaza asa-numita paleta de culori, iar conversia de la 8 biti la 24 biti se face in adaptorul video printr-o memorie numita CLUT (Color Look-Up Table - tabel de selectie a culorii). Valoarea pe 8 biti a octetului este considerata o adresa in tabela CLUT, care va seleca cuvantul de 3 octeti corespunzator ce va genera culoarea. Daca se doreste schimbarea paletei, se vor memora alte valori in tabela CLUT pentru aceeasi adresa.
In final, trebuie sa amintim ca placile grafice actuale pot avea o memorie video mai mare decat cea alocata in harta memoriei, dar numai o singura pagina se afiseaza la un moment dat. Pagina afisata este selectata cu un registru intern. De asemenea, placile cu accelerare video, care domina actualmente piata, sunt folosite atat pentru grafica in 2 dimensiuni (2D), cat si pentru cea in 3 dimensiuni (3D). Controlerele video au integrate unitati cu instructiuni grafice speciale pentru prelucrarea si sinteza imaginilor, in timp ce procesorului ii revine numai sarcina de a apela aceste functii integrate in controler. Castigul de viteza este impresionant, deoarece aceste circuite specializate realizeaza prelucrarile grafice mult mai rapid decat o poate face procesorul; in plus, sunt eliminate intarzierile legate de comunicarea intre procesor si controlerul video.
Placile video pot folosi o parte din memoria sistemului sau pot fi dotate cu memorie proprie, care ajunge in unele cazuri pana la 256 Mo. Daca tinem cont de faptul ca sunt rare calculatoarele care au 1 Go de memorie principala, este evident cat de mare este necesarul de memorie al unor aplicatii (in special jocuri). Placile fara memorie proprie sunt mai ieftine, dar diferenta de performanta este mai mult decat semnificativa. Totusi, este bine de retinut ca nici macar aceste cantitati impresionante de memorie proprie nu sunt suficiente pentru unele aplicatii, astfel incat pana si placile cele mai avansate folosesc si o parte din memoria sistemului.
Microprocesorul 80386 a fost primul care a depasit viteza memoriei RAM. Cu alte cuvinte, daca pana atunci circuitele de memorie puteau servi cererile procesorului cu o viteza mai mare decat putea acesta sa formuleze cererile de acces, incepand cu 80386 situatia s-a inversat: microprocesorul putea executa instructiunile mai rapid decat putea memoria sa-i furnizeze datele ceute. Astfel, procesorul trebuia efectiv sa astepte sosirea datelor din memorie, neputand trece mai departe. Decalajul s-a adancit in timp, astfel incat un microprocesor din zilele noastre este de peste 10 ori mai rapid decat memoria. Urmarea imediata este o penalizare majora de perfomanta, deoarece procesorul nu-si poate folosi integral capacitatea de calcul si este chiar foarte departe de aceasta situatie. Intr-adevar, un microprocesor care functioneaza la nici o zecime din viteza sa nu este foarte util.
Totusi, lucrurile nu stau in intregime astfel. Tehnologia actuala permite realizarea unor circuite de memorie mai rapide, care pot face inca fata cerintelor impuse de procesoare. Reamintim ca, in afara de circuitele DRAM, utilizate in sistemele de calcul, exista si memoriile de tip SRAM, care sunt mult mai rapide. De fapt, tehnologia utilizata la fabricarea circuitelor SRAM este in mare masura aceeasi care se foloseste si pentru procesoare. Din pacate, tehnologia SRAM are doua mari dezavantaje: o densitate de integrare redusa (ceea ce inseamna circuite de dimensiuni mari) si un pret prea ridicat, care o face nerentabila.
Desi circuitele SRAM nu pot fi folosite in locul celor DRAM din motivele aratate, avem posibilitatea de a le utiliza pe scara mai mica, obtinand totusi o crestere de performanta notabila. Se porneste de la doua legi determinate empiric, dar a caror valabilitate este permanent confirmata de practica, si anume principiile (legile) localitatii:
- localitate temporala: daca o locatie de memorie este accesata la un moment dat, este probabil ca va fi accesata din nou in viitorul apropiat
- localitate spatiala: daca la un moment dat este accesata o locatie de memorie, este probabil ca in viitorul apropiat vor fi accesate locatiile din apropierea sa
Facem observatia ca principiile localitatii se aplica atat pentru accesul la date (o variabila este de obicei accesata de mai multe ori in instructiuni consecutive, tablourile sunt de obicei parcurse secvential), cat si in ceea ce priveste instructiunile executate (programele constand in principal din bucle). S-a ajuns astfel la ideea de a retine continutul ultimelor locatii accesate intr-un circuit de memorie separat, foarte mic, numit memorie intermediara sau cache; atunci cand se realizeaza un acces la memorie, mai intai se cauta locatia respectiva in cache si abia apoi, daca este cazul, in memoria principala.
Datorita dimensiunii sale reduse, este posibil ca memoria cache sa fie de tip SRAM, fara a afecta in mod semnificativ pretul total. In acest fel, viteza cache-ului este mult mai mare decat a memoriei principale.
Se observa ca microprocesorul si calculatorul pot functiona si in absenta cache-ului. Folosirea memoriei cache nu aduce nimic in plus din punct de vedere al functionalitatii, ci doar un spor de performanta.
Pentru a da o exprimare cantitativa principiilor localitatii, vom prezenta mai intai terminologia folosita. Atunci cand microprocesorul face un acces la memorie, cauta mai intai daca nu cumva adresa dorita se gaseste in memoria cache. Daca gaseste informatia, nu se mai face apel la memoria RAM si se trece mai departe. Spunem in acest caz ca s-a realizat un 'hit'. Daca informatia nu exista in cache, se face un apel la memoria principala (am avut un rateu - 'miss').
Introducem o marime numita rata de succes a cache-ului (hit ratio), notata H. Aceasta exprima procentajul (din numarul total de accese la memorie efectuate in unitatea de timp) de cazuri in care informatia cautata a fost gasita in cache. Evident, valoarea H nu este o constanta, ci se determina prin masuratori in cazuri practice si depinde de comportarea programelor care se executa. Similar se defineste rata de insucces M (miss ratio); cele doua marimi se afla in relatia:
M = 1 - H
Notam cu Tc timpul de acces la cache (altfel spus, timpul total de acces in cazul cand valoarea cautata se afla in cache) si cu Tm timpul necesar pentru a accesa locatia cautata in cazul in care aceasta nu se afla in cache. Cu aceste notatii, timpul mediu de acces la memorie este:
T = Tc H + Tm M
Utilizarea cache-ului este eficienta daca acest timp mediu este mai mic decat timpul de acces la memoria principala in cazul in care nu exista memorie cache (pe care il notam Tp). Trebuie observat ca, in cazul in care locatia cautata nu se afla in cache, se fac in total doua accese: intai la cache (acces esuat), apoi la memoria principala. Astfel, Tm este mai mare decat Tp. In aceste conditii, este posibil ca T > Tp, ceea ce ar insemna ca de fapt cache-ul sa franeze accesul la memorie, in loc de a-l accelera. In practica insa acest risc nu exista. Deoarece in general Tc este mult mai mic decat Tp, Tm este doar putin mai mare decat Tp, iar H 90%, castigul de viteza adus de cache este in general considerabil.
Pentru exemplificare, consideram un sistem cu urmatoarele caracteristici: H = 90%, Tc = 2ns, Tm = 21 ns, Tp = 20 ns. Aplicand formula de mai sus obtinem:
T = Tc H + Tm M = 2ns 90% + 21ns 10% = 1,8ns + 2,1ns = 3,9ns T Tp / Tc 5,13
Timpul mediu de acces la memorie este deci de peste 5 ori mai mic decat in cazul in care nu ar fi existat cache in sistem. In realitate situatia este si mai favorabila deoarece, daca relatiile intre diferitii timpi de acces sunt aproximativ aceleasi ca in exemplul de mai sus, rata de succes a cache-ului ajunge adesea pana la 98% si chiar mai mult.
Sa intram putin in detaliile proiectarii unui cache. In primul rand, atunci cand o locatie din memoria principala este ceruta de procesor si nu exista deja in cache, este adusa. Desi procesorul nu are nevoie pe moment decat de locatia respectiva, in cache este adus un bloc de date de dimensiune mai mare (uzual 16, 32 sau 64 octeti), format din locatii aflate la adrese consecutive in memoria principala, in jurul locatiei solicitate de procesor. Un asemenea bloc memorat in cache poarta denumirea de linie de cache. Motivul pentru care se procedeaza astfel este evident: in acest mod se tine cont si de localitatea spatiala, nu doar de cea temporala.
In cache se pot afla simultan date care in memoria principala se gasesc la adrese complet diferite. Din acest motiv, este necesar ca in cache sa fie retinute nu doar valorile locatiilor, ci si adresele la care acestea se afla in memoria principala. Acest aspect este esential, deoarece cautarea datelor in cache nu se face ca intr-o memorie obisnuita, ci dupa adresele ocupate in memoria principala. Modul in care sunt memorate aceste adrese are o influenta foarte puternica asupra vitezei de regasire a datelor cautate, deci a timpului de acces la cache.
Strans legata de problema de mai sus este politica de inlocuire. Datorita capacitatii incomparabil a cache-ului fata de memoria principala, in mod inevitabil se ajunge la ocuparea totala a cache-ului. Atunci cand un nou bloc de date trebuie adus in cache, va trebui deci eliminat un bloc deja existent. Alegerea blocului care va fi inlocuit este o problema dificila, deoarece trebuie evitata inlocuirea unui bloc de care ar putea fi nevoie in viitorul apropiat, altfel performanta globala este afectata.
Exista in prezent trei tipuri principale de cache, diferentiate prin metoda de memorare a adreselor din memoria principala:
a. Cache cu adresare directa (direct mapped cache)
In acest caz exista o relatie directa intre adresa din memoria principala unde se afla o valoare si adresa din cache in care aceasta este memorata. Mai exact, bitii cei mai putin semnificativi ai adresei din memoria principala formeaza adresa din cache.
Ca un exemplu concret, consideram un sistem al carui procesor lucreaza cu adrese (in memoria principala) de 32 biti, iar cache-ul are o capacitate de 2048 linii, fiecare linie avand 32 octeti. Se observa ca atat numarul de linii, cat si dimensiunea unei linii de cache sunt puteri ale lui 2, ceea ce usureaza operatiile executate de catre hardware. O adresa de 32 biti din memoria principala este impartita in 3 componente:
- cei mai semnificativi 16 biti formeaza o eticheta, care este memorata ca atare in cache, impreuna cu datele propriu-zise aduse din memoria principala
- urmatorii 11 biti indica adresa liniei din cache care memoreaza datele, din cele 2048 linii existente
- ultimii 5 biti identifica octetul in cadrul liniei de cache
Se observa ca o anumita adresa din memoria principala poate fi memorata intr-o singura adresa din cache.
Continutul unei linii de cache este urmatorul:
- un bit care indica daca linia contine date valide
- campul eticheta, descris mai sus
- datele propriu-zise aduse din memoria principala
Datorita modului de calcul, linia cu adresa N din cache poate memora date provenite de la orice adresa din memoria principala ai carei biti de pe pozitiile 5-15 formeaza valoarea N. Din acest motiv, pentru a putea determina in orice moment adresa corespunzatoare din memoria principala, in linia respectiva este memorat si campul eticheta.
Cache-ul cu adresare directa permite un acces extrem de rapid, deoarece conversia intre cele doua tipuri de adrese (din memoria principala si din cache) este foarte simpla si poate fi implementata direct in hardware. In schimb, algoritmul are dezavantajul lipsei de flexibilitate. Pentru exemplul de mai sus, daca un program acceseaza foarte des mai multe variabile aflate in memoria principala la adrese care difera printr-un multiplu de 65536 (avand deci ultimii 16 biti identici), aceste variabile vor fi memorate la aceeasi adresa in cache; ca rezultat, se vor inregistra multe ratari in cache, ceea ce implica multe accese la memoria principala, deci scaderea vitezei.
b. Cache asociativ (fully associative cache)
Se bazeaza pe utilizarea unor circuite hardware speciale, numite memorii asociative. Spre deosebire de memoria obisnuita, care permite doar citirea sau scrierea unei valori intr-o locatie identificata prin adresa sa, memoria asociativa permite in plus regasirea unei locatii dupa continutul sau.
IIntr-un cache asociativ, fiecare linie retine, pe langa datele propriu-zise, adresa de inceput a acestora in memoria principala. Regasirea se va face pe baza acestei adrese. Intrucat memoriile asociative sunt relativ lente, accesul la cache este mai putin rapid decat in cazul cache-ului cu adresare directa. Pe de alta parte, avantajul este ca o locatie din memoria principala poate fi memorata la orice adresa din cache, eliminandu-se problemele de genul celei prezentate mai sus.
c. Cache partial asociativ (set-associative cache)
In ciuda numelui sau, este mai apropiat ca structura de cache-ul cu adresare directa. Principalul dezavantaj al acestuia, asa cum s-a vazut, il constituie faptul ca mai multe adrese din memoria principala concureaza pentru aceeasi adresa din cache. Solutia propusa este urmatoarea: fiecare adresa din cache contine mai multe linii (uzual 4, 8 sau 16), fiecare cu propriile date, propriul bit de validare si propriul camp eticheta. Astfel, un cache asociativ cu n cai (linii) permite memorarea simultana a n locatii din memoria principala care in cazul cache-ului cu adresare directa ar fi concurat pentru aceeasi adresa in cache. Apare o crestere a timpului de acces, deoarece atat la scriere, cat si la citire trebuie verificate toate cele n cai. In schimb, utilizarea unui numar relativ redus de cai elimina practic total riscul aparitiei conflictelor.
Vom ridica acum o ultima problema. Pana acum s-a discutat in mod implicit mai mult de citirea datelor din memorie. La modificarea unei valori care se afla deja in cache trebuie sa decidem in care din cele doua memorii (principala si cache) se va realiza scrierea. Avem de ales intre doua politici posibile:
- write-back - datele sunt scrise numai in cache; evident, ele vor ajunge si in memoria principala, dar numai la eliminarea lor din cache
- write-through - datele sunt scrise atat in memoria principala, cat si in cache
Ambele politici sunt larg utilizate, fiecare avand avantaje si dezavantaje. Politica write-back este mai rapida, in schimb pune probleme majore in sistemele multiprocesor, deoarece o modificare facuta in cache-ul unui procesor nu ar putea fi cunoscuta de celelalte procesoare. In acest caz sunt necesare protocoale hardware complexe, prin care fiecare cache 'asculta' in permanenta magistrala comuna, pentru a detecta modificarile facute de celelalte procesoare.
Analizand functionarea memoriei cache putem formula un principiu mai general: intotdeauna cand avem de accesat o sursa de date cu dimensiuni mari si viteza de acces redusa, putem obtine un spor semnificativ de perfomanta daca interpunem intre sursa de date si 'beneficiar' (cel care acceseaza datele) o forma de stocare mai mica, dar mai rapida, care sa retina ultimele date aduse de la sursa. Principiul este intr-adevar folosit pe scara larga si in alte situatii, nu doar in cazul procesorului. In continuare vom prezenta cateva asemenea exemple de materializare a conceptului de cache, implementate hardware sau software, luate din activitatea curenta a unui utilizator de PC.
Cache-ul de disc. Deoarece memoria principala este mult mai rapida decat discul, toate sistemele de operare folosesc o zona de memorie drept cache pentru operatiile cu sistemul de fisiere. Evident, principiile localitatii opereaza la fel de frecvent si in cazul operatiilor cu discul. Exista o singura diferenta notabila: deoarece scopul memorarii pe disc este in primul rand de a face datele persistente, continutul cache-ului este scris in mod periodic pe disc (in general la fiecare 30 de secunde). In acest fel se evita riscul pierderii informatiilor in cazul eventualelor caderi de tensiune sau blocari ale sistemului.
DNS. Sistemul DNS (Domain Name System) de pe reteaua Internet este format dintr-o serie de cache-uri software, raspandite pe anumite servere, care retin corespondente intre adrese literale si IP, pentru cresterea vitezei de cautare a unor site-uri.
Browserele web. Clientii WWW, cum ar fi Internet Explorer, memoreaza intr-un cache software adresele vizitate si pe unde s-a trecut si paginile incarcate, pentru ca la o noua incercare de accesare a acestora sa se ia informatia citita din cache in locul unui apel catre serverul aflat la distanta.
Existenta mai multor programe simultan in memorie (pentru a permite executia lor in paralel) provoaca o crestere foarte mare a necesarului de memorie. Un prim pas in imbunatatirea situatiei a fost facut, asa cum s-a vazut deja, prin asigurarea independentei spatiilor de adrese virtuale ale programelor; in acest fel, in cazul procesoarelor actuale, fiecare program are la dispozitie adrese virtuale pe 32 de biti, ceea ce este permite un spatiu de adrese de 4 Go, suficient pentru aplicatiile actuale. In schimb este posibil ca memoria fizica sa fie insuficienta pentru necesarul tuturor programelor care se executa in paralel. Pentru a relaxa cat mai mult aceasta limitare, se porneste de la urmatoarele constatari:
- nu toate paginile de memorie sunt necesare la un moment dat
- discul hard are in general o capacitate mult mai mare decat memoria fizica disponibila, deci poate fi utilizat pentru a retine temporar continutul unora dintre paginile de memorie
Discutia care urmeaza este valabila in egala masura atat pentru segmentarea memoriei, cat si pentru paginare. Vom considera cazul paginarii, care este mult mai larg utilizata de sistemele de operare actuale.
Modul de lucru ar fi deci urmatorul: in orice moment, in memoria fizica se afla o parte dintre paginile virtuale ale programelor aflate in executie; paginile care nu au loc in memoria fizica sunt memorate pe disc intr-un fisier special, numit fisier de paginare. Se utilizeaza tot mecanismul de paginare descris anterior, dar usor modificat:
- Daca pagina din care face parte adresa cautata se gaseste in memoria fizica (adica apare in tabelul de paginare), totul se desfasoara in modul descris la prezentarea paginarii.
- Daca pagina virtuala respectiva nu se afla in memoria fizica, se cauta pagina dorita in fisierul de paginare. Bineinteles, acest fisier contine si informatiile necesare pentru a putea fi regasite paginile pe care le stocheaza.
- Daca pagina nu se gaseste nici in fisierul de paginare, atunci avem o eroare de adresare si accesul la memorie este oprit.
- Daca pagina cautata se afla in fisierul de paginare, va fi adusa in memoria fizica. In general memoria fizica este complet ocupata, de aceea o alta pagina aflata in memoria fizica va fi evacuata si memorata in fisierul de paginare. Abia cand pagina dorita a fost adusa in memoria fizica si tabelul de paginare al programului a fost modificat corespunzator, se poate realiza accesul propriu-zis.
In acest mod se pot executa in paralel programe al caror necesar total depaseste memoria existenta in sistem. Exista in continuare limitarea impusa de dimensiunea discului, dar aceasta este mai putin severa.
Totusi, solutia nu are numai parti bune. Accesul la disc este incomparabil mai lent decat cel la memorie, astfel ca pierderea de performanta este de multe ori vizibila chiar pe calculatoarele cele mai puternice. Din acest motiv se cauta sa se reduca la minimum accesele la fisierul de paginare. In primul rand, o pagina virtuala nu va fi scrisa pe disc decat daca nu mai este loc in memoria fizica. Altfel spus, acest mecanism nu este utilizat decat daca este neaparat necesar, ceea ce i-a adus denumirea de paginare la cerere (demand paging).
Ca o optimizare suplimentara, daca o pagina care trebuie evacuata din memorie nu a fost modificata de cand a fost adusa ultima data in memorie, atunci copia sa din fisierul de paginare este identica, deci scrierea inapoi pe disc nu mai este necesara. Evident, in acest caz este necesar un sprijin suplimentar din partea hardware-ului, astfel incat in tabelul de paginare, pentru fiecare pagina, sa fie memorat si actualizat in permanenta un bit suplimentar care sa arate daca pagina a fost modificata de cand se afla in memorie. Aceasta optimizare este in mod special eficienta pentru paginile de cod, deoarece instructiunile nu sunt in general modificate pe durata executiei programelor.
In al doilea rand, atunci cand o pagina trebuie adusa in memoria fizica si nu mai este loc, pagina care va fi evacuata nu trebuie aleasa la intamplare. Algoritmul utilizat pentru a selecta pagina care va fi evacuata pe disc trebuie sa respecte o cerinta clara: sa minimizeze riscul ca pagina aleasa sa fie accesata foarte curand in viitor, deci sa trebuiasca sa fie reincarcata in memoria fizica. Deoarece nu se poate prevedea care pagini vor fi accesate in viitor, exista diversi algoritmi care incearca sa prezica aceasta pe baza comportarii programelor in trecutul apropiat.
Daca analizam organizarea unui calculator, vedem ca 'inima' acestuia este o unitate de prelucrare a informatiilor (localizata in procesor), inconjurata de o serie de circuite al caror rol este, in ultima instanta, de a memora informatiile in diverse forme. Aceste circuite de memorare sunt organizate pe mai multe nivele, intr-o structura ierarhica, in functie de distanta fata de unitatea de prelucrare. Pe masura ce se departeaza de procesor, nivelele de memorie au o capacitate mai mare, dar si o viteza mai mica. Putem distinge, in principiu, patru nivele ale ierarhiei de memorii:
- Nivelul registrilor procesorului. Acestia au, in mod evident, cel mai mic timp de acces, aflandu-se e acelasi circuit cu unitatea de prelucrare. Este deci de preferat ca aplicatiile sa utilizeze cat mai mult posibil registrii, pentru a mari performanta. Totusi, numarul acestora este redus, astfel incat este practic imposibil ca o aplicatie sa se poata executa exclusiv cu ajutorul registrilor, fara a face deloc apel la nivelele urmatoare de memorare. Mai mult, codurile instructiunilor nu pot fi retinute in registri.
- Nivelul memoriei cache (numita si memorie imediata). Este singurul nivel care poate lipsi, fara ca aceasta sa implice o schimbare in programele care ruleaza. Atat lucrul cu registrii procesorului, cat si accesarea nivelelor urmatoare necesita o forma de gestiune prin software; nu este si cazul memoriei cache. La randul sau, memoria cache poate fi impartita pe nivele: poate exista un modul cache chiar in interiorul procesorului (numit cache L1), foarte mic si care functioneaza practic la viteza procesorului, si un altul pe placa de baza (cache L2), fabricat tot in tehnologie SRAM, care este putin mai mare decat cache-ul L1 si putin mai lent. Unele implementari pot lucra chiar cu 3 nivele de cache, dintre care 2 sunt integrate in procesor.
- Nivelul memoriei principale. Desi aici poate fi inclusa si memoria ROM, in practica se are in vedere doar memoria RAM, deoarece prelucrarea informatiei inseamna implicit modificarea acesteia.
- Nivelul memoriei secundare. Acest nivel are caracteristica de stocare persistenta. Spre deosebire de nivelele anterioare, care sunt volatile, la acest nivel informatiile se pastreaza si dupa intreruperea alimentarii calculatorului. Tot la nivelul memoriei secundare se gaseste memoria virtuala. Formele de implementare a memoriei secundare sunt: discul dur (cel mai folosit), discheta, mediile optice (CD, DVD), banda magnetica etc.