Souběh
Author
Albert FloresSouběh je chyba v systému nebo procesu, ve kterém jsou výsledky nepředvídatelné při nesprávném pořadí nebo načasování jeho jednotlivých operací. Souběh může nastat v elektronických systémech (zvláště u logických členů) a v počítačových programech (zejména ve víceúlohových a víceprocesorových systémech).
Souběh v počítačových programech
Souběh je v počítačových programech způsoben chybným současným zpracováním sdílených dat. Pokud by byla data zpracována postupně, k chybě by nedošlo. +more Problémem je, že ke změně dat dojde ve chvíli, kdy se se stejnými daty již pracuje jiná úloha. Souběh způsobuje změna kontextu ve víceúlohových systémech nebo současné zpracování úloh na víceprocesorových systémech.
Kritická oblast je označení dat, která jsou souběhem ohrožena. Kritická sekce je nejmenší část programu, která pracuje s daty v kritické oblasti.
Souběh v číslicové technice
Souběh může příležitostně nastat i u logických členů, protože různé části obvodu mohou mít různou délku odezvy a je tak možné se dostat do kolizního stavu (viz Grayův kód).
Předcházení souběhu
Atomické instrukce
Atomické instrukce procesoru jsou vždy vykonány bez přerušení. Lze je využít ve víceúlohových systémech s jedním procesorem. +more Nepomohou ve víceprocesorových systémech, kde dochází ke skutečnému paralelnímu zpracování dat.
Zakázání přerušení
Zakázání přerušení umožňuje vytvořit atomickou operaci z více strojových instrukcí. Na začátku operace je přerušení zakázáno, po dokončení operace je opět povoleno. +more Sled instrukcí tak nemůže být nijak přerušen. Protože je však zakázání přerušení velmi nebezpečné pro stabilitu systému, může tuto metodu zpravidla používat pouze operační systém. Zakázání přerušení není možné použít ve víceprocesorových systémech.
Instrukce TSL
Instrukce TSL umožňuje vytvořit zámek, který zajistí pouze jedinému procesu vstup do kritické sekce.
Semafor
Semafor je zobecněním instrukce TSL.
Příklady souběhu
Sdílené soubory
Výše výplat jednotlivých zaměstnanců je uložena v souborech, které jsou sdíleny. Sekretářka přidává všem zaměstnancům v účetním programu 100 korun. +more Když otevře sdílený soubor s výplatou posledního zaměstnance, změny neuloží a přeruší práci (jde nadřízenému uvařit kafe). Obsah souboru zůstane načten v paměti počítače. Nadřízený mezitím otevře stejný soubor výplatou posledního zaměstnance (tedy načte stejnou původní částku jako sekretářka) a rozhodne se mu přidat na prémiích 1000 korun. K zobrazené výplatě přičte 1000 korun, částku přepíše a změněný soubor uloží. Sekretářka se mezi tím vrátí ke svému počítači. Vidí původní výplatu (nikoliv zvýšenou částku), přičte 100 korun a změněný soubor uloží. Výsledkem je, že zaměstnanec přišel o 1000 korun od nadřízeného a výplata byla zvýšena jen o částku 100 korun od sekretářky (zápis sekretářky přemazal změnu provedenou nadřízeným).
Sdílené proměnné
Dva procesy sdílí proměnnou Konto. Střídavě (díky multitaskingu) zaúčtovávají změny, přičemž výsledek si připravují ve svých privátních proměnných Pom1 a Pom2. +more První proces nejprve spočítá zvýšení o 1000 korun v proměnné Pom1, ale výsledek nestihne uložit do společné proměnné Konto, protože dojde ke změně kontextu (přepnutí do druhého procesu). Druhý proces od částky v proměnné Konto odečte 1000 korun a výsledek uloží zpět do společné proměnné Konto. Po další změně kontextu dojde v prvním procesu k přepsání částky v proměnné Konto obsahem proměnné Pom1 (je v ní uložen předtím provedený výpočet). Výsledkem této posloupnosti je ztráta odečtené částky (v proměnné Konto bude jen zvýšená částka od prvního procesu).
1. proces 2. proces
Pom1 := Konto; Pom1 := Pom1 + 1000; ------------------------> Pom2 := Konto; Pom2 := Pom2 - 1000; Konto := Pom2; <------------------------ Konto := Pom1;