Hva er den eksakte definisjonen av ' atomicitet ' i programmering?

definisjonen av «atomicitet» sier at en transaksjon skal kunne avsluttes uten å bli berørt eller manipulert av muligens samtidige kjørende handlinger under prosessen. Men betyr det også at et program ikke skal kjøre samtidig når det skal være atomisk?

la oss si at vi har 2 program som eksempel:

eksempel_program1:

teller int i = 1 til 100 hvert sekund

hvert tall skrives ut i en ny linje

eksempel_program2:

skriver bare ut » hei »

og et overordnet program som inkluderer begge disse programmene og kjører dem en gang mottar et signal for å starte et spesifikt program (f.eks. via sigaction i linux) med 2 versjon:

versjon 1:

kjører programmet (til og med samtidig) når som helst når signalet mottas

som betyr at program2 kan skrive ut » hei » mens program1 fremdeles skriver ut tallene

versjon 2:

kjøre ett program om gangen

signalet for det andre programmet er blokkert til det pågående programmet er avsluttet

i dette eksemplet, kan bare versjon 2 betraktes som atomisk eller begge deler? Ville dette programmet bare være ikke-atomisk hvis f.eks. Program2 økte i med 1 under prosessen?

Kommentarer

  • Begrepet » atomisk » brukes på (flere) forskjellige måter i ulik sammenheng. Noen ganger på veldig like, men likevel forskjellige måter. Det brukes ofte også uformelt. Spørsmålet ditt starter med en definisjon som ser ut til å være basert på databaseteori, men snakker deretter om programmer. Definisjonen din snakker om » transaksjoner «, men det er ingen transaksjoner i programmet ditt. Det ‘ er sannsynlig at du utilsiktet bruker feil definisjon av » atomisk «. (Din definisjon av atomicitet samsvarer heller ikke med ‘ betydningen av den a la ACID.)

Svar

Hvis en operasjon X er atomær, betyr det at alle som observerer operasjonen vil se den enten ennå ikke startet, eller som fullført, og ikke i noen tilstand som er delvis fullført. Det er det.

Selvfølgelig, hvis du skriver kode for å utføre en operasjon X, og annen kode kan se den utført halvparten, eller forstyrre den, så er ikke implementeringen din av operasjonen X atomisk.

I noen sammenhenger kan en «atom» -operasjon lykkes eller mislykkes. Hvis en slik atomoperasjon mislykkes, må effekten være nøyaktig den samme som om operasjonen aldri hadde blitt startet.

Kommentarer

  • Som et notat, dette er hva isolasjon betyr i ACID, ikke hva Atomicity betyr. Det ‘ er ikke klart om din definisjon er ment å sammenfalle / dekke ACID-forestillingen om atomisitet (som ikke er ‘ t veldig relevant for vilkårlig kode).

Svar

Jeg er ikke sikker på at jeg vet om en enkel, formell, abstrakt definisjon av «atom» for et programmeringsspråk. Jeg vet om mange forskjellige på forskjellige nivåer av abstraksjon og med hensyn til ulike emner. Jeg kjenner også noen som virker ganske abstrakte, men som har ganske sofistikerte forutsetninger (f.eks. Presheaf-modeller av samtidighet). En del av problemet er at det er mange forskjellige måter å si to programmer «oppfører seg» «ekvivalent», og noen definisjoner kan respektere forskjellige forestillinger om «ekvivalent».

En skisse (som jeg lager opp akkurat nå) av en tilnærming med hensyn til en sammenflettingsmodell for samtidighet er: Gitt en operativ semantikk, er en sekvens av utsagn utført atomisk hvis alle overganger (av den operative semantikken) som involverer disse utsagnene skjer i rekkefølge. En sekvens av utsagn er atomisk alle mulige sekvenser av overganger utfører rekkefølgen av uttalelser atomisk. Vi kunne løsne dette til et « som om de ble utført atomisk» som vi kanskje begynne å formalisere ved å si at alle mulige overgangssekvenser er ekvivalente ( antagelig observasjonsmessig ekvivalent) til en sekvens av overganger som utfører uttalelsene atomisk.

B asisk betyr eksekvert atomisk at når vi begynner å utføre noen sekvens av utsagn, fletter vi ikke henrettelsen noen annen uttalelse i utførelsen av sekvensen.Implementeringsmessig kan dette bety at vi bare utfører en tråd om gangen som i en tidsavskjærende implementering av tråder, og en sekvens av uttalelser utført atomisk betyr at det ikke var noen kontekstbrytere under utførelsen. Definisjonen ovenfor har et problem ved at den ikke virkelig håndterer koordinering mellom trådene. Det ville ikke være fornuftig å si at kommunikasjon langs en kanal mellom to tråder, for eksempel, alltid var atomisk. (Ofte snakker vi om operasjoner på en datastruktur som atomare, og det vil sannsynligvis være mer hensiktsmessig for dette eksemplet. Definisjonen vil være spesifikk for datastrukturen.)

For eksempelprogrammet ditt og forutsatt en operativ semantikk der en print uttalelse kan håndteres i en enkelt overgang, så vil Program 2 alltid bli utført atomisk og er (ganske trivielt) atomisk. Din andre utførelse beskriver et scenario der Program 1 kjøres atomisk mens din første ikke gjør det. Hvis det alltid var en mekanisme som garanterte at den andre utførelsen din alltid skjedde, kan du si at Program 1 (med den mekanismen) var atomisk, men ellers ville det antagelig ikke være atomisk alene.

Som nevnt i min kommentar, «atom» brukes ofte i en uformell og / eller implementeringsorientert forstand. Derfor er det ofte uklart hva nøyaktig er ment, selv om ånden til det som er ment er vanligvis rimelig klar.

Svar

Ordet Atomics dype mørke eldgamle opprinnelse i programmeringen refererer til en monteringsspråkinstruksjon ATOMIC. På samme måte som en gruppe individuelle partikler (proton, nøytron, elektron) danner en enkelt ubrytelig enhet kalt et atom, refererer ATOMIC i programmering til en gruppe monteringsinstruksjoner som danner en enkelt uavbrutt enhetsinstruksjon . Den første monteringsinstruksjonen er ATOMIC, som avbryter alle avbrudd til avbrudd blir startet på nytt med noe sånt som UNATOMIC.

Siden da har ordet ATOMIC blitt grovt misbrukt av markedsføring. Å kalle en enkelt instruksjon ATOMIC er bare dumt.

ATOMIC var opprinnelig et akronym, jeg tror det kan ha vært «A seT? Of Multiple Instruction Clusters» – beklager, ikke sikker på T, det har vært mange år.

Kommentarer

  • Calling a single instruction ATOMIC is just silly vel, det har vært atomisk minneoverføringer som involverer mer enn en bussyklus, samt instruksjoner som Test And Set .

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *