definice „atomicity“ říká, že transakce by měla být schopna být ukončena, aniž by se jí dotýkaly nebo manipulovaly případné souběžné běžící akce během jejího procesu. Znamená to ale také to, že by program neměl běžet souběžně, když má být atomový?
Řekněme, že máme 2 programy jako příklad:
example_program1:
počítá každou sekundu int i = 1 až 100
každé číslo je vytištěno v novém řádku
example_program2:
pouze vytiskne " ahoj "
a nadřazený program, který zahrnuje oba tyto programy a spustí je, jakmile obdrží signál ke spuštění konkrétního programu (např. prostřednictvím sigaction v linuxu) s verzí 2:
verze 1:
spustí program (i souběžný) kdykoli po přijetí signálu
což znamená, že program2 může tisknout " ahoj " zatímco program1 stále tiskne čísla
verze 2:
pouze spouštět jeden program najednou
signál pro druhý program je blokován, dokud nedojde k ukončení probíhajícího programu
v tomto příkladu lze pouze verze 2 být považována za atomovou nebo obojí? Byl by tento program jiný než atomový, pouze pokud by např. Program2 během svého procesu zvýšil i o 1?
Komentáře
- Termín " atomic " se používá (několika) různými způsoby v různých souvislostech. Někdy velmi podobnými, ale stále různými způsoby. Často se používá také neformálně. Vaše otázka začíná definicí, která se zdá být založena na teorii databází, ale pak hovoří o programech. Vaše definice hovoří o " transakcích ", ale ve vašem programu nejsou žádné transakce. Je ' pravděpodobné, že neúmyslně používáte nesprávnou definici " atomické ". (Vaše definice atomicity také neodpovídá ' jejímu významu a la ACID.)
Odpověď
Pokud je operace X atomová, znamená to, že kdokoli pozorující operaci ji uvidí buď jako dosud nespuštěnou, nebo jako dokončenou, a ne v žádném stavu, který je částečně dokončen. To je vše.
Je zřejmé, že pokud napíšete kód k provedení operace X a další kód ji uvidí napůl provedenou, nebo do ní bude zasahovat, pak vaše implementace operace X není atomová.
V některých kontextech může „atomová“ operace uspět nebo selhat; pokud taková atomová operace selže, musí být účinek přesně stejný, jako kdyby operace nebyla nikdy spuštěna.
Komentáře
- Upozorňujeme, že to znamená izolace v ACID, ne to, co znamená Atomicity. ' není jasné, zda vaše Definice je zamýšlena tak, aby kryla / pokrývala představu ACID o atomicitě (která není ' příliš důležitá pro libovolný kód).
Odpověď
Nejsem si jistý, jestli vím o jednoduché, formální a abstraktní definici „atomic“ pro programovací jazyk. Vím o mnoha různých na různých úrovních abstrakce as ohledem na různá témata. Znám také některé, které se zdají být docela abstraktní, ale mají poměrně sofistikované předpoklady (např. Předspánkové modely souběžnosti). Část problému spočívá v tom, že existuje spousta různých způsobů, jak říci, že se dva programy „chovají“ „ekvivalentně“ a některé definice mohou respektovat různé pojmy „ekvivalent“.
Náčrt (který vytvářím) právě teď) jednoho přístupu s ohledem na model prokládání souběžnosti je: Vzhledem k operační sémantice je sekvence příkazů prováděna atomicky pokud všechny přechody (provozní sémantiky) zahrnující tyto příkazy nastanou v pořadí. Sekvence příkazů je atomická pokud všechny možné sekvence přechodů provádějí sekvenci příkazů atomově. Mohli bychom to uvolnit na „ jakoby byly provedeny atomově“, které bychom mohli začít formovat tím, že řekneme, že všechny možné sekvence přechodů jsou ekvivalentní ( pravděpodobně pozorovatelně ekvivalentní) posloupnosti přechodů, které provádějí příkazy atomicky.
B asically, executed atomically means that once we start executing some sequence of commands, we don „t interleave the execution any other statement into the execution of the sequence.Pokud jde o implementaci, mohlo by to znamenat, že provádíme pouze jedno vlákno najednou, jako v implementaci vláken s časovým řezem, a posloupnost příkazů provedených atomicky znamená, že během jejich provádění nebyly žádné kontextové přepínače. Výše uvedená definice má problém v tom, že skutečně nezvládá koordinaci mezi vlákny dobře. Ve skutečnosti by nemělo smysl říkat, že například komunikace podél kanálu mezi dvěma vlákny byla vždy atomová. (Často mluvíme o operacích na datové struktuře jako o atomových, a to by pravděpodobně bylo pro tento příklad vhodnější. Definice by byla specifická pro datovou strukturu.)
Pro váš ukázkový program a za předpokladu, že operační sémantika, kde by print
příkaz mohl být zpracován v jediném přechodu, pak by program 2 byl vždy proveden atomicky a je (celkem triviálně) atomový. Vaše druhé provedení popisuje scénář, kdy se program 1 provádí atomicky, zatímco první ne. Pokud by existoval nějaký mechanismus, který zaručoval, že by se vaše druhé provedení vždy stalo, pak byste mohli říci, že program 1 (s tímto mechanismem) byl atomový, ale jinak by pravděpodobně nebyl atomový sám o sobě.
Jak je uvedeno v mém komentář, „atomový“ se často používá v neformálním smyslu zaměřeném na implementaci. Proto je přesně zamýšleno často nejasné, i když duch toho, co je zamýšleno, je obvykle rozumně jasný.
Odpověď
Hluboký temný starověký původ slova Atomic v programování odkazuje na instrukci montážního jazyka ATOMIC. Stejným způsobem, že skupina jednotlivých částic (proton, neutron, elektron) tvoří jedinou nerozbitnou jednotku zvanou atom, v programování ATOMIC odkazuje na skupinu montážních instrukcí, které tvoří jednu nepřerušitelnou instrukci jednotky . První montážní instrukce je ATOMIC, která pozastaví všechna přerušení, dokud nebudou přerušení znovu zahájena něčím jako UNATOMIC.
Od té doby bylo slovo ATOMIC marketingem hrubě zneužito. Volání jedné instrukce ATOMIC je prostě hloupé.
ATOMIC byla původně zkratka, myslím, že to mohlo být „A SET? Of Multiple Instruction Clusters“ – omlouvám se, nejsem si jistý T, bylo to mnoho let.
Komentáře
-
Calling a single instruction ATOMIC is just silly
no, existovaly atomové přenosy paměti zahrnující více než jeden cyklus sběrnice a také pokyny jako Testovat a nastavovat .