Vilken exakt definition av ' atomicitet ' vid programmering?

definitionen av ”atomicitet” säger att en transaktion ska kunna avslutas utan att beröras eller manipuleras av eventuellt samtidigt körande åtgärder under processen. Men betyder det också att ett program inte ska köras samtidigt när det ska vara atomiskt?

låt oss säga att vi har 2 program som exempel:

exempel_program1:

räknar int i = 1 till 100 varje sekund

varje nummer skrivs ut i en ny rad

exempel_program2:

skriver bara ut " hej "

och ett överordnat program som innehåller båda dessa program och kör dem en gång mottagande av en signal för att starta ett specifikt program (t.ex. via sigaction i linux) med 2 version:

version 1:

kör programmet (även samtidigt) när som helst när signalen tas emot

vilket betyder att program2 kan skriva ut " hej " medan program1 fortfarande skriver ut siffrorna

version 2:

endast kör ett program i taget

signal för andra program blockeras tills pågående program har avslutats

i detta exempel, kan bara version 2 betraktas som atomär eller båda? Skulle detta program endast vara icke-atomiskt om t.ex. program2 skulle öka i med 1 under dess process?

Kommentarer

  • Termen " atomisk " används på (flera) olika sätt i olika sammanhang. Ibland på mycket lika men ändå olika sätt. Det används ofta också informellt. Din fråga börjar med en definition som verkar baseras på databastekniken, men sedan talar om program. Din definition talar om " transaktioner " men det finns inga transaktioner i ditt program. Det ' är troligt att du oavsiktligt använder fel definition av " atomisk ". (Din definition av atomicitet överensstämmer inte heller med ' betydelsen av det a la ACID.)

Svar

Om en operation X är atomär, betyder det att alla som observerar operationen kommer att se den antingen ännu inte startad eller som slutförd och inte i något tillstånd som är delvis slutfört. Det är det.

Självklart, om du skriver kod för att utföra en operation X, och andra koder kan se den halvt utförd eller störa den, så är din implementering av operationen X inte atomisk.

I vissa sammanhang kan en ”atom” operation lyckas eller misslyckas. Om en sådan atomoperation misslyckas måste effekten vara exakt densamma som om operationen aldrig hade startats.

Kommentarer

  • Som en anteckning är detta vad Isolation betyder i ACID, inte vad Atomicitet betyder. Det ' är inte klart om din definition är avsedd att sammanfalla / täcka ACID-begreppet atomicitet (vilket inte är ' t väldigt relevant för godtycklig kod).

Svar

Jag är inte säker på att jag känner till en enkel, formell, abstrakt definition av ”atom” för ett programmeringsspråk. Jag känner till många olika på olika abstraktionsnivåer och med avseende på olika ämnen. Jag känner också till vissa som verkar ganska abstrakta men som har ganska sofistikerade förutsättningar (t.ex. förkonfigurationsmodeller av samtidighet). En del av problemet är att det finns många olika sätt att säga två program ”beter sig” ”likvärdigt” och vissa definitioner kan respektera olika uppfattningar om ”ekvivalent”.

En skiss (som jag gör upp just nu) av ett tillvägagångssätt med avseende på en interleaving-modell av samtidighet är: Med tanke på en operativ semantik är en sekvens av uttalanden exekverad atomiskt om alla övergångar (av den operativa semantiken) som involverar dessa uttalanden sker i sekvens. En sekvens av uttalanden är atomisk om alla möjliga sekvenser av övergångar exekverar sekvensen av uttalanden atomiskt. Vi kan lossa detta till en ” som om de kördes atomiskt” som vi kan börja formalisera genom att säga att alla möjliga övergångssekvenser är ekvivalenta antagligen observationsmässigt ekvivalenta) till en sekvens av övergångar som exekverar uttalandena atomiskt.

B asiskt betyder exekverat atomiskt att när vi börjar köra någon sekvens av uttalanden, lägger vi inte in exekveringen något annat uttalande i exekveringen av sekvensen.Implementeringsmässigt kan detta innebära att vi bara kör en tråd åt gången som vid en tidsskivad implementering av trådar, och en sekvens av uttalanden som utförs atomiskt betyder att det inte fanns några kontextväxlar under deras körning. Ovanstående definition har en fråga genom att den inte verkligen hanterar samordning mellan trådar. Det skulle verkligen inte vara meningsfullt att säga att kommunikation längs en kanal mellan två trådar till exempel alltid var atomisk. (Ofta talar vi om operationer på en datastruktur som atomiska, och det skulle förmodligen vara mer lämpligt för detta exempel. Definitionen skulle vara specifik för datastrukturen.)

För ditt exempelprogram och antar en operativ semantik där ett print -uttalande kunde hanteras i en enda övergång, då skulle program 2 alltid utföras atomiskt och är (ganska triviellt) atomiskt. Ditt andra utförande beskriver ett scenario där program 1 körs atomiskt medan ditt första inte gör det. Om det fanns någon mekanism som garanterade att ditt andra utförande alltid hände, kan du säga att Program 1 (med den mekanismen) var atomiskt, men annars skulle det antagligen inte vara atomärt på egen hand.

Som nämnts i min kommentar, ”atom” används ofta i en informell och / eller implementeringsinriktad mening. Därför är det ofta oklart vad exakt är avsett, men andan i vad som är tänkt är vanligtvis rimligt tydlig.

Svar

Ordet Atomics djupa mörka uråldriga ursprung i programmering hänvisar till en monteringsspråk ATOMIC. På samma sätt som en grupp av enskilda partiklar (proton, neutron, elektron) bildar en enda okrossbar enhet som kallas en atom, avser ATOMIC vid programmering en grupp monteringsinstruktioner som bildar en enda avbrottsfri enhetsinstruktion . Den första monteringsinstruktionen är ATOMIC som avbryter alla avbrott tills avbrott återinitieras med något liknande UNATOMIC.

Sedan dess har ordet ATOMIC missbrukats grovt genom marknadsföring. Att kalla en enda instruktion ATOMIC är bara dumt.

ATOMIC var ursprungligen en akronym, jag tror att det kan ha varit ”A seT? Of Multiple Instruction Clusters” – sorry, inte säker på T, det har varit många år.

Kommentarer

  • Calling a single instruction ATOMIC is just silly ja, det har funnits atomisk minneöverföringar som involverar mer än en busscykel, samt instruktioner som Test And Set .

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *