Sdílená paměť je nejrychlejším prostředkem výměny dat mezi procesy [1] .
V jiných nástrojích inter-process communication ( IPC ) probíhá komunikace mezi procesy přes jádro , což má za následek přepnutí kontextu mezi procesem a jádrem, tzn. ke ztrátám výkonu [2] .
Technika sdílené paměti umožňuje výměnu informací prostřednictvím segmentu sdílené paměti pro procesy bez použití systémových volání jádra. Segment sdílené paměti je připojen k volné části virtuálního adresního prostoru procesu [3] . Dva různé procesy tak mohou mít různé adresy stejného umístění sdílené paměti.
Po vytvoření segmentu sdílené paměti jej může kterýkoli z uživatelských procesů připojit ke svému vlastnímu virtuálnímu prostoru a pracovat s ním jako s běžným segmentem paměti. Nevýhodou takové výměny informací je absence jakýchkoli prostředků synchronizace, k překonání této nevýhody lze však použít semaforovou techniku .
Ve schématu výměny dat mezi dvěma procesy ( klient a server ) pomocí sdílené paměti musí fungovat skupina dvou semaforů. První semafor se používá k blokování přístupu ke sdílené paměti, jeho signál povolení je 1 a signál odmítnutí je 0. Druhý semafor se používá k signalizaci serveru, že klient zahájil práci, zatímco přístup ke sdílené paměti je blokován a klient čte data z paměti. Nyní, když je operace volána serverem, její práce bude pozastavena, dokud klient neuvolní paměť.
V softwaru se sdílená paměť nazývá:
Protože oba procesy mohou přistupovat k oblasti sdílené paměti jako k normální paměti, je to velmi rychlý způsob komunikace (na rozdíl od jiných mechanismů IPC, jako jsou pojmenované kanály , UNIX sockety nebo CORBA ). Na druhou stranu je tato metoda méně flexibilní, například komunikující procesy musí běžet na stejném stroji (z uvedených metod IPC mohou po síti komunikovat pouze síťové sokety, nezaměňovat se sokety UNIX domény) a je třeba dbát na to, aby se předešlo problémům při používání sdílené paměti na různých jádrech procesoru a hardwarové architektuře bez koherentní mezipaměti .
Komunikace ve sdílené paměti se používá například k přenosu obrázků mezi aplikací a X serverem na systémech Unix nebo v rámci objektu IStream vráceného CoMarshalInterThreadInterfaceInStream v knihovně Windows COM.
Sdílené knihovny jsou obvykle načteny do paměti jednou a mapovány napříč více procesy a duplikovány jsou pouze stránky, které jsou specifické pro jeden proces (protože některá ID se liší), obvykle mechanismem známým jako copy-on-write , který při pokusu o zápis do sdílené paměti, tiše do procesu volajícího zápis, zkopíruje stránky paměti a poté zapíše data do této kopie.
V operačních systémech podobných UNIXPOSIX poskytuje standardizované API pro práci se sdílenou pamětí, POSIX Shared Memory . Jednou z klíčových vlastností operačních systémů rodiny UNIX je mechanismus kopírování procesů (systémové volání fork()), který umožňuje vytvořit anonymní oblasti sdílené paměti před zkopírováním procesu a zdědit je potomky. Po zkopírování procesu bude sdílená paměť dostupná pro nadřazený i podřízený proces. [3] [4]
Existují dva různé přístupy k připojení a používání sdílené paměti:
UNIX System V poskytuje sadu funkcí jazyka C, které vám umožňují pracovat se sdílenou pamětí [7] :
Pojmenovaná sdílená paměť znamená, že každé paměťové místo je v rámci operačního systému spojeno s jedinečným číselným klíčem, který lze později použít k připojení sdílené paměti v jiném procesu. [osm]
POSIX sdílená paměťPOSIX vám umožňuje přidružit deskriptor souboru k objektu sdílené paměti , což je jednotnější mechanismus než UNIX System V. K manipulaci s pamětí lze použít následující funkce jazyka C:
V operačním systému Windows se k vytvoření sdílené paměti používají funkce CreateFileMappinga MapViewOfFile[13] z MSDN .
Podpora v programovacích jazycíchNěkteré knihovny C++ nabízejí přístup ke sdílené paměti napříč platformami . Například knihovna Boost poskytuje třídu boost::interprocess::shared_memory_object[14] pro operační systémy kompatibilní s POSIX a knihovna Qt poskytuje třídu QSharedMemory, která sjednocuje přístup ke sdílené paměti napříč operačními systémy s určitými omezeními [15] .
V Javě 7 pod operačním systémem GNU/Linux lze sdílenou paměť implementovat mapováním souboru z adresáře /dev/shm/(nebo /run/shm/, v závislosti na distribuci) do paměti [16] pomocí metody maptřídy java.nio.MappedByteBuffer[17] .
Podpora sdílené paměti byla implementována v mnoha dalších programovacích jazycích . PHP tedy poskytuje API [18] pro vytváření sdílené paměti, jehož funkce jsou podobné funkcím POSIX .
Meziprocesová komunikace | |
---|---|
Metody | |
Vybrané protokoly a standardy |