Koherenca READ/WRITE dhe Atomiciteti

**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.