Implemetare semeaforo generalizzato con monito Clicca QUI per vedere il messaggio nel forum |
carlo88 |
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 :? |
Kons |
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. |
delca85 |
La up, non dovrebbe essere implementata così:
code: if (sem < 0) then signal(semaphore)
else sem++;
?
Sicuramente sono io a non aver capito bene, ma io la farei così perché altrimenti, se un processo, che era in coda, prende il controllo del monitor, ha comunque incrementato il valore del semaforo, anche se non è più "verde".
E' una stupidaggine? |
|
|
|