Koherenca READ/WRITE dhe Atomiciteti
Dy tipare të dobishme për memorien janë koherenca read/write dhe atomiciteti before-orafter. Koherenca read/write nënkupton që rezultati i operacionit READ i një celule të emëruar është gjithmonë i njëjtë si i shumicës së operacioneve WRITE për atë celulë. Atomiciteti before-or-after nënkupton se rezultati i çdo operacioni READ apo WRITE merret nëse operacioni READ apo WRITE është kryer plotësisht, para apo plotësisht pas, çdo operacioni tjetër READ apo WRITE. Megjithëse mund të hetohet (FJALA HETOHET) se dizajnuesi duhet të jetë i aftë t’i supozojë këto dy tipare, ai supozim është riskant dhe shpesh herë i gabuar. Ekzistojnë një numër i çuditshëm i kërcënimeve për koherencën read/write dhe atomicitetin before-or-after:

  • Konkurrenca. Tek sistemet ku aktorë të ndryshëm mund të ekzekutojnë në mënyrë

konkurente operacionet READ apo WRITE, ato mund të startojnë dy operacione të tilla mbi celulën me emër të njëjtë për kohë të njëjtë. Nevojitet një lloj gjykimi që vendos se cili do të shkojë i pari dhe të sigurojë se njëri operacion përfundon përpara se të fillojë tjetri.

  • Depoja nga largësia. Atëherë kur pajisja memoruese ndodhet larg fizikisht, përsëri

shfaqen brengat e njëjta, por ato përforcohen me vonesa, gjë që na bën të shtrojmë pyetjen: “Cili operacion WRITE ishte më i fundit?” (PJESA NË VIJIM E KËSAJ FJALIE TË RISHIHET, MBASE EDHE DERI NË FUND TË PARAGRAFIT) dhe forma plotësuese të dështimeve të paraqitura te lidhjet komunikuese. Seksioni 4.5 e paraqet depon nga largësia, dhe Kapitulli 10 [onlajn] i hulumton zgjidhjet për problemet mbi atomicitetin before-or-after, dhe koherencën read/write që shfaqen me sistemet e depove nga largësia.

  • Zmadhimi i performancës. Zgjedhja e duhur e kompajlerëve dhe procesorëve me

performancë të lartë, mund të rivendos radhën e operacioneve të memories, ndoshta duke ndryshuar kuptimin e plotë të “operacioni më i fundit WRITE në atë celulë” dhe duke prishur, në këtë mënyrë, koherencën read/write për operacionet konkurrente READ dhe WRITE. Për shembull, kampaljeri mund ta vonojë operacionin WRITE të një deklarimi, derisa regjistri që e ka atë vlerë që duhet të shkruhet është i nevojshëm për ndonjë qëllim tjetër. Nëse dikush tjetër ekzekuton operacionin READ të asaj ndryshoreje, ai mund të fitojë një vlerë të vjetër. Disa gjuhë programuese dhe arkitektura me procesor të performancës së lartë, kanë direktiva speciale programuese, që i mundësojnë programuesit që ta kthejë koherencën read/write në secilin rast. Për shembull, gjuha Java ka një deklarim të quajtur SYNCHRONIZED që e mbron bllokun e kodit nga moskoherenca read/write. Edhe arkitektura e procesorit Alfa nga kompania Hewlett-Packard ka një instruksion për barrierë memoruese (MB) që i bën të gjitha operacionet paraprake READ dhe WRITE të realizohen përpara se të vazhdohet te instruksioni i radhës. Për fat të keq, të dy këto konstrukte krijojnë mundësi që programuesit të bëjnë gabime të vogla.

  • Madhësia e celulës nuk është adekuate me madhësinë e vlerës. Vlera e madhe mund

të zë shumë celula të memories, me ç’rast atomiciteti before-or-after kërkon vëmendje të posaçme. Problemi qëndron aty se edhe leximi edhe shënimi i vlerës së ndodhur në më shumë celula bëhet për një kohë të caktuar, vetëm për një celulë. Lexuesi që ekzekuton në konkurrencë me shënuesin që është duke ndryshuar të njëjtën vlerë shumë celulare në përfundim mund të mbetem me grumbull të përzier celulash, nga të cilat vetëm një pjesë e tyre është ndryshuar. (TË QARTËSOHET PAK MË MIRË MENDIMI) Arkitektët kompjuterik këtë rrezik e quajnë shënimi i vrullshëm. Dështimet e ndodhura në mes të shënimit të vlerave në shumë celula munden edhe më shumë ta komplikojnë situatën. Për ta kthyer atomicitetin before-or-after, lexuesit dhe shënuesit konkurentë, duhet që në një farë mënyre të koordinohen, dhe dështimi në mes të një përditësimi (ndryshimi) duhet që patjetër ta lë të pandryshuar ose të tërë ndryshimin e paramenduar ose asnjë nga ndryshimet e paramenduara. Kur të plotësohen këto kushte, atëherë themi se operacionet READ apo WRITE janë atomike. Risku në këto raste ka të bëjë me momentin kur vlera e vogël e ndanë celulën e memories me ndonjë vlerë tjetër të vogël. Risku qëndron aty se nëse dy shënues konkurrent ndryshojnë vlera të ndryshme që ndajnë celulën e njëjtë, njëri prej tyre mund ta mbishkruaj (ang. Overwrite) ndryshimin e tjetrit. Atomiciteti mund po ashtu ta zgjidh këtë problem. Kapitulli 5 e fillon këtë studim të atomicitetit duke eksploruar metodat e koordinimit të aktiviteteve konkurrente. Kapitulli 9 [onlajn] zgjeron studimin e atomicitetit për të fiksuar po ashtu edhe dështimet.

  • Depo e replikuar (kopjuar). Ashtu si edhe Kapitulli 8 [onlajn] do të eksplorojë në

detale. (TË RISHIKOHET FJALIA E PARË) Siguria e depos mund të rritet duke bërë më shumë kopje të vlerave dhe duke i vendosur ato kopje në celula të veçanta të depove. Depoja mundet të replikohet edhe për rritjen e performancës, ashtu që disa lexues mund të operojnë në mënyrë konkurrente. Por replikimi e rrit numrin e mënyrave sipas të cilave operacionet konkurrente READ dhe WRITE mund të ndërveprojnë dhe ndoshta në këto raste e humbin ose koherencën read/write ose atomicitetin before-or-after. Gjatë kohës që i duhet shënuesit të ndryshojë disa kopje, lexuesit e kopjes së ndryshuar mund të marrin përgjigje të ndryshme nga lexuesit e kopjes që shënuesi akoma nuk i ka ndryshuar. Kapitulli 10 [onlajn] i diskuton teknikat e realizimit të koherencës read/write dhe atomicitetit before-or-after te depot e kopjuara. Shpesh, dizajnuesi i sistemit duhet të ballafaqohet jo vetëm me një por me disa nga këto kërcënime të përnjëhershme. Kombinimi i replikimit dhe largësisë është veçanërisht sfiduese. Mund të jetë çuditërisht e vështirë të dizajnohen memorie që janë edhe të efektshme edhe koherente me read/write, edhe atomike. Për të thjeshtësuar dizajnin ose për të arrirë performancë të lartë, dizajnuesit disa herë ndërtojnë sisteme memoruese që kanë specifikime të dobëta të koherencës. Për shembull, sistemi me shumë procesorë mund të specifikojë: “Rezultati nga operacioni READ do të jetë vlera e operacionit të fundit WRITE, nëse ai operacion WRITE është ekzekutuar nga procesori i njëjtë”. Ekziston një literaturë e tërë me “modele për konsistencën e të dhënave” që eksplorojnë veçoritë e detajuara të specifikimeve të ndryshme të koherencës së memorieve. Tek sistemi me memorie të shtresëzuar, është me rëndësi se dizajnuesi i shtresës e di saktësisht specifikimin për koherencën dhe atomicitetin, për secilën shtresë të ulët të memories që e shfrytëzon. Edhe siç duhet, nëse shtresa që dizajnohet ka memorie për shtresat e mësipërme, dizajnuesi duhet që të specifikojë saktësisht këto veçori, në mënyrë që që shtresat e mësipërme të mund t’i presin apo të varen nga ato. Po të mos merret ndryshe, (KJO) do të supozojmë se pajisja e memories fizike ka koherencën read/write për celulat e veçanta, por që atomiciteti before-or-after për vlerat në shumë celula, (për shembull, fajllet) arrihet ndaras nga shtresa që i implementon ato.