Synchronizace (informatika)

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

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

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á. +more 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. +more 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

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

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

Monitor je možné realizovat pouze s podporou programovacího jazyka.

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ů, 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. +more 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.

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

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top