Monitory

Z FAV wiki
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(doplnění ukázkového kódu)
 
(Není zobrazeno 5 mezilehlých verzí od 4 uživatelů.)
Řá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 im-
+
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
−
plementovanou 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 aktivní pouze jeden proces; ostatní jsou při pokusu o vstup do monitoru pozastaveny.
+
* 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.
 +
 +
 +
== 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.


Pozor, pokud by signál pouze vzbudil proces, běžely by v monitoru dva. Možná řešení:

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.


Osobní nástroje
Jmenné prostory
Varianty
Akce
Navigace
Nástroje