Atomicita
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.
Hardware
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
Atomicitu diskových operací vybrané souborové systémy mohou garantovat různými způsoby. Například:
- některé souborové systémy FAT mohou podporovat tzv. TFAT – transakčně bezpečný FAT.
- v původní formě pomocí udržování dvou alokačních tabulek – FAT0 a FAT1, s tím, že změny během diskových operací se zaznamenávaly na FAT1 a teprve po jejich dokončení se zkopírovaly na FAT0
- u systému exFAT se TFAT řeší softwarovým driverem specifickým pro daný typ média i operační systém
- na Windows NT souborový systém NTFS podporuje tzv. Access control lists, ACL
- distribuovaný souborový systém Google File System zaručuje atomicitu přepisování dat více klienty pomocí funkce record append.
- viz také žurnálovací systém souborů
Programy
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.
Skripty
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]
Databáze
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í.
Odkazy
Reference
Související články
Externí odkazy
- Atomicita operací v PHP, Jakub Vrána