Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi N - Z > Sistemi operativi I
 
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?

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate