Klasické problémy meziprocesové komunikace – producent-konzument aj.
Z FAV wiki
(Rozdíly mezi verzemi)
(→Producent-konzument) |
|||
| Řádka 35: | Řádka 35: | ||
** Producent musí být schopen čekat na konzumenta, je-li buffer plný | ** Producent musí být schopen čekat na konzumenta, je-li buffer plný | ||
| + | Klasicky se zde sdílená paměť řeší pomocí pole, kde se z jedné strany položky přidávají a z druhé odebírají. Index kam zapisovat/odebírat počítáme modulo velikost pole. Kolizím zabráníme pomocí dvou semaforů, kde jeden obsahuje informaci o počtu plných prvků pole (f) a druhý o počtu prázdných prvků (e). | ||
| + | * přidání prvku: P(e), V(f) | ||
| + | * odebrání prvku: P(f), V(e) | ||
== Problém večeřících filosofů == | == Problém večeřících filosofů == | ||
Verze z 29. 8. 2011, 19:05
Meziprocesova komunikace: // tady by to chtělo rozvést a doplnit...
- Predavani zprav
- Primitiva send, receive
- Mailbox, port
- RPC
- Ekvivalence semaforu, zprav, ...
- Bariera, problem vecericich filozofu
Problem sdilene pameti
- Uvedene mechanismy
- umisteni objektu ve sdilene pameti
- Nekdy neni vhodne
- Bezpecnost - globalni data pristupna kteremukoliv procesu bez ohledu na semafor
- Nekdy neni mozne
- Procesy bezi na ruznych strojich, komunikuji spolu po siti Reseni { predavani zprav
Predavani zprav
- send, receive
- Zavedeme 2 primitiva
- send (adresat, zprava) - odeslani zpravy
- receive(odesilatel, zprava) - prijem zpravy
- Send Zprava (lib. datovy objekt) bude zaslana adresatovi
- Receive Prijem zpravy od urceneho odesilatele Prijata zprava se ulozi do promenne "zprava\
Producent-konzument
- Dva procesy sdílejí společnou paměť (buffer) pevné velikosti N položek
- Jeden proces je producent - generuje nové položky a ukládá je do vyrovnávací paměti
- Paralelně běží proces konzument, který data vyjímá a spotřebovává
- Procesy mohou běžet různými rychlostmi => musí být zabezpečeno, aby nedošlo k přetečení/podtečení:
- Konzument musí být schopen čekat na producenta, nejsou-li data
- Producent musí být schopen čekat na konzumenta, je-li buffer plný
Klasicky se zde sdílená paměť řeší pomocí pole, kde se z jedné strany položky přidávají a z druhé odebírají. Index kam zapisovat/odebírat počítáme modulo velikost pole. Kolizím zabráníme pomocí dvou semaforů, kde jeden obsahuje informaci o počtu plných prvků pole (f) a druhý o počtu prázdných prvků (e).
- přidání prvku: P(e), V(f)
- odebrání prvku: P(f), V(e)
Problém večeřících filosofů
- 5 filosofů sedí kolem kulatého stolu
- Každý filosof má před sebou talíř se špagetami
- Mezi každými dvěma talíři je vidlička
- Špagety jsou tak klouzavé, že filosof potřebuje 2 vidličky, aby mohl jíst
- Když filosof dostane hlad, pokusí se vzít 2 vidličky; pokud uspěje, nějakou dobu jí, pak položí vidličky a pokračuje v přemýšlení
- Problémy: uvíznutí (všichni filozofové zvednou levou vidličku, žádný z nich už nemůže pokračovat), vyhladovění (pokud by filozofové vzali najednou levou vidličku, budou běžet cyklicky - vidí, že pravá není volná, položí…)
- Řešení - Dijkstra (pomocí semaforů)
Problém čtenářů a písařů
- Představme si velkou databázi, množina procesů se pokouší souběžně číst a zapisovat
- Více požadavků čtení - akceptovatelné
- Při zápisu nesmí nikdo jiný přistupovat, ani žádní čtenáři
- První čtenář, který dostane přístup do databáze, provede P(w), další pouze zvětšují čítač
- Po skončení čtenáři zmenšují čítač, poslední provede V(w)
- Semafor w zabrání vstupu písaře, pokud jsou čtenáři
- Semafor w také zabrání vstupu čtenářům, je-li písař