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
editovatSynchronizač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
editovatZá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
editovatFronty 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
editovatMonitor je možné realizovat pouze s podporou programovacího jazyka.
Programování
editovatV 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
editovatVe 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
editovatV 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
editovatExterní odkazy
editovat- Obrázky, zvuky či videa k tématu synchronizace na Wikimedia Commons