Wat is de exacte definitie van ' atomicity ' in het programmeren?

de definitie van “atomicity” zegt dat een transactie beëindigd moet kunnen worden zonder aangeraakt of gemanipuleerd te worden door mogelijk gelijktijdig lopende acties tijdens het proces. Maar betekent dat ook dat een programma niet gelijktijdig mag draaien als het atomisch zou moeten zijn?

laten we zeggen dat we 2 programmas als voorbeeld hebben:

example_program1:

telt int i = 1 tot 100 elke seconde

elk nummer wordt op een nieuwe regel afgedrukt

example_program2:

drukt alleen af ” hoi ”

en een bovenliggend programma dat beide programmas bevat en ze uitvoeren zodra ze een signaal ontvangen om een specifiek programma te starten (bijv. via sigaction in linux) met 2 versie:

versie 1:

voert het programma uit (zelfs gelijktijdig) zodra het signaal is ontvangen

wat betekent dat programma2 ” hi ” kan afdrukken terwijl programma1 nog bezig is met het afdrukken van de nummers

versie 2:

alleen één programma tegelijk uitvoeren

signaal voor ander programma wordt geblokkeerd totdat het lopende programma is beëindigd

kan in dit voorbeeld alleen versie 2 wordt beschouwd als atomair of beide? Zou dit programma alleen niet-atomair zijn als bijv. Programma2 i tijdens het proces met 1 zou verhogen?

Opmerkingen

  • De term ” atomic ” wordt op (meerdere) verschillende manieren in verschillende contexten gebruikt. Soms op zeer vergelijkbare maar toch verschillende manieren. Het wordt ook vaak informeel gebruikt. Uw vraag begint met een definitie die lijkt te zijn gebaseerd op databasetheorie, maar gaat dan over programmas. Uw definitie heeft het over ” transacties ” maar er zijn geen transacties in uw programma. Het ‘ is waarschijnlijk dat u per ongeluk de verkeerde definitie van ” atomic ” gebruikt. (Uw definitie van atomiciteit komt ook niet ‘ overeen met de betekenis ervan a la ACID.)

Antwoord

Als een operatie X atomair is, betekent dit dat iedereen die de operatie observeert, deze zal zien als nog niet gestart of als voltooid, en niet in een staat die gedeeltelijk is voltooid. Dat is alles.

Het is duidelijk dat als je code schrijft om een operatie X uit te voeren, en andere code kan zien dat deze half uitgevoerd wordt, of ermee interfereert, dan is je implementatie van de operatie X niet atomair.

In sommige contexten kan een “atomaire” bewerking slagen of mislukken; als zon atomaire bewerking mislukt, moet het effect precies hetzelfde zijn alsof de bewerking nooit was gestart.

Opmerkingen

  • Let op: dit is wat Isolatie betekent in ACID, niet wat Atomicity betekent. Het ‘ is niet duidelijk of je definitie is bedoeld om samen te vallen / het ACID-begrip van atomiciteit te dekken (wat n ‘ t verschrikkelijk relevant is voor willekeurige code).

Antwoord

Ik “weet niet zeker of ik een eenvoudige, formele, abstracte definitie van” atomisch “voor een programmeertaal ken. Ik ken veel verschillende op verschillende abstractieniveaus en met betrekking tot verschillende onderwerpen. Ik ken er ook enkele die redelijk abstract lijken, maar redelijk geavanceerde vereisten hebben (bijv. Presheaf-modellen van concurrency). Een deel van het probleem is dat er veel verschillende manieren zijn om te zeggen dat twee programmas “zich” “equivalent” gedragen en dat sommige definities verschillende noties van “equivalent” kunnen respecteren.

Een schets (die ik maak op dit moment) van een benadering met betrekking tot een interleaving-model van gelijktijdigheid is: Gegeven een operationele semantiek, wordt een reeks instructies atomair uitgevoerd als alle overgangen (van de operationele semantiek) met betrekking tot die instructies achter elkaar plaatsvinden. Een reeks instructies is atomair if alle mogelijke sequenties van overgangen voert de sequentie van instructies atomair uit. We zouden dit kunnen losmaken tot een “ alsof ze atomair werden uitgevoerd”, wat we zouden kunnen beginnen te formaliseren door te zeggen dat alle mogelijke sequenties van overgangen equivalent zijn ( vermoedelijk observationeel equivalent) aan een reeks overgangen die de uitspraken atomair uitvoert.

B atoomisch uitgevoerd betekent dat als we eenmaal beginnen met het uitvoeren van een reeks instructies, we de uitvoering van een andere instructie niet tussenvoegen in de uitvoering van de reeks.Implementatie-gewijs kan dit betekenen dat we slechts één thread tegelijk uitvoeren, zoals bij een time-slicing-implementatie van threads, en een opeenvolging van statements die atomair worden uitgevoerd, betekent dat er geen contextwisselingen waren tijdens hun uitvoering. De bovenstaande definitie heeft een probleem omdat het de coördinatie tussen threads niet echt goed afhandelt. Het zou niet echt logisch zijn om te zeggen dat communicatie via een kanaal tussen twee threads bijvoorbeeld ooit atomair was. (Vaak spreken we over bewerkingen op een datastructuur als zijnde atomair, en dat zou waarschijnlijk geschikter zijn voor dit voorbeeld. De definitie zou specifiek zijn voor de datastructuur.)

Voor uw voorbeeldprogramma en uitgaande van een operationele semantiek waarbij een print -instructie in een enkele overgang zou kunnen worden afgehandeld, dan zou Programma 2 altijd atomair worden uitgevoerd en is (tamelijk triviaal) atomair. Uw tweede uitvoering beschrijft een scenario waarin programma 1 atomair wordt uitgevoerd, terwijl uw eerste dat niet doet. Als er een mechanisme was dat garandeerde dat je tweede uitvoering altijd gebeurde, dan zou je kunnen zeggen dat Programma 1 (met dat mechanisme) atomair was, maar anders zou het vermoedelijk op zichzelf niet atomair zijn.

Zoals vermeld in mijn opmerking: “atomair” wordt vaak in informele en / of implementatiegerichte zin gebruikt. Daarom is wat precies bedoeld is vaak onduidelijk, hoewel de geest van wat wordt bedoeld meestal redelijk duidelijk is.

Antwoord

De diepdonkere oude oorsprong van het woord Atomic in het programmeren verwijst naar een assembleertaalinstructie ATOMIC. Op dezelfde manier waarop een groep individuele deeltjes (proton, neutron, elektron) een enkele onbreekbare eenheid vormt, een atoom genaamd, verwijst ATOMIC bij het programmeren naar een groep montage-instructies die een enkele ononderbreekbare eenheidsinstructie vormen . De eerste montage-instructie is ATOMIC, die alle onderbrekingen opschort totdat onderbrekingen opnieuw worden gestart met zoiets als UNATOMIC.

Sindsdien is het woord ATOMIC op grove wijze misbruikt door marketing. Het aanroepen van een enkele instructie ATOMIC is gewoon dom.

ATOMIC was oorspronkelijk een acroniem, ik denk dat het misschien “A seT? Of Multiple Instruction Clusters” was – sorry, ik ben niet zeker van de T, het is vele jaren.

Reacties

  • Calling a single instruction ATOMIC is just silly nou, er zijn atomic geheugenoverdrachten waarbij meer dan één buscyclus betrokken is, evenals instructies zoals Test And Set .

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *