Acasă | Despre noi | feedback-ul
Problema în cauză rezultă din faptul că valoarea elementului de date din memorie, stocată în două procesoare diferite, este disponibilă acestor procesoare numai prin cache-urile lor individuale. În Fig. 10.3 prezintă un exemplu simplu care ilustrează această problemă.
Problema de coerență a memoriei pentru multiprocesoare și dispozitive de I / O are multe aspecte. De obicei, microprocesoarele mici folosesc un mecanism hardware, numit un protocol, pentru a rezolva această problemă. Aceste protocoale se numesc protocoale de coerență în cache. Există două clase de astfel de protocoale:
- Protocoale bazate pe protocoale. Informațiile despre starea blocului de memorie fizică sunt conținute doar într-un singur loc, numit un director (fizic, directorul poate fi distribuit între nodurile sistemului). Această abordare va fi luată în considerare în Sec. 10.3.
- Protocoale de observare (snooping). Fiecare cache care conține o copie a datelor unui anumit bloc de memorie fizică are, de asemenea, o copie corespunzătoare a informațiilor despre serviciu despre starea sa. Nu există un sistem centralizat de înregistrare. De obicei, cache-urile sunt localizate pe un autobuz partajat, iar toți controlorii cache-ului urmăresc autobuzul (vizualizează-l) pentru a determina dacă conțin o copie a blocului corespunzător.
Fig. 10.3. Ilustrația problemei de coerență a memoriei cache
În sistemele multiprocesor, folosind microprocesoare cu memoria cache conectat la memoria partajată centralizată, protocoalele de observare au devenit populare ca să sondeze starea cache-uri, acestea pot utiliza o conexiune preexistent fizică - un autobuz de memorie.
În mod informal, problema coerenței memoriei constă în necesitatea de a se asigura că orice citire a elementului de date returnează ultima dată valoarea scrisă în el. Această definiție nu este complet corectă, deoarece este imposibil să se solicite ca operația de citire să vadă instantaneu valoarea scrisă acestui element de date de un alt procesor. Dacă, de exemplu, o singură operație procesor de scriere precede operația de citire, din aceeași celulă pe un alt procesor într-un interval de timp foarte scurt, este imposibil să se garanteze faptul că valoarea de date de returnare de citire înregistrate, deoarece în acest moment, datele de înregistrare nu poate lăsa chiar procesorul. Problema exact când valoarea înregistrată trebuie să fie disponibilă pentru procesorul care efectuează citirea, este determinată de modelul selectat status coerent (consistent) memoriei și asociate cu implementarea sincronizării de calcul paralel. Prin urmare, în scopul de simplitate, presupunem că avem nevoie doar pentru a înregistra valoarea înregistrării tranzacției a fost de operații de citire disponibile care au avut loc puțin mai târziu că înregistrarea și procesarea operațiunii de scriere sunt întotdeauna vizibile în ordinea de execuție a acestora.
Cu această definiție simplă a unei stări consistente de memorie, putem garanta coerența prin oferirea a două proprietăți:
- Funcționarea citirii unei celule de memorie de către un procesor care urmează operației de scriere în aceeași locație de memorie de către un alt procesor va obține valoarea înregistrată dacă operațiile de citire și scriere sunt suficient de separate una de cealaltă în timp.
- scrie operațiuni în aceeași celulă de memorie sunt realizate strict secvențial (uneori, spun că sunt serializate): aceasta înseamnă că două scrieri consecutive la aceeași locație de memorie vor fi respectate de către alte procesoare exact în ordinea în care acestea apar în programul procesorului care efectuează aceste operații de scriere.
Prima proprietate este în mod evident legată de definirea unei stări de memorie coerente (consecvente): dacă procesorul va citi mereu numai valoarea datelor vechi, am spune că memoria este incoerentă.
Necesitatea operațiilor de înregistrare strict secvențială este mai subtilă, dar și foarte importantă. Imaginați-vă că nu se respectă executarea strict consecventă a operațiilor de scriere. Apoi, procesorul P1 poate scrie date către celulă, apoi procesorul P2 scrie în această celulă. Executarea strict secvențială a operațiilor de scriere garantează două consecințe importante pentru această secvență de operații de scriere. În primul rând, se asigură că fiecare procesor din aparat va observa la un moment dat înregistrarea efectuată de procesorul P2. Dacă secvența operațiilor de scriere nu este respectată, atunci poate apărea o situație când un procesor va observa mai întâi operația de scriere a procesorului P2 și apoi va scrie operația procesorului P1 și va stoca această valoare înregistrată P1 pe o perioadă nedeterminată. O problemă mai subtilă apare cu menținerea unui model rezonabil de ordine de execuție a programului și coerență a memoriei pentru utilizator: imaginați-vă că cel de-al treilea procesor citește în mod constant aceeași celulă de memorie în care scriu procesoarele P1 și P2; trebuie să observe mai întâi valoarea înregistrată de P1 și apoi valoarea înregistrată de P2. Poate că nu va putea niciodată să vadă valoarea înregistrată de P1, deoarece înregistrarea de la P2 a apărut înainte de citire. Dacă chiar vede valoarea înregistrată de P1, ar trebui să vadă valoarea scrisă de P2 în lectură ulterioară. În mod similar, orice alt procesor care poate monitoriza valorile scrise de ambele P1 și P2 trebuie să respecte același comportament. Cea mai simplă modalitate de a obține astfel de proprietăți este aceea de a respecta cu strictețe ordinea operațiilor de scriere, astfel încât toate înregistrările din aceeași celulă să poată fi observate în aceeași ordine. Această proprietate se numește execuție secvențială (serializare) a operațiilor de scriere (scrierea serializării). Problema când un procesor ar trebui să vadă valoarea scrisă de un alt procesor este destul de complexă și are un efect vizibil asupra performanței, în special în mașinile mari.