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.
Programování
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ší tzv. 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
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
- ↑ 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í.
V tomto článku byl použit překlad textu z článku Synchronization (computer science) na anglické Wikipedii.
