Monitory
(doplnění ukázkového kódu) |
|||
| (Nejsou zobrazeny 4 mezilehlé verze od 4 uživatelů.) | |||
| Řádka 21: | Řádka 21: | ||
V Javě jsou monitory implementovány pomocí klíčového slova synchronized. Zde je problém více vláken v monitoru vyřešen tak, že čekající může běžet až poté, co proces volající signál opustí monitor. | V Javě jsou monitory implementovány pomocí klíčového slova synchronized. Zde je problém více vláken v monitoru vyřešen tak, že čekající může běžet až poté, co proces volající signál opustí monitor. | ||
| + | |||
| + | |||
| + | == Monitor - závozník == | ||
| + | <pre> | ||
| + | //stav skladu | ||
| + | int pivo = 10; | ||
| + | int vino = 100; | ||
| + | cond c1, c2; //podmínkové proměnné | ||
| + | |||
| + | getPivo(){ | ||
| + | while(pivo < 1){ | ||
| + | wait(c1); | ||
| + | } | ||
| + | pivo--; | ||
| + | } | ||
| + | |||
| + | zavozPiva(){ | ||
| + | pivo++; | ||
| + | signal(c1); | ||
| + | } | ||
| + | |||
| + | zavozPiva(pocet){ | ||
| + | pivo = pivo + pocet; | ||
| + | broadcast(c1); //vzdudí všechny čekající na pivo | ||
| + | } | ||
| + | |||
| + | getVino(){ | ||
| + | ...analogicky.. | ||
| + | } | ||
| + | zavozVina(){ | ||
| + | ...analogicky.. | ||
| + | } | ||
| + | zavozVina(pocet){ | ||
| + | ...analogicky.. | ||
| + | } | ||
| + | </pre> | ||
| + | Je-li počet čekajících na pivo větší než počet zavezených piv, tak se jen vzbudí a znovu uspí => neefektivní! | ||
| + | |||
| + | Implementace monitoru v programovacím jazyce C je realizována pomocí MUTEXu + podmínkových proměnných. | ||
| + | |||
| + | {{fav-kiv-bzinf}} | ||
| + | |||
| + | |||
| + | [[Kategorie:fav-kiv-bzinf]] | ||
Aktuální verze z 10. 6. 2014, 09:32
Monitor je synchronizační primitivum, které se používá pro řizeni přístupu ke sdíleným prostředkům. Jeho zvláštností je, že jde o speciální konstrukci programovacího jazyka (musí ho tedy implementovat překladač), typicky implementovanou pomocí jineho synchronizačního primitiva. Výhodou monitoru oproti jiným primitivum je jeho vysokoúrovňovost - snadněji se používá a je bezpečnější. Při jeho použití je méně pravděpodobné, že programátor udělá chybu.
- Monitor je speciální typ modulu, ve kterém jsou sdružena data a procedury, které s nimi mohou manipulovat
- Monitory musí umět rozpoznat překladač a přeložit je do odpovídajícího kódu
- Procesy mohou volat procedury monitoru, ale nemohou přímo přistupovat k datům monitoru
- V monitoru může být v jednu chvíli AKTIVNÍ pouze jeden proces; ostatní jsou při pokusu o vstup do monitoru pozastaveny.
- Monitory poskytují speciální typ proměnné nazývané podmínka
- Podmínky mohou být definovány a použity pouze uvnitř monitoru
- Nad podmínkami jsou definovány dvě operace:
- c.wait - volající bude pozastaven nad podmínkou c. Pokud je některý proces připraven vstoupit do monitoru, bude mu to dovoleno
- c.signal - pokud existuje jeden nebo více procesů pozastavených nad podmínkou c, reaktivuje jeden z pozastavených procesů, tj. bude mu dovoleno pokračovat v běhu uvnitř monitoru pokud nad podmínkou nespí žádný proces, nedělá nic
Pozor, pokud by signál pouze vzbudil proces, běžely by v monitoru dva. Možná řešení:
- Hoare - proces volající c.signal se pozastaví a vzbudí se až poté co předchozí rektivovaný proces opustí monitor nebo se pozastaví
- Hansen - Signal smí být uveden pouze jako poslední příkaz v monitoru. Po volání signal musí proces opustit monitor
V Javě jsou monitory implementovány pomocí klíčového slova synchronized. Zde je problém více vláken v monitoru vyřešen tak, že čekající může běžet až poté, co proces volající signál opustí monitor.
[editovat] Monitor - závozník
//stav skladu
int pivo = 10;
int vino = 100;
cond c1, c2; //podmínkové proměnné
getPivo(){
while(pivo < 1){
wait(c1);
}
pivo--;
}
zavozPiva(){
pivo++;
signal(c1);
}
zavozPiva(pocet){
pivo = pivo + pocet;
broadcast(c1); //vzdudí všechny čekající na pivo
}
getVino(){
...analogicky..
}
zavozVina(){
...analogicky..
}
zavozVina(pocet){
...analogicky..
}
Je-li počet čekajících na pivo větší než počet zavezených piv, tak se jen vzbudí a znovu uspí => neefektivní!
Implementace monitoru v programovacím jazyce C je realizována pomocí MUTEXu + podmínkových proměnných.