Otázka č. 15 - Meziprocesová komunikace
Zadání: vysvětlení pojmu · základní komunikační prostředky + popis · roura, soket, fronta zpráv a vzdálené volání procedur
Co je IPC
IPC (Inter-Process Communication) = výměna dat mezi procesy nebo vlákny.
- Může probíhat na jednom počítači i mezi počítači v síti.
- Slouží k efektivnímu využití více jader / procesorů.
- Umožňuje koordinaci a dělení úloh mezi procesy.
Proč je IPC důležité
- Umožňuje rozdělit náročné výpočty na více paralelních úloh.
- Procesy mohou spolupracovat a sdílet výsledky.
- Zajišťuje efektivní využití výpočetních prostředků.
- Umožňuje modularitu - systém se dá poskládat z menších samostatných procesů.
Proč to není triviální
- Každý proces má vlastní logický adresový prostor a správa paměti mu brání sáhnout mimo něj. To je dobře (ochrana), ale znamená to, že si dva procesy nemůžou jen tak předat data ukazatelem - komunikaci musí zprostředkovat jádro.
- Vlákna jednoho procesu IPC nepotřebují - sdílejí paměť přímo. Potřebují ale synchronizaci (viz otázka č. 14).
Způsoby komunikace
- Zasílání zpráv (
send/receive) - data kopíruje jádro - Synchronizace - koordinace pořadí (semafory, mutexy)
- Sdílená paměť - procesy sdílí stejné rámce
- Vzdálené volání procedur (RPC)
Dělení podle vlastností
Podle adresace:
- Přímá - zpráva se posílá konkrétnímu procesu (
send(P, zpráva)). Procesy o sobě musí vědět. - Nepřímá - zpráva se posílá do schránky / portu, odkud si ji někdo vyzvedne. Odesílatel a příjemce se nemusí znát a jedna schránka může mít víc účastníků.
Podle struktury dat:
- Proudová (stream) - souvislý sled bajtů bez hranic zpráv (roura, TCP soket)
- Zprávová (message-based) - přenášejí se oddělené zprávy se zachovanou hranicí (fronta zpráv, UDP)
Podle směru přenosu:
- jednosměrná (roura, signál)
- obousměrná (soket, RPC)
- všesměrová (broadcast, sběrnice zpráv)
Podle rychlosti:
- Pomalá - signály, fronty zpráv
- Střední - roury, sokety
- Rychlá - sdílená paměť
Podle blokování:
- Blokující (synchronní) -
sendčeká, dokud zprávu někdo nepřevezme,receivečeká na zprávu (tzv. rendezvous) - Neblokující (asynchronní) - operace se vrátí hned, zpráva se uloží do fronty
Komunikační prostředky
1. Soubor
- Nejsnadnější varianta - jeden proces zapisuje, druhý čte.
- Používá se dočasný soubor.
- Nevýhody: bezpečnost (k souboru se dostane kdokoliv s právy), problém se souběžným přístupem (nutné zamykání souboru) a pomalost (jde přes disk).
- Vylepšením je paměťově mapovaný soubor (
mmap) - soubor se namapuje do LAP a pracuje se s ním jako s pamětí.
2. Signály
- Krátké zprávy mezi procesy ve smyslu „něco se stalo“ - něco jako softwarové přerušení.
- Nepřenášejí data, jen svoje číslo, tedy pouze notifikaci.
- Např.
SIGINT(Ctrl+C),SIGTERM(slušné ukončení),SIGKILL(nelze odchytit ani ignorovat),SIGSEGV(neplatný přístup do paměti). - Proces si může nastavit vlastní obslužnou rutinu (handler), jinak platí výchozí chování.
- Hodí se pro řízení, ne pro přenos dat.
Pozn.: signál nejde poslat jen potomkovi. Poslat ho může jakýkoliv proces, pokud na to má práva (stejný uživatel, nebo root) - třeba příkazem
kill PID. Na příbuzné procesy je omezená nepojmenovaná roura, viz níže.
3. Roura (pipe)
- Jednosměrný datový kanál - jeden proces zapisuje, druhý čte. Typu FIFO.
- Používá se hlavně v UNIXu.
- Nepojmenovaná (anonymní) - jen mezi příbuznými procesy (rodič a potomek), protože se předává zděděným deskriptorem. Zaniká spolu s procesy.
- Pojmenovaná (FIFO) - má jméno v souborovém systému, takže ji můžou použít libovolné procesy, i nepříbuzné. Existuje nezávisle na nich.
- Roura je proudová - nezachovává hranice zpráv, přenáší jen sled bajtů.
- Klasické použití je zřetězení příkazů v shellu:
ls | grep txt | wc -l- standardní výstup jednoho procesu je standardním vstupem druhého.
4. Soket (socket)
- Aktivní komunikační prostředek - koncový bod obousměrné komunikace.
- Adresa je rozdělená na adresu a port: adresa ur čuje počítač, port konkrétní službu / proces na něm.
- Jediný prostředek z tohoto seznamu, který funguje i mezi různými počítači.
- Typy podle protokolu:
- UDP - nespojovaný, nespolehlivý, bez záruky doručení a pořadí, ale rychlý a bez režie. Zprávová komunikace.
- TCP - spojovaný, spolehlivý, garantované doručení i pořadí. Proudová komunikace.
- Lokální soket (UNIX domain socket) - v rámci jednoho stroje, adresou je cesta v souborovém systému. Data jdou přes vyrovnávací paměti jádra v RAM, takže je výrazně rychlejší než síťový soket.
- Typicky se používá v modelu klient - server: server naslouchá na portu, klient se připojuje.
5. Fronta zpráv (message queue)
- Organizovaný způsob výměny zpráv. Zpráva má hlavičku a tělo - hlavička nese typ / prioritu, tělo vlastní data.
- Proces zprávu vloží do fronty, příjemce si ji vyzvedne. Nemusí přitom běžet současně - zpráva ve frontě počká.
- Na rozdíl od roury zachovává hranice zpráv a příjemce si může vybírat podle typu.
- Čtení může být blokující, pokud ve frontě žádná zpráva není. Stejně tak zápis, když je fronta plná.
6. Sdílená paměť
- Dva (a víc) procesy sdílí stejný paměťový prostor - jádro jim namapuje stejné rámce do jejich LAP (viz otázka č. 12).
- Nejrychlejší způsob IPC - po namapování probíhá komunikace obyčejným zápisem a čtením do paměti, jádro už do ní vůbec nezasahuje. Data se nekopírují.
- Je nutné zajistit synchronizaci, např. pomocí MUTEXu nebo semaforu - jinak vznikne souběh.
- Nevýhoda: funguje jen v rámci jednoho počítače.
- V UNIXu
shmget/shmatneboshm_open+mmap, ve Windows file mapping.
7. Vzdálené volání procedur (RPC)
- Proces zavolá funkci, která se provede na jiném (vzdáleném) stroji. V kódu to přitom vypadá jako obyčejné volání funkce.
- Přenáší se parametry i návratová hodnota.
- Obousměrná, zprávově orientovaná komunikace.
- Zajišťuje to stub (pahýl) na obou stranách: klientský stub zabalí parametry do zprávy (marshalling), pošle ji, serverový stub je rozbalí, zavolá skutečnou funkci a pošle výsledek zpět.
- Musí řešit rozdílnou reprezentaci dat (endianita) a selhání sítě.
- Příklad: náročný výpočet provede jiný, výkonnější server.
- RMI je objektová varianta v Javě. Moderními nástupci jsou gRPC, REST a SOAP.
Problémy IPC
- Synchronizace - u sdílené paměti si ji procesy musí zajistit samy, jinak vzniká souběh.
- Uváznutí - dva procesy čekají na zprávu, kterou si mají navzájem poslat.
- Ztráta zprávy nebo pád účastníka - kdo pošle zprávu procesu, který mezitím skončil, může čekat věčně. Řeší se potvrzováním a timeouty.
- Bezpečnost - komunikační kanál je potenciální cesta dovnitř procesu, proto mají fronty a sdílené oblasti přístupová práva a přijatá data se musí ověřovat.