Monitory
Z FAV wiki
(Rozdíly mezi verzemi)
| Řádka 1: | Řádka 1: | ||
Monitor je synchronizační primitivum, které se používá pro řizeni přístupu ke sdíleným prostředkům. Jeho zvláštností | 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 | + | 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 | 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. | udělá chybu. | ||
| Řádka 9: | Řádka 8: | ||
* Monitory musí umět rozpoznat překladač a přeložit je do odpovídajícího kódu | * 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 | * 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 | + | * 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 | * Monitory poskytují speciální typ proměnné nazývané podmínka | ||
* Podmínky mohou být definovány a použity pouze uvnitř monitoru | * Podmínky mohou být definovány a použity pouze uvnitř monitoru | ||
| Řádka 15: | Řádka 14: | ||
** 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.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 | ** 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. | ||
Verze z 29. 8. 2011, 19:33
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.