Synchronizace (informatika)
Synchronizace označuje v informatice dva podobné koncepty: synchronizace procesů a synchronizace dat. Synchronizace procesů označuje situaci, kdy se více procesů má v určitém okamžiku sejít (tzv. handshake) kvůli vzájemné dohodě nebo společné akci. Synchronizace dat znamená udržet více kopií dat (dataset) v soudržnosti nebo udržet integritu dat. Pro zajištění synchronizace dat jsou používána synchronizační primitiva.
Synchronizační primitiva
[editovat | editovat zdroj]Synchronizační primitiva jsou prostředky umožňující paralelně běžícím aplikacím ošetřit současný přístup ke sdíleným prostředkům. Ve smyslu algoritmu se jedná o rozhraní, a jeho implementace není důležitá. Chybné použití synchronizačních primitiv může vést k jejich neúčinnosti (tedy k prostředku stejně mohou přistoupit dva procesy najednou) nebo k deadlocku (vzájemnému zablokování).
Mezi synchronizační primitiva patří:
- zámek a semafor (zobecnění zámku)
- fronty zpráv
- monitor
- podmínková proměnná
- tzv. rwlock
Pro uvedená synchronizační primitiva platí, že jsou vzájemně ekvivalentní – tedy že pokud máte k dispozici jedno z nich, můžete s jeho pomocí implementovat ostatní. S výjimkou zámků to lze navíc dokázat bez aktivního čekání: na implementaci pomocí zámků potřebujete spolupráci plánovače procesů (možnost uspat program a později ho probudit) nebo aktivně čekat (stačí jeden „zámkový server“ neustále prohlížející oblasti sdílené paměti a interpretující je jako zprávy. Ostatní procesy pak mohou čekat na zámcích, které vlastní a uvolní právě tehdy, když jim vyřizuje zprávu.) Pro implementaci semaforů pomocí front zpráv procesu potřebujete „semaforový server“ starající se o semafor, ale ten čeká pasivně. Pro fronty pojmenované server nepotřebujete.
Zámek a semafor
[editovat | editovat zdroj]Zámky a semafory bývají implementovány operačním systémem pomocí atomických operací na sdílené paměti a plánovače. Pro synchronizaci v paralelním programování stačí atomické operace na sdílené paměti (čekají na sebe procesy na různých procesorech a tedy mohou čekat aktivně) a je možné je implementovat i bez pomoci operačního systému.
Fronty zpráv
[editovat | editovat zdroj]Fronty zpráv jsou primitivní operací v případě paralelního programování, ale je možné je implementovat v operačním systému i na jednom procesoru.
Monitor
[editovat | editovat zdroj]Monitor je možné realizovat pouze s podporou programovacího jazyka.
Programování
[editovat | editovat zdroj]V běžné programátorské praxi se přetřásá především synchronizace nad objekty sídlícími v paměti programu; objekty dostupné skrze systémování volání synchronizuje operační systém, programování jehož komponent běžný programátor neprovádí. Při vylučování souběhu operací s objekty v paměti programu se synchronizují vlákna.
Synchronizace vláken, jejíž schéma lze použít i pro synchronizaci programů,[1] se popisuje tak, že sled instrukcí, který při vyloučení souběhu konkurenčními entitami nesmí být přerušen, se označuje jako kritická sekce, a synchronizace se řeší tak, že kritická sekce se zastřeší synchronizačním primitivem, na jehož začátku je entita zpracovávající data v případě, kdy se v kritické sekci nachází jiná, tzv. zablokována; aplikované synchronizační primitivum se nazývá zámek. Ve vysokoúrovňových programovacích jazycích pro synchronizační primitiva existují sofistikované jazykové konstrukce, které výrazně zpřehledňují zdrojový kód; výbava takových jazyků zpravidla obsahuje taktéž implementace komplikovanějších zámků, kdy se entity vyznačují specifickým přístupem a není nutné vylučovat souběh každé dvojice z nich (typicky těch, které pouze čtou), což je žádoucí s ohledem na výkon celého výpočetního systému.
Java
[editovat | editovat zdroj]Ve vysokoúrovňovém programovacím jazyce Java, jenž je značně populární, lze kritickou sekci vložit do složené závorky uvozené klíčovým slovem synchronized
, po němž bezprostředně následuje identifikátor objektu, nad nímž se synchronizace má provádět, dále lze za synchronizovanou vydat celou metodu, načež se jako objekt synchronizace použije jeho instance, a konečně je jako vyžadující synchronní přístup možné označit atribut třídy — pak je synchronizace omezena jen na něj.[2]
Synchronizovaný atribut třídy:
class Foo {
…
protected synchronized int foo;
…
}
Synchronizovaný blok — objektem synchronizace je vlastní instance třídy (this
):
protected void foo() {
…
synchronized(this) {
…
}
…
}
Synchronizovaná metoda:
protected synchronized void foo() {
…
}
Reference
[editovat | editovat zdroj]V tomto článku byl použit překlad textu z článku Synchronization (computer science) na anglické Wikipedii.
- ↑ Zjednodušeně řečeno, z pohledu operačního systému je mezi procesem a vláknem rozdíl jen v tom, že vlákna jednoho procesu sdílejí paměťový prostor (mohou si vzájemně přepisovat data).
- ↑ Požadavky na vzájemné blokování entit zpracovávajících data je v zájmu výkonu žádoucí minimalizovat nejen co do okruhu zúčastněných entit, nýbrž také co do rozsahu objektů, nad nimiž se synchronizace provádí.
Související články
[editovat | editovat zdroj]Externí odkazy
[editovat | editovat zdroj]- Obrázky, zvuky či videa k tématu synchronizace na Wikimedia Commons