Memorie cache
Caching este un termen utilizat în informatică. Ideea din spatele unui cache (pronunțat "cash" /ˈkæʃ/ KASH ) este foarte simplă: Foarte des, obținerea unui rezultat pentru un calcul este foarte consumatoare de timp, astfel încât stocarea rezultatului este în general o idee bună. Se folosesc două tipuri de medii de stocare: Unul este de obicei destul de mare, dar accesarea lui este "lentă"; celălalt poate fi accesat mult mai rapid, dar în general este mic. Ideea de bază din spatele memoriei cache este de a utiliza mediul care este rapid de accesat pentru a avea copii ale datelor. Nu există nicio diferență între copie și original. Accesarea datelor originale poate dura mult timp sau poate fi costisitoare (de exemplu: rezultatele unei probleme dificile a căror rezolvare durează mult timp). Din acest motiv, este mult mai "ieftin" să se utilizeze pur și simplu copia datelor din memoria cache. Altfel spus, o memorie cache este o zonă de stocare temporară care are copii ale datelor care sunt utilizate des. Atunci când o copie a datelor se află în această memorie cache, este mai rapid să se utilizeze această copie decât să se recupereze sau să se recalculeze datele originale. Astfel, timpul mediu necesar pentru accesarea datelor va fi mai scurt. Introducerea unei noi valori într-o memorie cache înseamnă adesea că o valoare mai veche trebuie înlocuită. Există diferite idei (denumite de obicei "strategii") privind modul de selectare a valorii de înlocuit.
Un buffer este foarte asemănător cu o memorie cache. Este diferită prin faptul că clientul care accesează datele dintr-un buffer știe că există un buffer; bufferul este gestionat de aplicație. În cazul unui cache, clientul care accesează datele nu trebuie să știe că există un cache.
Aplicațiile informatice tipice accesează datele în moduri foarte asemănătoare. Să presupunem că datele sunt structurate în "blocuri", care pot fi accesate individual. Atunci când o aplicație accesează un bloc, este foarte probabil să acceseze (sau să facă trimitere) la un bloc care este "apropiat" de blocul original. Acest lucru este cunoscut sub numele de localitate de referință. Există diferite tipuri de astfel de "localitate". Localitatea de referință este unul dintre motivele pentru care memoria cache funcționează bine în multe domenii de calcul.
Pentru a funcționa bine, memoria cache trebuie să fie mică, în comparație cu întreaga cantitate de date. Cu cât memoria cache este mai mare, cu atât mai mult durează căutarea unei intrări. De asemenea, crearea unor memorii cache mai mari este mai costisitoare.
Cum funcționează memoria cache
O memorie cache este un bloc de memorie pentru stocarea datelor care probabil vor fi folosite din nou. Unitatea centrală de procesare și hard disk-ul utilizează adesea o memorie cache, la fel ca și browserele și serverele web.
O memorie cache este formată din mai multe intrări, denumite pool. Fiecare intrare conține un datum (un bit de date) care este o copie a unui datum aflat în alt loc. De obicei, cache-urile utilizează ceea ce se numește "backing store". În comparație cu memoria cache, accesarea depozitelor de rezervă este lentă sau costisitoare. De exemplu, o memorie cache pe disc utilizează un hard disk ca memorie de rezervă. Fiecare intrare are atașată și o mică informație, numită tag. Această etichetă este utilizată pentru a găsi locația în care sunt stocate datele originale.
Analize pentru citire
Un client (o unitate centrală de procesare, un browser web, un sistem de operare) dorește să acceseze un bit de date, pe care crede că se află în memoria de rezervă, verifică mai întâi dacă datele pot fi găsite în memoria cache. Dacă datele pot fi găsite în memoria cache, clientul le poate utiliza și nu trebuie să folosească memoria principală. Acest lucru este cunoscut sub numele de "cache hit". Astfel, de exemplu, un program de navigare pe internet poate verifica memoria cache locală de pe disc pentru a vedea dacă are o copie locală a conținutului unei pagini web la o anumită adresă URL. În acest exemplu, URL-ul este tag-ul, iar conținutul paginii web este datum-ul.
O altă situație care poate apărea este aceea că datele cu eticheta nu pot fi găsite în memoria cache. Acest lucru este cunoscut sub numele de "cache miss". Datele trebuie să fie preluate din memoria de rezervă. De obicei, aceasta este copiată în memoria cache, astfel încât data următoare nu mai trebuie să fie preluată din memoria de rezervă.
Memoria cache are doar o dimensiune limitată. Pentru a face loc pentru o intrare care nu a fost pusă în cache, este posibil să fie necesară ștergerea unei alte intrări din cache. Pentru a găsi intrarea care ar trebui cel mai bine ștearsă, se folosesc reguli speciale. Aceste reguli se numesc de obicei euristici. Heuristica utilizată pentru a găsi intrarea se numește politică de înlocuire. O regulă foarte simplă utilizată se numește Least recently used (sau LRU). Aceasta ia pur și simplu intrarea care a fost utilizată cel mai mult timp în urmă. Alte euristici sunt enumerate la algoritmul cache...
Memorii cache pentru scriere
Antrepozitele cache pot fi utilizate și pentru a scrie date; avantajul acestui lucru este că clientul își poate continua operațiunea odată ce intrarea a fost scrisă în memoria cache; nu trebuie să aștepte până când intrarea este scrisă în memoria de rezervă.
Cu toate acestea, intrarea trebuie să fie scrisă în memoria de rezervă la un moment dat. Momentul în care se întâmplă acest lucru este controlat de politica de scriere.
Într-o memorie cache de tip "write-through", fiecare intrare este scrisă imediat în memoria de rezervă și este stocată în memoria cache.
Cealaltă opțiune este de a scrie numai în memoria cache și de a scrie ulterior în memoria de rezervă. Acest lucru este cunoscut sub numele de memoria cache de tip write-back (sau write-behind). Antemergătorul marchează intrările care nu au fost încă scrise în memoria de rezervă; marcajul utilizat este adesea denumit "dirty flag". Înainte ca intrările să fie șterse din memoria cache, acestea sunt scrise în memoria de rezervă. Această operațiune este cunoscută sub numele de scriere leneșă. O ratare într-o memorie cache de tip write-back (care necesită înlocuirea unui bloc cu un altul) va necesita adesea două accese la memorie: unul pentru a obține datele necesare și altul pentru a scrie datele înlocuite din memoria cache în memorie.
Politica de stocare în memoria cache poate, de asemenea, să prevadă că o anumită dată trebuie scrisă în memoria cache. Este posibil ca clientul să fi făcut multe modificări la datele din memoria cache. După ce a terminat, clientul poate spune în mod explicit că trebuie să scrie din nou datele în memoria cache.
Alocarea fără scriere este o politică de memorare în memoria cache în care numai citirile sunt memorate în memoria cache. În acest fel se evită necesitatea de a utiliza memoria cache de tip write-back sau write-through. Scrierile sunt efectuate tot timpul în memoria de rezervă.
Clientul nu este aplicația care modifică datele din stocul de rezervă. În cazul în care datele s-au modificat în memoria de rezervă, copia din memoria cache nu va mai fi actualizată sau va fi veche. În mod alternativ, atunci când clientul actualizează datele din memoria cache, copiile acestor date din alte memorii cache vor deveni caduce. Există protocoale speciale de comunicare care permit administratorilor de cache să vorbească între ei pentru a păstra datele semnificative. Acestea sunt cunoscute sub numele de protocoale de coerență.
Diagrama unui cache de memorie CPU
Selectarea rubricii de înlocuit
O memorie cache este mică și va fi plină, sau aproape plină, în majoritatea timpului. Prin urmare, atunci când se adaugă o nouă valoare, una veche trebuie să fie eliminată. Există diferite moduri în care se poate face această selecție:
- Primul intrat, primul ieșit: Pur și simplu înlocuiți intrarea care a fost adăugată în memoria cache cu cel mai mult timp în urmă.
- Cel mai recent utilizat: Această idee este similară cu FIFO de mai sus, dar atunci când o intrare este utilizată, se actualizează data/ora acesteia.
- Cel mai rar utilizate: Din nou, similar cu cazul FIFO, în loc să se folosească o marcă temporală, se folosește un contor, care este incrementat de fiecare dată când o intrare este utilizată.
- Alege o intrare la întâmplare
Istoric
Cuvântul "cache" a fost folosit pentru prima dată în informatică în 1967, când a fost pregătit un articol științific care urma să fie publicat în IBM Systems Journal. Articolul se referea la o nouă îmbunătățire a memoriei din modelul 85. Modelul 85 era un calculator din linia de produse IBM System/360. Editorul revistei a dorit un cuvânt mai bun pentru memoria tampon de mare viteză, folosit în articol. Nu a primit nicio sugestie și a sugerat cache, de la francezul cacher, care înseamnă "a ascunde". Articolul a fost publicat la începutul anului 1968, iar autorii au fost premiați de IBM. Munca lor a fost salutată și îmbunătățită pe scară largă. Cache a devenit în curând o utilizare standard în literatura de specialitate în domeniul informaticii.
Unde se utilizează memoria cache
Memorii cache CPU
Memoriile mici de pe sau din apropierea cipului CPU pot fi mai rapide decât memoria principală, mult mai mare. Cele mai multe unități centrale de procesare începând cu anii 1980 au folosit una sau mai multe memorii cache. Procesoarele moderne de uz general din interiorul calculatoarelor personale pot avea până la o jumătate de duzină. Fiecare memorie cache poate fi specializată pentru o parte diferită a sarcinii de executare a programelor.
Memorii cache de disc
În general, memoria cache a procesorului este gestionată în întregime de hardware, în timp ce alte memorii cache sunt gestionate de diferite tipuri de software. Sistemul de operare gestionează, de obicei, o memorie cache de pagină în memoria principală. Utilizatorii din afara domeniului informaticii numesc de obicei această memorie cache memorie virtuală. Ea este gestionată de nucleul sistemului de operare.
Hard disk-urile moderne au tampoane de disc. Acestea sunt numite uneori "cache de disc", dar acest lucru este greșit. Funcția principală a acestor tampoane este de a ordona scrierile pe disc și de a gestiona citirile. Accesările repetate ale cache-ului sunt rare, deoarece memoria tampon este foarte mică în comparație cu dimensiunea hard disk-ului.
Discurile hard disk locale sunt rapide în comparație cu alte dispozitive de stocare, cum ar fi serverele la distanță, unitățile de bandă locale sau tonomatele optice. Folosirea discurilor dure locale ca memorie cache reprezintă conceptul principal al gestionării ierarhice a stocării.
Caiete web
Browserele web și serverele proxy web utilizează memoria cache pentru a stoca răspunsurile anterioare de la serverele web, cum ar fi paginile web. Caietele web reduc cantitatea de informații care trebuie să fie transmise prin rețea. Informațiile stocate anterior în memoria cache pot fi adesea reutilizate. Acest lucru reduce lățimea de bandă și cerințele de procesare ale serverului web și contribuie la îmbunătățirea capacității de reacție a utilizatorilor web.
Browserele web moderne folosesc o memorie cache web încorporată, dar unii furnizori de servicii de internet sau organizații folosesc, de asemenea, un server proxy de memorie cache. Acesta este un cache web care este partajat între toți utilizatorii rețelei respective.
De asemenea, motoarele de căutare pun adesea la dispoziție în memoria cache paginile web pe care le-au indexat. De exemplu, Google oferă un link "Cached" lângă fiecare rezultat al căutării. Acest lucru este util atunci când paginile web sunt temporar inaccesibile de pe un server web.
Caching cu rețele nesigure
Funcționarea prin scriere este frecventă în rețelele nesigure (cum ar fi o rețea Ethernet LAN). Protocolul utilizat pentru a se asigura că datele din memoria cache de scriere au sens atunci când sunt utilizate mai multe memorii cache de scriere este foarte complex, într-un astfel de caz.
De exemplu, memoria cache a paginilor web și memoria cache a sistemului de fișiere de rețea de pe partea clientului (cum ar fi cele din NFS sau SMB) sunt de obicei numai pentru citire sau pentru scriere, pentru a menține protocolul de rețea simplu și fiabil.
Diferența dintre buffer și cache
Memoria tampon și memoria cache nu se exclud reciproc; ele sunt adesea utilizate împreună. Motivul pentru care sunt utilizate este însă diferit. Un buffer este o locație din memorie care este utilizată în mod tradițional deoarece instrucțiunile CPU nu pot adresa direct datele stocate în dispozitivele periferice. Memoria calculatorului este utilizată ca o memorie intermediară.
În plus, un astfel de tampon poate fi fezabil atunci când un bloc mare de date este asamblat sau dezasamblat (după cum cere un dispozitiv de stocare) sau atunci când datele pot fi livrate într-o ordine diferită de cea în care sunt produse. De asemenea, un întreg buffer de date este de obicei transferat secvențial (de exemplu, pe un hard disk), astfel încât bufferizarea în sine crește uneori performanța transferului. Aceste beneficii sunt prezente chiar dacă datele stocate în memoria tampon sunt scrise în memorie tampon o singură dată și citite din memorie tampon o singură dată.
De asemenea, o memorie cache crește performanța transferului. O parte din această creștere provine, în mod similar, din posibilitatea ca mai multe transferuri mici să se combine într-un singur bloc mare. Dar principala creștere a performanței se datorează faptului că există o șansă bună ca aceeași dată să fie citită din memoria cache de mai multe ori sau ca datele scrise să fie citite în curând. Singurul scop al memoriilor cache este de a reduce numărul de accesări la stocarea mai lentă de la bază. De asemenea, memoria cache este, de obicei, un strat de abstractizare care este conceput pentru a fi invizibil din perspectiva straturilor învecinate. În acest fel, aplicațiile sau clienții pot să nu știe că există o memorie cache.
Întrebări și răspunsuri
Î: Ce este memoria cache?
R: Memorarea în cache este un termen utilizat în informatică care se referă la practica de stocare a unor copii ale datelor care sunt utilizate frecvent pentru a le accesa mai repede decât să se recupereze sau să se recalculeze datele originale.
Î: Cum funcționează memoria cache?
R: Caching-ul funcționează prin utilizarea a două tipuri de medii de stocare, unul care este de obicei destul de mare, dar lent la accesare, și altul care poate fi accesat mult mai rapid, dar care este în general mai mic. Ideea din spatele memoriei cache este de a utiliza mediul rapid pentru a stoca copii ale datelor, astfel încât accesarea datelor originale să dureze mai puțin timp sau să fie mai puțin costisitoare.
Î: Ce este un buffer?
R: O memorie tampon este similară cu o memorie cache în sensul că stochează copii ale datelor pentru a le accesa mai rapid, însă în cazul unei memorii tampon, clientul care accesează datele știe că există o memorie tampon și că aceasta este gestionată de o aplicație, în timp ce în cazul unei memorii cache, clienții nu trebuie să știe că există o memorie cache.
Î: Ce înseamnă localitatea de referință?
R: Localitatea de referință înseamnă că, atunci când o aplicație accesează anumite blocuri de date structurate, este posibil să acceseze și alte blocuri apropiate de cele accesate inițial. Acest lucru ajută cașele să funcționeze bine, deoarece acestea sunt de obicei mici în comparație cu toate datele disponibile.
Î: De ce durează mai mult timp pentru a căuta intrări în memoria cache mai mare?
R: Cașerele mai mari necesită mai mult timp deoarece conțin mai multe informații stocate și, prin urmare, necesită mai mult timp pentru căutări. De asemenea, acestea sunt mai scumpe, deoarece necesită mai multe resurse pentru stocare.
Î: Cum poate contribui localitatea la îmbunătățirea funcționării cache-urilor?
R: Localitatea ajută la îmbunătățirea funcționării cache-urilor deoarece, atunci când aplicațiile accesează anumite blocuri de date structurate, este probabil să aibă nevoie și de alte blocuri din apropiere, care pot fi apoi recuperate rapid din cache în loc să fie nevoie să le aducă din altă parte sau să le recalculeze din nou.