osservando l'immagine a seguito
http://img32.imageshack.us/img32/9739/imglpp.jpg
e basandosi sul testo sottolineato in rosso
il senso ᅵ :
che se ho S = 10 (10 risorse disponibili ad esempio)
e i processi che vogliono accedervi sono 16 (P = 16)
allora potro' soddisfare solo 10 processi, mentre gli altri 6 restano in
attesa....e mentre restano in attesa vengono posti in una lista.
Ora basandomi sul contenuto dei due IF
in WAIT c'e' S->valore < 0 ma non dovrebbe essere S->valore = 0 ?
Ossia zero risorse disponibili?
in SIGNAL c'e' S->valore <= 0 ma non dovrebbe essere S->valore > 0 ?
Ossia risorse disponibili?
grazie!
No, perchè S->valore viene decrementato e può diventare negativo.
Se hai un semaforo con valore iniziale 10 e ci sono 16 processi che
vogliono usare la risorsa associata al semaforo, i primi dieci
processi porteranno S=0, l'undicesimo S=-1, il dodicesimo S=-2, quindi
dal decimo processo in poi il valore del semaforo sarà negativo.
Quindi è lecito S < 0.
Per intenderci: considera un semaforo inizialmente S = 1.
Un processo richiama la wait() ed S viene decrementato.
A quel punto S = 0, ma *quel* processo non deve bloccarsi. Devono
bloccarsi i processi che arriveranno dopo di lui (se lui non ha
rilasciato la risorsa ovviamente).
> in SIGNAL c'e' S->valore <= 0 ma non dovrebbe essere S->valore > 0 ?
> Ossia risorse disponibili?
Discorso inverso al precedente.
Se S < 0, qualcuno ha tentato di usare una risorsa occupata. S = 0
indica invece una risorsa usata da tutti i processi possibili ma non
bloccante.
Esempio di poco fa: inizi con S = 1.
Un processo può usare la risorsa.
P1 wait() -> S = 0. Fin qui ok. Processo P1 non bloccato.
P2 wait() -> S = -1. Processo P2 bloccato.
P1 signal() -> S = 0. Se è diventato zero vuol dire che ERA negativo,
e c'erano quindi processi bloccati. Quindi S = 0 deve risvegliare un
processo.
> grazie!
Di niente.