definiția „atomicității” spune că o tranzacție ar trebui să poată fi încheiată fără a fi atinsă sau manipulată de acțiuni de executare simultane în timpul procesului său. Dar asta înseamnă, de asemenea, că un program nu trebuie să ruleze simultan atunci când se presupune că este atomic?
să spunem că avem 2 programe ca exemplu:
example_program1:
contează int i = 1 până la 100 în fiecare secundă
fiecare număr este tipărit într-o nouă linie
example_program2:
tipărește doar ” hi ”
și un program părinte care include ambele programe și le rulează odată ce primește un semnal pentru a porni un anumit program (de ex. prin sigaction în linux) cu versiunea 2:
versiunea 1:
rulează programul (chiar concurent) oricând după ce primește semnalul
ceea ce înseamnă că program2 poate imprima ” salut ” în timp ce programul 1 tipărește încă numerele
versiunea 2:
rulați un program pe rând
semnalul pentru alt program este blocat până când programul în curs se termină
în acest exemplu, poate doar versiunea 2 să fie considerată atomică sau ambele? Ar fi acest program non-atomic numai dacă, de exemplu, program2 ar crește i cu 1 în timpul procesului său?
Comentarii
- Termenul ” atomic ” este utilizat în (mai multe) moduri diferite în context diferit. Uneori în moduri foarte asemănătoare, dar încă diferite. Este adesea folosit informal, de asemenea. Întrebarea dvs. începe cu o definiție care pare să se bazeze pe teoria bazelor de date, dar apoi vorbește despre programe. Definiția dvs. vorbește despre ” tranzacții „, dar nu există tranzacții în programul dvs. Este ‘ probabil că utilizați din greșeală definiția greșită a ” atomic „. (De asemenea, definiția dvs. despre atomicitate nu ‘ se potrivește cu adevărat cu semnificația sa la ACID.)
Răspuns
Dacă o operațiune X este atomică, asta înseamnă că oricine observă operația o va vedea fie ca nu a fost încă pornită, fie ca finalizată și nu în nicio stare parțial finalizată. Asta este.
Evident, dacă scrieți cod pentru a efectua o operație X, iar alt cod îl poate vedea pe jumătate efectuat sau poate interfera cu aceasta, atunci implementarea operației X nu este atomică.
În unele contexte, o operație „atomică” poate reuși sau eșua; dacă o astfel de operație atomică eșuează, atunci efectul trebuie să fie exact același ca și când operația nu ar fi fost niciodată începută.
Comentarii
- Ca o notă, aceasta înseamnă izolarea în ACID, nu ceea ce înseamnă Atomicity. ‘ nu este clar dacă definiția este destinată să coincidă / să acopere noțiunea ACID de atomicitate (care nu este ‘ teribil de relevantă pentru codul arbitrar).
Răspuns
Nu sunt sigur că știu o definiție simplă, formală și abstractă a „atomic” pentru un limbaj de programare. Știu multe altele la diferite niveluri de abstractizare și cu privire la diferite subiecte. Știu, de asemenea, unele care par destul de abstracte, dar care au condiții prealabile destul de sofisticate (de exemplu, modele de concomitență). O parte a problemei este că există o mulțime de moduri diferite de a spune că două programe se „comportă” „echivalent” și unele definiții pot respecta noțiuni diferite de „echivalent”.
O schiță (pe care o fac) acum) a unei abordări cu privire la un model de concurență întrepătruns este: Având în vedere o semantică operațională, o secvență de afirmații este executată atomic / div> dacă toate tranzițiile (ale semanticii operaționale) care implică acele afirmații au loc în ordine. O succesiune de afirmații este atomică dacă toate secvențele posibile ale tranzițiilor execută secvența afirmațiilor atomic. Am putea slăbi acest lucru cu un „ parcă ar fi executate atomic” pe care am putea începe să-l formalizăm spunând că toate secvențele posibile de tranziții sunt echivalente ( probabil echivalent observațional) la o succesiune de tranziții care execută afirmațiile atomic.
B în mod asiatic, executat atomic înseamnă că odată ce începem să executăm o secvență de instrucțiuni, nu intercalăm executarea oricărei alte instrucțiuni în execuția secvenței.În ceea ce privește implementarea, acest lucru ar putea însemna că executăm doar un fir la un moment dat, ca într-o implementare de subdiviziune a firelor de timp, iar o succesiune de instrucțiuni executate atomic înseamnă că nu au existat comutatoare de context în timpul executării lor. Definiția de mai sus are o problemă prin faptul că nu „gestionează bine coordonarea între fire. Nu ar avea sens să spunem că comunicarea de-a lungul unui canal între două fire, de exemplu, a fost vreodată atomică. (Adesea vorbim despre operații pe o structură de date ca fiind atomice și acest lucru ar fi probabil mai potrivit pentru acest exemplu. Definiția ar fi specifică structurii de date.)
Pentru exemplul dvs. de program și presupunând o semantică operațională în care o instrucțiune print
ar putea fi tratată într-o singură tranziție, atunci Programul 2 va fi întotdeauna executat atomic și este (destul de banal) atomic. A doua dvs. execuție descrie un scenariu în care Programul 1 este executat atomic, în timp ce prima dvs. nu. Dacă a existat întotdeauna un mecanism care a garantat că a doua ta execuție s-a întâmplat, atunci ai putea spune că Programul 1 (cu acel mecanism) este atomic, dar altfel, probabil, nu ar fi atomic singur.
Așa cum am menționat în comentariu, „atomic” este adesea folosit într-un sens informal și / sau implementat. Prin urmare, ceea ce se intenționează exact este adesea neclar, deși spiritul a ceea ce se intenționează este de obicei clar rezonabil.
Răspuns
Originea veche și întunecată a cuvântului Atomic în programare se referă la o instrucțiune de limbaj de asamblare ATOMIC. În același mod în care un grup de particule individuale (proton, neutron, electron) formează o singură unitate nerompabilă numită atom, în programare ATOMIC se referă la un grup de instrucțiuni de asamblare care formează o singură instrucțiune neîntreruptibilă . Prima instrucțiune de asamblare este ATOMIC, care suspendă toate întreruperile până când întreruperile sunt re-inițiate cu ceva de genul UNATOMIC.
De atunci, cuvântul ATOMIC a fost brutal utilizat în mod abuziv de marketing. Apelarea unei singure instrucțiuni ATOMIC este o prostie.
ATOMIC a fost inițial un acronim, cred că ar fi putut fi „A seT? Of Multiple Instruction Clusters” – îmi pare rău, nu sunt sigur de T, a fost mulți ani.
Comentarii
-
Calling a single instruction ATOMIC is just silly
bine, au existat atomice transferuri de memorie care implică mai multe cicluri de autobuz, precum și instrucțiuni precum Test And Set .