UNIX 12. Komunikace mezi procesy © Milan Keršláger
Účely komunikace ● Inter-Process Communication (IPC) ● multiprogramování – úloha je rozdělena na více samostatných úloh, aby mohly být zpracovávány odděleně – je nutné zajistit synchronizaci, signalizaci a výměnu dat ● clustery – výpočty probíhají na oddělených počítačích – je nutné zajistit synchronizaci, signalizaci a výměnu dat při využití počítačové sítě
Meziprocesová komunikace ● soubor ● sdílená paměť ● mapování souborů do paměti ● signály ● zasílání zpráv ● roura ● pojmenovaná roura ● IPC socket ● zamykání souborů
Soubor ● nejjednodušší výměna dat mezi procesy ● dočasné soubory ● v unixových systémech v adresáři /tmp, /var/tmp – všichni mají právo zápisu → mohou si vzájemně škodit ● používá se sticky bit → nelze si vzájemně mazat i přes „w“ ● i tak vyžaduje vytváření dočasných souborů speciální zacházení ● zejména u privilegovaných procesů je riziko poměrně velké ● též problém souběhu → náhodné názvy, zamykání ● komunikace je však poměrně těžkopádná ● velká režie (zápis na HDD) ● mají však všechny systémy → přenositelnost
Sdílená paměť ● procesy jsou normálně odděleny ● kromě threadů, které mají sdílenou paměť záměrně ● sdílená paměť je shodná s částí jiného procesu ● při zápisu problém souběhu – řeší se zamykáním, synchronizačními primitivy ● funkce pro ovládání definuje POSIX – definuje vytvoření, připojení, získání ukazatele – pak zápisy i čtení, odpojení, zrušení sdílené paměti – zaručuje přenositelnost
Mapování souborů do paměti ● původně metoda nahrazující klasické operace ● otevření, čtení, zápis, posun ukazatele, zavření – nevýhodou je neustále kopírování dat mezi cache, bufferem a paměťovým prostorem procesu ● využívá mechanismu „výpadku stránky“ – odkládání nepoužívaných částí paměti na disk – využíváno u stránkování paměti ● lze využít i pro meziprocesovou komunikaci ● namapovaný soubor může být sdílen více procesy ● samozřejmě je nutné řešit souběh atp.
Signály ● jednoduchá meziprocesová komunikace ● implementováno v jádře OS ● asynchronní signalizace mezi procesy – v unixových OS může odesílat signál i jádro OS ● lze poslat jen vlastním procesům – správce (root) může poslat signál všem procesům ● proces zpracovává signál vyvoláním procedury – implicitní akce, ignorování signálu, vlastní obsluha signálu – ne všel lze předefinovat (KILL bohužel, resp. naštěstí nejde) – při zpracování volat jen bezpečné funkce (! reentrantnost) ● odesláním signálu systémovým voláním kill()
Syscall: kill() ● název podle signálu KILL ● signály odlišeny názvy, ty mapovány na čísla – HUP – „zavěšení“ + ukončení, dnes rekonfigurace – INT – přerušení (z terminálu CTRL+c) – QUIT – ukončení + core dump – KILL – nepodmíněné ukončení procesu („vražda“) ● nelze ve stavu D (proces je v jádře, čeká na dokončení I/O) – SEGV – porušení ochrany paměti – PIPE – signalizace rozpadu roury (ukončení skupiny) – TERM – slušná žádost o ukončení procesu – STOP – pozastavení procesu – CONT – obnovení běhu procesu
Příkaz kill ● zasílání signálů z příkazového řádku ● kill -l → vypíše seznam signálů + jejich čísla ● kill – zaslání signálu TERM (žádost o ukončení) – je číslo procesu – signál lze posílat jen svým procesům, root může všem ● kill -1 nebo kill -HUP – dnes někdy znovunačtení konfigurace (rekonfigurace) ● kill -9 nebo kill -KILL – bezpodmínečné ukončení procesu
Zasílání zpráv ● univerzálnější, než signály ● mezi procesy lze přenášet i data ● implementace v jádře nebo jako sdílená paměť ● řešení mezních situací ● synchronní a asynchronní ● jednosměrné, obousměrné ● spolehlivý přenos nebo bez záruk – nutnost implementovat fronty, potvrzování zpráv ● řešení duplikace, ztráty, příjemce skončil atd.
Kolona (roura) ● propojení příbuzných procesů ● propojení přes deskriptory – jednosměrné spojení (jeden zapisuje, druhý čte) ● vytváří se skupina procesů – jádro posílá při přerušení roury signál SIGPIPE – skupina reaguje ukončením („broken pipe“) ● v paměti kruhový vyrovnávací paměť – buffer ● typicky se využívá v příkazovém řádku grep ro /etc/passwd | sort
Pojmenovaná roura ● umožňuje spojení nepříbuzných procesů ● definuje POSIX ● styčné místo je speciální soubor typu roura – název lze nějak předat nepříbuzným procesům – vytvořená pojmenovaná roura „přežije“ ukončení procesů ● data vyměňována v paměti (buffer) ● pouze jednosměrná komunikace (FIFO) – jeden proces zapisuje, další čte
IPC socket ● též tzv. Unix Domain Socket, definuje POSIX ● speciální soubor, ale implementováno v RAM ● obdoba síťové komunikace – od roury přidává obousměrnou komunikaci – navíc možnost více klientů ● například PostgreSQL server + klient – /tmp/.s.PGSQL.5432 – klient otevře a připojí se
Zamykání souborů ● pro zabránění souběhu ● v unixových systémech jen informativní (advisory) – i když je na soubor aplikován zámek, jádro ho nevynutí – všechny programy musí zámky respektovat – funkce fcntl() a flock() → též na části souboru ● sdílené zámky – též nazývány jako zámky pro čtení ● exkluzivní zámky – též nazývány jako zámky pro zápis ● souborové zámky
Souborové zámky ● soubor signalizující zamčeno ● např. /etc/shadow.lock – znamená: někdo si mění heslo, tak počkáme – někdy název včetně PID procesu, který ho vytvořil ● opět jde o záležitost respektu, jádro nevynucuje ● používá se ve shellu a na FS bez podpory zámků – např. starší verze NFS bez lock démona ● vytvoření musí být atomická operace – v shellu „noclobber“ nebo vytvoření adresáře – v zásadě poměrně komplikovaná logika – problém „opuštěných zámků“ (anglicky: stale lock file)