Operační systémy 9. Spolupráce mezi procesy Obsah: © Milan Keršláger http://www.pslib.cz/ke/slajdy 15. 12. 2010 http://creativecommons.org/licenses/by-nc-nd/3.0/
Spolupráce mezi procesy využívána při multitaskingu tj. současný běh více úloh využíváme při multiprogramování programátor využije multitasking zjednodušení naprogramování příslušné úlohy rozdělení na procesy zjednodušuje programování využití více jader procesorů
Příklady spolupráce systray (ikony, oznamovací oblast) síťová aplikace pošle zprávu appletu applet zobrazí bublinu (nový e-mail, IM zpráva) renderování scény v 3D hře arbitr přiděluje práci výpočetním procesům zároveň synchronizace s pohybem hráče ovládání GUI správce oken sleduje pohyb myši informace o pohybu či kliknutí posílá aplikacím
Komunikace mezi procesy zajišťuje několik činností synchronizace čekání na událost v druhém procesu vzájemné informování o postupu výpočtu signalizace jednoduchá asynchronní komunikace proces reaguje spuštěním obsluhy signálu výměna dat vysoké nároky na flexibilitu (specifické požadavky) pomocí výměny dat lze realizovat prakticky cokoliv
Mechanismy spolupráce zasílání zpráv flexibilní, s daty nebo bez dat i mezi různými počítači (např. cluster) sdílená paměť silnější nástroj, (neomezené) možnosti knihovny → jednoduchá implementace některé OS podporují oba mechanismy lze však implementovat i dodatečně knihovní fce umožňují zjednodušení, přenositelnost
Signály jde o asynchronní oznámení události realizace jako jednoduché zprávy (bez přenosu dat) jádro přeruší provádění procesu vyvolána obsluha signálu implicitní obsluha v jádře OS proces definuje vlastní obsluhu (proceduru) oblíbené pro manipulaci s procesy ukončení procesu (slušné, násilné, chybou) znovunačtení (změněné) konfigurace
Signály v Unixu propojení na řídící znaky terminálu může být změněno příkazem stty CTRL+c → SIGINT → implicitně ukončení procesu CTRL+z → SIGTSTP → pozastavení procesu CTRL+\ → QUIT → ukončení + zápis core ošetření výjimek (standardně ukončení + core) SIGFPE → dělení nulou SIGSEGV → porušení ochrany paměti signalizace od jádra SIGPIPE → po ukončení procesu, který čte z roury
Použití signálů v Unixu systémové volání jádra – kill() knihovní funkce z programu nebo příkaz kill pro daný proces (PID) nebo pro skupinu procesů definice handleru proces sám definuje obsluhu signálu ignorování nebo procedura (vlastní nebo implicitní) není-li definována, tak implicitní handler nelze pro SIGKILL a SIGSTOP problémy souběh, globální proměnné, non-reentrantní funkce
Zasílání zpráv velmi flexibilní lze předávat v rámci 1 systému, ale i přes síť zasílání zpráv použito i u sběrnice PCI, PCIe umístění zprávy sdílená paměť → předání ukazatele buffer, fronta zpráv možné problémy + ošetření chyb ztráta nebo duplicita zprávy zkomolení zprávy jeden z procesů skončí
Odlišnosti zasílání zpráv počet participujících procesů dva nebo více → způsob vytváření spojení vlastnosti spojení kapacita spojení (kolik nezpracovaných) při nulové se odesílatel blokuje nebo se zpráva ztratí → nutnost kombinovat se synchronizačními prostředky omezená a neomezená kapacita velikost zpráv – pevná, proměnná duplex – jednosměrnost, obousměrnost synchronní, asynchronní – bez čekání na odpověď
Sdílená paměť velmi flexibilní programátor si může přizpůsobit dle svých potřeb funkce pro ovládání → syscall, knihovny definuje vytvoření, připojení, získání ukazatele pak zápisy i čtení, odpojení, zrušení sdílené paměti zaručení přenositelnosti vzniká problém souběhu dnes typický problém multitasking, vícejádrové systémy
Problém souběhu dva (i více) procesů mění stejná data při samostatném přístupu se problém neprojeví problémem je neatomická operace první proces upravuje sekvenčně data dojde ke změně kontextu na druhý proces druhý proces čte nekonzistentní data řešíme zamykáním zámky jsou knihovní funkce → univerzální použití též možnost atomické funkce + serializace
Thready běžné procesy jsou v paměti odděleny thready sdílí společnou paměť při zápisu čehokoliv do paměti je problém souběhu řeší se zamykáním, synchronizačními primitivy nebo oddělené proměnné pro každý thread chyba v jednom threadu ovlivní ostatní typicky ukončení všech threadů problém pluginů v prohlížečích chyba ve Flashi → pád celého prohlížeče vyvedení pluginu do samostatného procesu → výkon!