1.3. Synchronizace

Komunikace mezi vlákny v rámci jednoho procesu je jednodušší než komunikace mezi různými procesy, a to právě díky sdílené paměti, pomocí které mohou vlákna komunikovat. Na druhé straně je třeba zajistit, aby vlákna k této sdílené paměti přistupovala synchronizovaně, aby nedocházelo např. k přepisu jedné informace několika vlákny současně. Problematika synchronizace procesů a vláken se studuje zejména v oblasti operačních systémů, i když v současné době je aktuální i při programování uživatelských aplikací.

Pokud nezajistíme synchronizovaný přístup ke sdíleným zdrojům (v rámci téže aplikace nebo i mezi více aplikacemi současně), může to vést k situacím jako je uváznutí nebo časový souběh. Při uváznutí (deadlock) přestanou dvě vlákna reagovat, neboť na sebe vzájemně čekají. Časový souběh nastává tehdy, pokud může k nějaké zvláštní situaci dojít v závislosti na kritickém načasování dvou událostí.

Příklad 1.1. Bankovní transakce

Uvažujme situaci, kdy si majitel účtu ukládá v bance 500 Kč, zatímco jeho syn vybírá z účtu 9500 Kč platební kartou. To znamená, že bankovní server obdrží oba požadavky na data o účtu v témže čase. Je zřejmé, že by se měl stav účtu snížit celkem o 9000 Kč. K tomu, aby obě transakce proběhly správně, je však nutné obě činnosti synchronizovat.

Předpokládejme, že žádný synchronizační mechanismus nevyužijeme. Pak vlákno realizující vložení na účet (označme ho jako vlákno A) nejprve zjistí stav účtu. Poté může nastat přepnutí kontextu a stav účtu si zjistí také vlákno B, které vypočte novou výši bankovního konta po provedení výběru a tu zapíše zpět. Vlákno A pak udělá totéž, ovšem bude zcela ignorovat předchozí činnost vlákna B a stav účtu přepíše svým výsledkem výpočtu. Banka tak bude ochuzena o celou vybranou částku. Pokud ovšem v podobné situaci zapíše svůj výsledek dříve vlákno B, přijde o vloženou částku pro změnu majitel účtu. Tento příklad ilustruje typický časový souběh dvou operací bez synchronizace.

Abychom se tomuto problému vyhnuli, musíme zajistit, aby v době, kdy jedno vlákno čte nebo zapisuje sdílená data, k nim nemohlo přistupovat žádné jiné vlákno.

K synchronizaci přístupu ke sdíleným zdrojům se používají synchronizační objekty. Synchronizační objekt dává svému vlastníkovi právo přístupu ke sdílenému zdroji. Vlákno tedy musí na obdržení synchronizačního objektu čekat a až poté teprve může ke sdílenému zdroji přistupovat. Po ukončení operace objekt uvolní a tím umožní jeho přidělení případnému dalšímu vláknům, které čeká ve frontě spojené se synchronizačním objektem.

Typické sdílené zdroje vyžadující synchronizaci souběžného přístupu lze rozdělit do následujících skupin:


Úkol k zamyšleníÚkol k zamyšlení
Která periferní zařízení počítače typicky vyžadují synchronizaci procesů, které s nimi pracují? Jak je tato synchronizace zajištěna?