Monitory

Z FAV wiki
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Založena nová stránka: Monitor je synchronizacni primitivum, ktere se pouziva pro rizeni pristupu ke sdilenym prostredkum. Jeho zvlastnosti je, ze jde o specialni konstrukci programovaciho jazyka...)
 
(doplnění ukázkového kódu)
 
(Není zobrazeno 7 mezilehlých verzí od 4 uživatelů.)
Řádka 1: Řádka 1:
−
Monitor je synchronizacni primitivum, ktere se pouziva pro rizeni pristupu ke sdilenym prostredkum. Jeho zvlastnosti
+
Monitor je synchronizační primitivum, které se používá pro řizeni přístupu ke sdíleným prostředkům. Jeho zvláštností
−
je, ze jde o specialni konstrukci programovaciho jazyka (musi ho tedy implementovat prekladac), 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 pomoci jineho synchronizacniho primitiva. Vyhodou monitoru oproti jinym 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
−
vysokourovnovost { snadneji se pouziva a je bezpecnejsi. Pri jeho pouziti je mene pravdepodobne, ze programator
+
udělá chybu.
−
udela 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
+
* Monitor je speciální typ modulu, ve kterém jsou sdružena data a procedury, které s nimi mohou manipulovat
−
· Procesy mohou volat procedury monitoru, ale nemohou přímo přistupovat k datům monitoru
+
* Monitory musí umět rozpoznat překladač a přeložit je do odpovídajícího kódu
−
· V monitoru může být v jednu chvíli aktivní pouze jeden proces; ostatní jsou při pokusu o vstup do monitoru pozastaveny.
+
* Procesy mohou volat procedury monitoru, ale nemohou přímo přistupovat k datům monitoru
−
· Monitory poskytují speciální typ proměnné nazývané podmínka
+
* V monitoru může být v jednu chvíli AKTIVNÍ pouze jeden proces; ostatní jsou při pokusu o vstup do monitoru pozastaveny.
−
· Podmínky mohou být definovány a použity pouze uvnitř monitoru
+
* Monitory poskytují speciální typ proměnné nazývané podmínka
−
· Nad podmínkami jsou definovány dvě operace:
+
* Podmínky mohou být definovány a použity pouze uvnitř monitoru
−
- c.wait
+
* Nad podmínkami jsou definovány dvě operace:
−
volající bude pozastaven nad podmínkou c
+
** c.wait - volající bude pozastaven nad podmínkou c. Pokud je některý proces připraven vstoupit do monitoru, bude mu to dovoleno
−
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
+
Pozor, pokud by signál pouze vzbudil proces, běžely by v monitoru dva.
−
pokud nad podmínkou nespí žádný proces, nedělá nic
+
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