Spartinančiąją atmintinę galima naudoti siekiant pagerinti prieigos prie tam tikro ištekliaus našumą. Tačiau kai tam pačiam ištekliui yra kelios tokios talpyklos (kaip parodyta paveikslėlyje), gali kilti problemų dėl to, kad talpyklos saugo skirtingas ar pasenusias to paties duomenų bloko kopijas. Spartinančiosios talpyklos suderinamumas (taip pat vadinamas spartinančiosios atminties darna) reiškia mechanizmus ir taisykles, kuriais užtikrinama, kad visose ištekliaus spartinančiosiose talpyklose būtų nuoseklūs ir prasmingi duomenys (tai dažnai apibūdinama kaip duomenų vientisumas). Spartinančiosios atminties darna yra specifinis bendresnės atminties darnos atvejis, taikomas spartinančiajai atminčiai.
Kada ir kodėl kyla problema
Problema atsiranda, kai keli klientai (pvz., procesoriai ar gijos) turi savo talpyklas ir vienu metu skaito ir rašo tą patį atminties bloką. Pavyzdžiui, jei vienas klientas turi atminties bloko kopiją iš ankstesnio skaitymo, o kitas klientas pakeičia tą atminties bloką, pirmasis klientas gali likti su negaliojančia, pasenusia talpyklos kopija, apie tai nežinodamas. Tai gali sukelti netikėtas klaidas programose arba neteisingus skaičiavimus.
Pagrindinės sprendimo kryptys
- Invalidacija: kai vienas klientas rašo duomenis, kitiems klientams siunčiami pranešimai, kad jų talpyklos kopijos taptų negaliojančios. Tokiu būdu rašantis klientas įgyja teisę vieninteliui keisti bloką.
- Atnaujinimas (update): kai vienas klientas rašo, pakeitimai paskirstomi kitiems klientams, kad jų talpyklos būtų atnaujintos su naujais duomenimis.
- Snoopingo (sniffing) protokolai: talpyklos stebi magistralę (bus), kad aptiktų, kada kitas klientas vykdo veiksmus su tam tikru bloku, ir atitinkamai invaliduoja arba atnaujina savo kopijas.
- Directory pagrindu veikiantys protokolai: centrinė (ar paskirstyta) direktorija seka, kurie mazgai turi tam tikrą bloko kopiją, ir siunčia reikiamus pranešimus tik tiems mazgams — geriau skalėms su daugų mazgų sistemomis.
Dažniausiai sutinkamos būsenų mašinos
Daugelis darnaus elgesio protokolų remiasi blokų būsenų modeliais. Vienas žinomiausių pavyzdžių yra MESI protokolas, kuriame blokas gali būti vienoje iš būsenų: Modified (pakeistas), Exclusive (išskirtinis), Shared (bendras) arba Invalid (negaliojantis). Tokie modeliai leidžia efektyviau valdyti, kada reikalingas rašymo leidimas, kada galima skaityti iš talpyklos be magistralės prieigos ir pan.
Rašymo politika ir jos reikšmė
- Write-through: rašant į talpyklą, tas pats rašymas vykdomas ir pagrindinėje atmintyje — paprastesnė sinchronizacija, bet didesnė magistralės apkrova.
- Write-back: rašymas atnaujinamas tik talpykloje, o į pagrindinę atmintį įrašoma vėliau (kai blokas išmetamas). Efektyviau, bet reikalauja griežtesnių darnos mechanizmų, kad kitos talpyklos nebūtų klaidingai naudojamos.
Praktinės problemos ir niuansai
- Falsus dalijimasis (false sharing): du nepriklausomi kintamieji, esantys tame pačiame atminties bloke, gali priversti dažnai invaliduoti ar sinchronizuoti bloką tarp talpyklų, nors logiškai jie nėra susiję — tai žymiai mažina našumą.
- Mastelio didėjimas: snoopingo protokolai gerai veikia mažose sistemose su bendra magistrale, bet prastėja didelėse ar paskirstytose sistemose; čia efektyvesni direktorijų sprendimai.
- Laiko ir vėlavočių poveikis: darnos mechanizmai gali pridėti sinchronizacijos vėlavimų, ypač rašymo atvejais; optimalūs protokolai stengiasi minimalizuoti šias vėlavimo sąnaudas.
Kaip tai susiję su atminties nuoseklumu
Spartinančiosios atminties darna užtikrina, kad vienu metu egzistuojančios talpyklų kopijos būtų sutelktos ar kontroliuojamos. Tačiau ji neduoda visų atsakymų į klausimus apie tai, kaip matomi kitiems klientams nuoseklūs rašymo ir skaitymo įvykiai — tam yra atskiros sąvokos, vadinamos atminties nuoseklumo modeliais (memory consistency models). Kitaip tariant, darna sprendžia „ar“ ir „kokią“ kopiją turime, o nuoseklumo modeliai nusako „kada“ ir „kokia tvarka“ operacijos tampa matomos kitiems.
Santrauka ir praktiniai patarimai
- Spartinančiosios atminties darna yra būtina daugumaše bitų atliekamų skaičiavimų sistemose, kad būtų išvengta klaidų dėl pasenusių kopijų.
- Renkantis darnaus elgesio sprendimą, reikia įvertinti sistemos dydį, magistralės architektūrą ir našumo reikalavimus — mažoms sistemoms tinka snoopingo protokolai, didelėms — direktorijų pagrindu sprendimai.
- Programuotojai gali sumažinti problemų kiekį vengdami false sharing ir aiškiai valdydami sinchronizaciją tarp gijų/procesorių.
Dažnas realus atvejis, kai kyla ši problema, yra procesorių talpyklos daugiaprocesorinėje sistemoje. Spartinančiosios atminties darna skirta tokiems konfliktams valdyti ir išlaikyti nuoseklumą tarp spartinančiosios atminties ir pagrindinės atminties.

