Souběžné programování je programovací paradigma v úvahu, v rámci programu, existence několika významových baterií, které lze nazvat závity , procesy nebo úkoly . Ve stroji se zhmotňují pomocí prováděcího zásobníku a sady soukromých dat.
Konkurence je zásadní, pokud chcete psát programy, které interagují se skutečným světem (což je konkurent), nebo využívat více centrálních jednotek (spojených, jako v systému s více procesory, nebo distribuovaných, případně v mřížce nebo klastru).
Existují tři typy soutěží:
Souběžné programování je složitější a obtížnější než imperativní , funkční nebo dokonce deklarativní programování . Ve skutečnosti lze každý z těchto programovacích modelů přidružit k souběžné verzi rozšířením sémantiky přidruženého programovacího jazyka. Například Prolog byl rozšířen na Concurrent Prolog, Haskell s Concurrent Haskell, Java a Ada jsou objektové jazyky s primitivy pro souběžnost atd.
Specifické techniky řešení souběžnosti lze kategorizovat od nejméně expresivních (ale nejsnadněji použitelných) po nejvýraznější (a složitější). Lze použít následující úrovně:
Ústředním jevem zavedeným souběžností je následující: v nekonkurenčním nebo sekvenčním programu je pořadí provádění elementárních instrukcí programu celkové pořadí, které pro stejné vstupní parametry zůstává stejné od jednoho provedení k druhému. V souběžném programu tvoří provedení částečné pořadí. Vzhledem k tomu, plánovací politikou je obecně znám (je dána jádrem z operačního systému, například), nebo nekontrolovaná, mluvíme o indeterminismu objednávky provedení.
Problémy vyvolané konkurencí se projevují v případech konkurenční a kooperativní soutěže. Z důvodu neurčitosti provádění může přístup k datům sdíleným konkurenčními entitami vést k nesrovnalostem ve vztazích mezi těmito daty. K tomu jsme historicky používali různá synchronizační primitiva, jako jsou mutexy , monitory nebo semafory . Tyto různé primitivy jsou více či méně pokročilou formou zamykání, která se používá k nastavení synchronizace souběžných entit (na prostředku nebo obecněji v kritické části). Jejich použití však není bezproblémové, existují zejména dva hlavní problémy:
Byly vyvinuty abstrakce na vyšší úrovni, aby měly expresivitu souběžnosti bez nevýhod spojených s použitím primitiv synchronizace na nízké úrovni.
Pro každý typ souběžného programování jsou k dispozici abstrakce na vysoké úrovni, které usnadňují psaní souběžných programů.
V případě procesů soutěžících o sdílené zdroje byl pojem transakce vyvinut v 70. letech. Transakční systémy, používané hlavně pro sdílené databáze , jsou založeny na teorii serializovatelnosti pro zajištění přístupu. Konkurent se sdílenými zdroji (souběžnost typu 4 a 5 ). Transakční paměti software (STM) je snaha aplikovat tento model transakční obecněji v každé transakci s pamětí, má několik výhod oproti tradičním přístupem pomocí zámků a nedávno zažil velkou obrodu zájmu.
V případě kooperativních procesů s ohledem na společný cíl se osvědčily minimálně dvě techniky: meziprocesová komunikace využívající výhradně zasílání zpráv a synchronizace toku dat , tj. „Dynamické plánování vláken podle dostupnosti dat (pomocí speciálních proměnných budoucího typu nebo logické proměnné ). Programovací jazyky Erlang nebo Oz umožňují psát souběžné a distribuované aplikace, přičemž zvláštní pozornost je věnována problémům se zpracováním výjimek . Erlang a Oz využívají principu odesílání zpráv a Oz také nabízí synchronizaci toku dat .