Dacă începeți să aflați cum funcționează procesoarele multi-core, cache-ul, coerența cache-ului și memoria, poate părea puțin confuză la început. Având în vedere acest lucru, postul de astăzi SuperUser Q & A are răspunsuri la o întrebare curioasă a cititorului.
Sesiunea de întrebări și răspunsuri din ziua de astăzi vine de la amabilitatea SuperUser - o subdiviziune a Stack Exchange, o grupare bazată pe comunitate a site-urilor Q & A.
Cititorul super-utilizator CarmeloS dorește să știe când cache-ul unui procesor este returnat în memoria principală:
Dacă am un procesor cu două nuclee și fiecare nucleu are propriul cache L1, este posibil ca Core1 și Core2 să stocheze simultan aceeași parte a memoriei? Dacă este posibil, care va fi valoarea memoriei principale dacă Core1 și Core2 și-au modificat valorile în memoria cache?
Când este memoria cache a procesorului înapoi în memoria principală?
Contribuitorii SuperUser David Schwartz, sleske și Kimberly W au răspunsul pentru noi. În primul rând, David Schwartz:
Dacă am un procesor cu două nuclee și fiecare nucleu are propriul cache L1, este posibil ca Core1 și Core2 să stocheze simultan aceeași parte a memoriei?
Da, performanța ar fi teribilă dacă nu ar fi așa. Luați în considerare două fire care rulează același cod. Vrei codul respectiv în ambele cache-uri L1.
Dacă este posibil, care va fi valoarea memoriei principale dacă Core1 și Core2 și-au modificat valorile în memoria cache?
Valoarea veche va fi în memoria principală, care nu va conta niciodată, deoarece niciun nucleu nu o va citi. Înainte de a scoate o valoare modificată din cache, trebuie scrisă în memorie. De obicei, se utilizează o variantă a protocolului MESI. În implementarea tradițională a MESI, dacă o valoare este modificată într-o memorie cache, ea nu poate fi prezentă deloc în nici un alt cache la același nivel.
Urmat de răspunsul de la sleske:
Da, având două cache-uri de memorie cache, se poate întâmpla aceeași regiune de memorie și este de fapt o problemă care apare foarte mult în practică. Există diferite soluții, de exemplu:
- Cele două cache-uri pot comunica pentru a vă asigura că nu sunt de acord
- Puteți avea un fel de supraveghetor care să monitorizeze toate cache-urile și să le actualizeze în consecință
- Fiecare procesor monitorizează zonele de memorie pe care le-a stocat în memoria cache și când detectează o scriere, aruncă memoria cache (acum invalidă)
Problema este numită coerența cache-ului, iar articolul Wikipedia pe această temă are o imagine de ansamblu a problemei și soluții posibile.
Și răspunsul nostru final de la Kimberly W:
Pentru a răspunde la întrebarea din titlul postului dvs., depinde de ceea ce este protocolul de cache. Dacă este o scriere înapoi, memoria cache va fi returnată numai în memoria principală atunci când controlerul cache nu are altă opțiune decât să pună un nou bloc de cache în spațiul deja ocupat. Blocul care a ocupat anterior spațiul este eliminat și valoarea acestuia este scrisă în memoria principală.
Celălalt protocol este scrierea. În acest caz, oricând blocul de cache este scris la nivel n, blocul corespunzător la nivel n + 1 este actualizat. Este similar în concepția de a completa un formular cu hârtie carbon de dedesubt; orice scrieți pe partea de sus este copiat pe foaia de mai jos. Acest lucru este mai lent, deoarece implică în mod evident mai multe operații de scriere, dar valorile dintre cache-urile sunt mai consecvente. În schema de returnare, numai cache-ul de nivel superior ar avea cea mai actualizată valoare pentru un anumit bloc de memorie.
Aveți ceva de adăugat la explicație? Sunați în comentarii. Doriți să citiți mai multe răspunsuri de la alți utilizatori de tehnologie Stack Exchange? Check out discuția completă aici.
Credit de imagine: Lemsipmatt (Flickr)