Hvad er den nøjagtige definition af ' atomicitet ' i programmeringen?

definitionen af “atomicitet” siger, at en transaktion skal kunne afsluttes uden at blive berørt eller manipuleret af muligvis samtidige kørende handlinger under processen. Men betyder det også, at et program ikke skal køre samtidigt, når det skal være atomisk?

lad os sige, at vi har 2 programmer som et eksempel:

eksempel_program1:

tæller int i = 1 til 100 hvert sekund

hvert nummer udskrives i en ny linje

eksempel_program2:

udskriver bare ” hej ”

og et overordnet program, der inkluderer begge disse programmer og kører dem, når de først modtager et signal for at starte et specifikt program (f.eks. via sigaction i linux) med 2 version:

version 1:

kører programmet (endda samtidigt) når som helst når signalet modtages

hvilket betyder at program2 kan udskrive ” hej ” mens program1 stadig udskriver tallene

version 2:

køre et program ad gangen

signal til andet program er blokeret, indtil det igangværende program er afsluttet

i dette eksempel, kan kun version 2 betragtes som atomær eller begge dele? Ville dette program kun være ikke-atomært, hvis f.eks. Program2 forøgede i med 1 under dets proces?

Kommentarer

  • Udtrykket ” atomisk ” bruges på (flere) forskellige måder i forskellige sammenhænge. Nogle gange på meget ens, men stadig forskellige måder. Det bruges ofte også uformelt. Dit spørgsmål starter med en definition, der ser ud til at være baseret på databaseteori, men derefter taler om programmer. Din definition taler om ” transaktioner ” men der er ingen transaktioner i dit program. Det ‘ er sandsynligt, at du ved et uheld bruger den forkerte definition af ” atomisk “. (Din definition af atomicitet stemmer heller ikke ‘ ikke rigtig overens med betydningen af det a la ACID.)

Svar

Hvis en operation X er atomær, betyder det, at enhver, der observerer operationen, vil se den enten endnu ikke startet eller som afsluttet og ikke i nogen tilstand, der er delvist afsluttet. Det er det.

Hvis du skriver kode for at udføre en operation X, og anden kode kan se den halvt udført eller forstyrre den, så er din implementering af operationen X ikke atomisk.

I nogle sammenhænge kan en “atom” operation lykkes eller mislykkes; hvis en sådan atomoperation mislykkes, skal effekten være nøjagtig den samme som hvis operationen aldrig var startet.

Kommentarer

  • Som en note er dette hvad Isolation betyder i ACID, ikke hvad Atomicitet betyder. Det ‘ er ikke klart, om din definition er beregnet til at falde sammen / dække ACID-begrebet atomicitet (som ikke er ‘ t frygtelig relevant for vilkårlig kode).

Svar

Jeg er ikke sikker på, at jeg kender en simpel, formel, abstrakt definition af “atom” til et programmeringssprog. Jeg kender mange forskellige på forskellige abstraktionsniveauer og med hensyn til forskellige emner. Jeg kender også nogle, der virker ret abstrakte, men som har ret sofistikerede forudsætninger (f.eks. Presheaf-modeller af samtidighed). En del af problemet er, at der er mange forskellige måder at sige to programmer “opfører sig” “ækvivalent”, og nogle definitioner kan respektere forskellige forestillinger om “ækvivalent”.

En skitse (som jeg laver op lige nu) af en tilgang med hensyn til en sammenflettende model for samtidighed er: Givet en operationel semantik er en sekvens af udsagn udført atomisk hvis alle overgange (af den operationelle semantik), der involverer disse udsagn, sker i rækkefølge. En sekvens af udsagn er atomisk hvis alle mulige sekvenser af overgange udfører sekvensen af udsagn atomisk. Vi kunne løsne dette til et “ som om de blev udført atomisk”, som vi måske begynder at formalisere ved at sige, at alle mulige sekvenser af overgange er ækvivalente ( formodentlig observationsmæssigt ækvivalent) til en sekvens af overgange, der udfører udsagnene atomisk.

B asisk betyder eksekveret atomisk, at når vi først begynder at udføre en række udsagn, skal vi ikke sammenflette eksekveringen nogen anden erklæring i udførelsen af sekvensen.Implementeringsmæssigt kan det betyde, at vi kun udfører en tråd ad gangen som i en tidsskåret implementering af tråde, og en sekvens af udsagn, der udføres atomisk, betyder, at der ikke var nogen kontekstskifter under deres udførelse. Ovenstående definition har et problem ved, at det ikke rigtig håndterer koordination mellem tråde godt. Det ville ikke rigtig give mening at sige, at kommunikation langs en kanal mellem to tråde f.eks. Altid var atomisk. (Ofte taler vi om operationer på en datastruktur som atomare, og det ville sandsynligvis være mere passende for dette eksempel. Definitionen ville være specifik for datastrukturen.)

For dit eksempelprogram og forudsat en operationel semantik, hvor en print udsagn kunne håndteres i en enkelt overgang, så ville program 2 altid udføres atomisk og er (temmelig trivielt) atomisk. Din anden udførelse beskriver et scenario, hvor program 1 udføres atomisk, mens din første ikke gør det. Hvis der altid var en mekanisme, der garanterede din anden udførelse, kunne du sige, at Program 1 (med den mekanisme) var atomisk, men ellers ville det formodentlig ikke være atomisk alene.

Som nævnt i min kommentar, “atom” bruges ofte i en uformel og / eller implementeringsorienteret betydning. Derfor er det, hvad nøjagtigt er, ofte uklart, selv om ånden i det, der er beregnet, normalt er rimelig klar.

Svar

Den dybe mørke gamle oprindelse af ordet Atomic i programmering refererer til en samling sproginstruktion ATOMIC. På samme måde som en gruppe af individuelle partikler (proton, neutron, elektron) danner en enkelt ubrydelig enhed kaldet et atom, refererer ATOMIC ved programmering til en gruppe samleinstruktioner, der danner en enkelt uafbrydelig enhedsinstruktion . Den første monteringsinstruktion er ATOMIC, som suspenderer alle afbrydelser, indtil afbrydelser genoptages med noget som UNATOMIC.

Siden da er ordet ATOMIC blevet misbrugt groft ved markedsføring. At kalde en enkelt instruktion ATOMIC er bare fjollet.

ATOMIC var oprindeligt et akronym, jeg tror, det kunne have været “A seT? Of Multiple Instruction Clusters” – undskyld, ikke sikker på T, det har været mange år.

Kommentarer

  • Calling a single instruction ATOMIC is just silly Nå, der har været atomisk hukommelsesoverførsler, der involverer mere end en buscyklus, samt instruktioner som Test And Set .

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *