Souběh

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Souběh (anglicky race condition) 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[editovat | editovat zdroj]

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. 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[editovat | editovat zdroj]

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[editovat | editovat zdroj]

Atomické instrukce[editovat | editovat zdroj]

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. 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í[editovat | editovat zdroj]

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. 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[editovat | editovat zdroj]

Instrukce TSL (anglicky Test and Set Lock) umožňuje vytvořit zámek, který zajistí pouze jedinému procesu vstup do kritické sekce.

Podrobnější informace naleznete v článku Test-and-set.

Semafor[editovat | editovat zdroj]

Semafor je zobecněním instrukce TSL.

Související informace naleznete také v článku Semafor (synchronizace).

Příklady souběhu[editovat | editovat zdroj]

Sdílené soubory[editovat | editovat zdroj]

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. 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é[editovat | editovat zdroj]

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. 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;

Literatura[editovat | editovat zdroj]

  • KOLÁŘ, Petr. Operační systémy [online]. Liberec: 2005-02-01, [cit. 2008-08-30]. Dostupné online.