![]() |
Show 150 posts per page |
.dsy:it. (http://www.dsy.it/forum/)
- Sistemi operativi I (http://www.dsy.it/forum/forumdisplay.php?forumid=269)
-- Implemetare semeaforo generalizzato con monito (http://www.dsy.it/forum/showthread.php?threadid=42827)
Implemetare semaforo generalizzato con monitor
Ciao a tutti,
ho bisogno di un aiuto per implementare un semaforo generalizzato attraverso un monitor. Bruschi spesso lo mette nel compitino e dato che a lezione non mi sono chiarito completamente le idee volevo sapere se ho fatto giusto.
monitor semaforo
int sem
condition semaphore
#DOWN
sem = sem -1
if (sem < 0) then wait(semaphore)
#UP
sem = sem +1
if (sem <= 0) then signal(semaphore)
quindi uso la variabile intera sem come contatore e se ha un valore negativo significa che c'è qualche processo in coda altrimenti se >=0 significa che è libero quindi alzo il semaforo.
Potete confermarmi se ho capito bene?
Grazie
più o meno sì,
il valore sem è quello che avrebbe il semaforo, la coda (contare sotto lo zero) ti serve perchè altrimenti perdi i processi in attesa dopo il primo in quanto daresti un solo signal.
pid -- val sem -- esito
P0 -> 0 -> permesso
P1 -> -1 -> wait
P2 -> -2 -> wait
end P0 -> -1 -> signal a P1
end P1 -> 0 -> signal a P2
end P2 -> 1 -> monitor libero
se dopo "end P0" arrivasse un altro processo P3 verrebbe messo in coda in quanto sem è -1.
Se invece non andassi sotto lo zero, al primo signal(quello di P0 a P1) incrementeresti sem che andrebbe a 1 nonostante ci siano ancora processi in coda.
L'arrivo del processo P3 in questo caso causerebbe probabilmente un'invasione di zombie.
La up, non dovrebbe essere implementata così:
code:
if (sem < 0) then signal(semaphore) else sem++;
All times are GMT. The time now is 20:39. | Show all 3 posts from this thread on one page |
Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.