Semafory, jejich použití a implementace
Semafor = proměnná, obsahuje nezáporné celé číslo
Semaforu, lze přiřadit hodnotu pouze při deklaraci
Nad semafory pouze operace P(s) a V(s):
- Operace P(S): pokud S>0, sníží S o 1, jinak pozastaví proces
- Operace V(S): pokud je nad semaforem S zablokovaný jeden nebo více procesů, vzbudí jeden z nich (náhodně), jinak zvýší S o 1
Operace P i V jsou nedělitelné (atomické) akce, tj. jakmile započne akce nad semaforem, nikdo k němu nemůže přistoupit. Když se několik procesů pokouší přistoupit současně ke stejnému semaforu, operace se provedou sekvenčně v libovolném pořadí.
Vzájemné vyloučení pomocí semaforů:
- Vytvoříme semafor s počáteční hodnotou 1
- Před vstupem do KS voláme P(s), po vystoupení V(s)
- Je-li libovolný proces v KS, je s=0, jinak s=1
Implementace
- Procesům poskytneme možnost se pozastavit při operaci P
- Aktivace operací V
S každým semaforem s je sdruženo:
- Celočíselná proměnná s.c, dovolíme jí nabývat i záporných hodnot, pak absolutní hodnota s.c vyjadřuje počet blokovaných procesů
- Binární semafor s.mutex (mutual exclusion) pro vzájemné vyloučení při operaci nad semaforem
- Seznam blokovaných procesů s.L
Proces, který nemůže dokončit operaci P bude zablokován a uložen do seznamu blokovaných procesů. Pokud při operaci V není seznam prázdný, vybere se ze seznamu jeden proces a odblokuje se.
Pozor, mutex není binární semafor. Mutex může na rozdíl od semaforu odemknout pouze vlákno, které ho zamklo.