====== Race Condition (Souběh) ====== **Race Condition** nastává v situaci, kdy dvě nebo více [[thread|vláken]] přistupují ke sdíleným datům a snaží se je změnit ve stejný okamžik. Protože operační systém může vlákna kdykoliv přerušit a vystřídat, konečný stav dat závisí na tom, které vlákno "doběhne" k zápisu jako první. ---- ====== Mechanismus vzniku: Problém "Přečti-Uprav-Zapiš" ====== Většina operací, které se zdají být jednoduché (např. ''x = x + 1''), se na úrovni procesoru skládá ze tří kroků. Pokud do nich zasáhne jiné vlákno, vzniká chaos. ===== Scénář chyby: ===== Představme si sdílenou proměnnou **Hodnota = 10** a dvě vlákna, která chtějí přičíst 1. 1. **Vlákno A** si přečte hodnotu (10). 2. *Systém přeruší Vlákno A a spustí Vlákno B.* 3. **Vlákno B** si přečte hodnotu (stále 10). 4. **Vlákno B** přičte 1 a zapíše výsledek (**11**). 5. *Systém přepne zpět na Vlákno A.* 6. **Vlákno A** (které si pamatuje 10) přičte 1 a zapíše výsledek (**11**). **Výsledek:** Místo očekávané hodnoty **12** (protože proběhly dvě operace) je v paměti pouze **11**. Jedna operace se "ztratila". ---- ====== Typy Race Condition ====== * **Kritická sekce:** Nejčastější typ (viz příklad výše), kdy více vláken manipuluje se stejnou proměnnou nebo souborem bez ochrany. * **Check-then-act:** Vlákno zkontroluje podmínku (např. "existuje soubor?") a poté provede akci. Mezi kontrolou a akcí však může jiné vlákno soubor smazat, což vede k pádu aplikace. ---- ====== Proč je tato chyba nebezpečná? ====== * **Nedeterminismus:** Program funguje správně v 99 % případů. Chyba se objeví jen tehdy, když dojde k naprosto přesnému (a nešťastnému) souběhu milisekund. * **Heisenbug:** Termín pro chyby, které zmizí, když se je pokusíte sledovat (např. přidáním výpisů do konzole, což změní časování vláken a chybu "maskuje"). * **Bezpečnostní riziko:** Útočníci mohou Race Condition využít k obcházení kontrol (např. v bankovnictví nebo při ověřování hesel). ---- ====== Jak se Race Condition bránit? ====== Základem obrany je zajistit, aby operace se sdílenými daty byly **atomické** (nepřerušitelné). 1. **[[mutex|Mutex]] (Zamykání):** Vlákno si "zamkne" data pro sebe a ostatní musí počkat, dokud operaci nedokončí. 2. **Atomické operace:** Speciální instrukce procesoru, které provedou "Přečti-Uprav-Zapiš" jako jeden nedělitelný krok na hardwarové úrovni. 3. **Neměnnost (Immutability):** Návrh systému tak, aby se data po vytvoření už nikdy neměnila (vlákna vždy vytvářejí novou kopii). ---- ====== Příklad z reálného světa: Therac-25 ====== Jedním z nejtragičtějších příkladů Race Condition byl ozařovací přístroj Therac-25 v 80. letech. Kvůli chybě v časování softwaru docházelo k tomu, že přístroj vyslal smrtelnou dávku záření, pokud operátor zadal příkazy příliš rychle za sebou. ---- //Související pojmy: Thread (Vlákno), Mutex, Deadlock, Multitasking, Synchronizace, Atomická operace.//