Přeskočit na obsah

Atomicita

Z Wikipedie, otevřené encyklopedie

Atomicita neboli nedělitelnost je důležitá vlastnost v programování. Znamená, že daná činnost (operace) se provede najednou, nemůže být přerušena něčím jiným a později dokončena.

Na hardwarové úrovni je atomicita zajišťována nedělitelností strojových instrukcí. Strojové instrukce jsou obvykle atomické ve vztahu k procesoru, protože jejich vykonávání nelze přerušit – přijde-li v průběhu zpracování atomické instrukce externí signál (interrupt), je proveden až po dokončení instrukce. Výjimkou mohou být například instrukce, které obsahují vnitřní cyklus (instrukce pro práci s řetězci; na procesorech s instrukční sadou x86 se jedná o instrukce s prefixem REP). U moderních procesorů (s instrukční sadou x86 se jedná o procesory od Pentia výš) je zachování atomicity i jednoduchých instrukcí netriviální, protože ve skutečnosti provádí několik instrukcí najednou, mimo pořadí dané programem, a jejich atomicitu musí emulovat.

U víceprocesorových systémů je zajištění atomicity instrukcí ještě komplikovanější; procesor musí obsahovat instrukce, které jsou atomické vzhledem k paměti – tedy pomocí zamknutí sběrnice a správným nastavením mezipamětí je zajištěno, že žádné jiné zařízení (především jiný procesor) nepřistoupí ke stejné adrese paměti dokud tato instrukce není dokončena. Pomocí takových instrukcí lze implementovat synchronizační primitiva, tedy zámky a semafory. Samozřejmě ne každou instrukci lze takto použít – musí to být instrukce, která paměť zároveň čte a modifikuje. Na architektuře x86 se jedná o xchg, cmpxchg8b s prefixem lock a bts s prefixem lock.

Souborový systém

[editovat | editovat zdroj]

Atomicitu diskových operací vybrané souborové systémy mohou garantovat různými způsoby. Například:

Na úrovni programu se atomicita zajišťuje pomocí synchronizačních primitiv, přestože někdy je tento fakt skryt. Například pro bezpečnost je důležité, že funkce pro otevření souboru dokáže otestovat existenci souboru a vytvořit ho atomicky, tedy bez rizika že mezi testem a otevřením soubor vytvoří nebo smaže někdo jiný. Uvnitř operačního systému je tato vlastnost zajištěna pomocí zámku na příslušné položce adresáře.

Skriptovací jazyky a jednodušší programovací jazyky většinou nemají k dispozici funkce na zasahování do delikátnějších částí chodu operačního systému nebo procesoru, tak si jejich autoři u citlivějších operací musejí pomoci nějak jinak. Vznikají tak různé ad hoc konstrukce, které co do funkčnosti emulují různé prostředky synchronizace, např. semafory nebo ve složitějších případech emulace transakcí pomocí logování prováděných operací pro jejich případné navrácení do původního v případě selhání. Při řešení atomicity manipulace v databázi lze v některých případech využít chybových návratových kódů.[1] Atomicitu diskových operací (často je to zápis do souboru) lze řešit vytvářením dočasných souborů a jejich přejmenování/přesunutí do cílového souboru ve finále. Existují i pro to určené objektové třídy.[2]

Pro databázi platí, že transakce by měla být atomická ve vztahu k ostatním transakcím. Tedy transakce A nastala buď před transakcí B, nebo po ní, ale nemohla probíhat současně. Přesněji, ve skutečnosti současně probíhala, ale synchronizace provedená databázovým serverem zajišťuje, že databáze bude vypadat jako kdyby všechny transakce proběhly popořadě. Pokud to nebude možné (dojde k deadlocku), provede ROLLBACK některé transakce a zkusí ji provést znovu na novém stavu databáze.

Atomicita transakce zároveň znamená, že pokud transakce selže, selže jako celek, tedy všechny zápisy které provedla budou při rollbacku vráceny a žádná jiná transakce žádný z těchto zápisů neuvidí.

Související články

[editovat | editovat zdroj]

Externí odkazy

[editovat | editovat zdroj]